Estou tentando automatizar meus testes com Protractor e Appium para um site AngularJS com jasmine framework no simulador de iPad, function sendkeys()
está trabalhando para nome de usuário e senha, mas quando eu clico no botão de login o teste é passado, mas a ação não está feito: nenhum redirecionamento para a página inicial, e nenhum efeito no clique é exibido para o botão de login, tenho certeza de que o elemento está localizado corretamente! porque quando eu espero que o gettext () seja igual a “LOGIN” ele é passado, mas nenhum redirecionamento, mesmo se eu colocar o browser.sleep(8000);
Aqui meu script de teste:
"use strict"; require("jasmine-expect"); var wd = require("wd"); describe('my app', function() { it('should make the login test',function() { // browser.ignoresynchronization=true; browser.get("http://10.0.22.82:8080/jws/fetablet"); expect(browser.getCurrentUrl()).toEqual(("http://10.0.22.82:8080/jws/fetablet/#/login")); element(by.model('credentials.username')).sendKeys('RET02').then(function(){ element(by.model('credentials.password')).sendKeys('RET02').then(function(){ element(by.css('.login-button')).click().then(function(){ browser.sleep(8000); expect(browser.getCurrentUrl()).not.toEqual("http://10.0.22.82:8080/jws/fetablet/#/login"); }); }); }); }); });
Existe outro método para localizar o botão de clique corretamente? Aqui meu código html:
{{lang}}
Eu coloquei os detalhes do gravador Appium sobre o botão de login
Pode haver várias razões para isso e vai ser um jogo de adivinhação de qualquer maneira.
pode ser que exista um outro elemento que corresponda ao localizador do .login-button
e você esteja clicando em um elemento diferente. Vamos melhorar o localizador :
element(by.css(".login-form .login-button")).click();
aguarde o elemento ser clicável :
var EC = protractor.ExpectedConditions; element(by.model('credentials.username')).sendKeys('RET02'); element(by.model('credentials.password')).sendKeys('RET02'); var loginButton = element(by.css('.login-form .login-button')); browser.wait(EC.elementToBeClickable(loginButton), 5000); loginButton.click();
adicionar um pequeno atraso antes de clicar no elemento (bobo, mas eu vejo que ajudou, por vezes):
element(by.model('credentials.username')).sendKeys('RET02'); element(by.model('credentials.password')).sendKeys('RET02'); browser.sleep(500); element(by.css('.login-form .login-button')).click();
outra tentativa boba, clique 2 vezes (eu não posso acreditar que eu realmente aconselho isso):
var loginButton = element(by.css('.login-form .login-button')); loginButton.click(); loginButton.click();
desabilitar animações angulares
clique no botão via browser.actions()
movendo para o elemento antes do clique:
var loginButton = element(by.css('.login-form .login-button')); browser.actions().mouseMove(loginButton).click().perform();
uma espécie de extensão para a abordagem anterior. Mova para o elemento, durma meio segundo e clique em:
browser.actions.mouseMove(loginButton).perform(); browser.sleep(500); loginButton.click();
Ou, se você introduzir uma ação personalizada sleep()
, você pode fazer:
browser.actions.mouseMove(loginButton).sleep(500).click().perform();
clique no elemento via javascript :
var loginButton = element(by.css('.login-form .login-button')); browser.executeScript("arguments[0].click();", loginButton);
E, depois que o formulário for enviado, em vez de browser.sleep()
, você pode esperar que o URL seja alterado explicitamente, consulte:
Como uma nota secundária, no Transferidor, você usa os atalhos $
e $$
para os localizadores de CSS:
var loginButton = $('.login-form .login-button');
Tente executar esses comandos sem usar a cadeia de promises. Pode ser um problema na cadeia anterior.
"use strict"; require("jasmine-expect"); var wd = require("wd"); describe('my app', function() { it('should make the login test',function() { browser.get("http://10.0.22.82:8080/jws/fetablet"); expect(browser.getCurrentUrl()).toEqual(("http://10.0.22.82:8080/jws/fetablet/#/login")); element(by.model('credentials.username')).sendKeys('RET02'); element(by.model('credentials.password')).sendKeys('RET02'); element(by.css('.login-button')).click(); browser.sleep(8000); expect(browser.getCurrentUrl()).not.toEqual("http://10.0.22.82:8080/jws/fetablet/#/login"); });
PS: Você pode evitar usar a function ‘then’ quando não precisar usar o resultado do método. É controlado pelo stream de controle
Eu tenho mais uma sugestão, você pode esperar que um determinado elemento precise ser exibido e limpar a checkbox de texto. Você pode realmente escrever com promise, essa é a melhor maneira.
var loginButton = element(by.css('.md-raised.login-button')); var userName = element(by.model('credentials.username')); var password = element(by.model('credentials.password')); this.username = function(sendUserName) { expect(userName.isDisplayed()).toBeTruthy(); userName.clear().then(function(){ userName.sendKeys(sendUserName).then(function(){ expect(password.isDisplayed()).toBeTruthy(); }); }); }; this.password = function(password) { expect(password.isDisplayed()).toBeTruthy(); password.clear().then(function(){ password.sendKeys(password).then(function(){ browser.wait(EC.elementToBeClickable(loginButton), 10000); }); }); }; this.clickloginbutton = function() { expect(loginButton.isDisplayed()).toBeTruthy(); loginButton.click().then(function(){ expect('something').not.toBeNull(); }); }