A function Click () não está funcionando em scripts transferidores

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}}
This is required.
This is required.
Retry
This is required.
{{error}}
​​ Login
​​
Contact Customer Care
|
Disclaimer

Eu coloquei os detalhes do gravador Appium sobre o botão de login

Inspetor de Appium

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:

  • Transferidor – espera genérica por URL para alterar

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(); }); }