La función Click () no funciona en scripts de transportador

Estoy tratando de automatizar mis pruebas con Protractor y Appium para un sitio AngularJS con framework jasmine en el simulador de iPad, la función sendkeys() funciona para nombre de usuario y contraseña, pero cuando hago clic en el botón de inicio de sesión la prueba se pasa, pero la acción no está hecho: no hay redirección a la página de inicio, y no se muestra el efecto de clic para el botón de inicio de sesión, ¡estoy seguro de que ese elemento está ubicado correctamente! porque cuando espero que gettext () sea igual a “LOGIN”, se pasa pero no hay redirección incluso si puse browser.sleep(8000); Aquí mi script de prueba:

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

¿Hay otro método para ubicar el botón de clic correctamente? Aquí mi código html:

 ​​
{{lang}}
Contact Customer Care
|
Disclaimer

Puse los detalles de la grabadora Appium sobre el botón de inicio de sesión

Inspector de Appium

    Puede haber múltiples razones para eso y de todos modos va a ser un juego de adivinanzas.

    • podría ser que haya otro elemento que coincida con el .login-button y esté haciendo clic en un elemento diferente. Mejoremos el localizador :

       element(by.css(".login-form .login-button")).click(); 
    • espere a que se pueda hacer clic en el elemento :

       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(); 
    • agregue un pequeño retraso antes de hacer clic en el elemento (tonto, pero veo que ayudó a veces):

       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(); 
    • Otro bash tonto, haz clic 2 veces (no puedo creer que realmente lo aconseje):

       var loginButton = element(by.css('.login-form .login-button')); loginButton.click(); loginButton.click(); 
    • desactivar animaciones angulares

    • haga clic en el botón a través de browser.actions() moviéndose al elemento antes del clic:

       var loginButton = element(by.css('.login-form .login-button')); browser.actions().mouseMove(loginButton).click().perform(); 
    • una especie de extensión al enfoque anterior. Mueve al elemento, duerme durante medio segundo y luego haz clic en:

       browser.actions.mouseMove(loginButton).perform(); browser.sleep(500); loginButton.click(); 

      O bien, si introduce una acción personalizada sleep() , puede hacer:

       browser.actions.mouseMove(loginButton).sleep(500).click().perform(); 
    • haga clic en el elemento a través de javascript :

       var loginButton = element(by.css('.login-form .login-button')); browser.executeScript("arguments[0].click();", loginButton); 

    Y, después de enviar el formulario, en lugar de browser.sleep() , puede esperar a que la URL cambie explícitamente, consulte:

    • Protractor: espera genérica de URL para cambiar

    Como nota al margen, en Prolongador, usa los accesos directos $ y $$ para los localizadores de CSS:

     var loginButton = $('.login-form .login-button'); 

    Intente ejecutar esos comandos sin usar la cadena de promesas. Puede ser un problema en la cadena 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"); }); 

    PD: puede evitar el uso de la función ‘luego’ cuando no necesite usar el resultado del método. Es controlado por el flujo de control

    Tengo una sugerencia más, puede esperar que se muestre un elemento en particular y borrar el cuadro de texto. De hecho, puedes escribir con promesa, esa es la mejor manera.

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