angularjs jasmine protractor appium end-to-end

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



jasmine protractor (4)

Intente ejecutar esos comandos sin usar la cadena de promesa. 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 ''entonces'' cuando no necesite usar el resultado del método. Es controlado por el flujo de control

Estoy tratando de automatizar mis pruebas con Protractor y Appium para un sitio AngularJS con el marco de jazmín 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 supera, pero la acción no se hace: no se redirecciona a la página de inicio y no se muestra ningún efecto de clic para el botón de inicio de sesión, ¡estoy seguro de que el elemento está ubicado correctamente! porque cuando espero que gettext () sea igual a "LOGIN", se pasa pero no se redirecciona, incluso si pongo 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:

​​<div class="lo​​gin_lang"> <md-button class="lang_button" ng-click="changeLang()">{{lang}}</md-button> </div> <div layout="column" flex layout-align="center center" class="md-padding splash-background"> <div class="login-logo"> <img src="{{logoSrc}}"> </div> <form class="login-form" name="loginForm" ng-submit="login()"> <fieldset> <md-input-container class="md-block"> <label translate="login.USERNAME" ng-class="{''floating-label-rtl'':dir===''rtl''}" class="login-label">Username</label> <input required ng-model="credentials.username" ng-focus="onFocus()" type="text"> <div ng-messages="loginForm.credentials.username.$error" ng-show="loginForm.credentials.username.$dirty"> <div ng-message="required" trans ​​late="login.MESSAGE_REQUIRED">This is required.</div> </div> </md-input-container> <md-input-container class="md-block"> <label ​​translate="login.PASSWORD" ng-class="{''floating-label-rtl'':dir===''rtl''}" class="login-label">Password</label> <input required ng-model="credentials.password" ng-focus="onFocus()" type="pa ​​ssword"> <div ng-messages="loginForm.credentials.password.$error" ng-show="loginForm.credentials.password.$dirty"> <div ng-message="required" translate="login.MESSAGE_REQUIRED">This is required.</div> </div> </md-input-container> <div layout-align="center center" layout="column" ng-if="oneTimePassword"> <p class="login-otp-message" translate="login.OTP_MESSAGE">Enter the code which you received by SMS</p> <md-button class="md-warn login-otp-retry" translate="login.OTP_RETRY" ng-click="retry()">Retry</md-button> </div> <md-input-container class="md-block" ng-if="oneTimePassword"> <label translate="login.SECURITY_CODE" class="login-label">Security code</label> <input required ng-model="credentials.securityCode" ng-focus="onFocus()" type="password"> <div ng-messages="loginForm.credentials.securityCode.$error" ng-show="loginForm.credentials.securityCode.$dirty"> <div ng-message="required" translate="login.MESSAGE_REQUIRED">This is required.</div> </div> </md-input-container> <div layout-align="center"> <section layout-align="center" layout="row" layout-sm="column"> <div id="login-error" md-caption class="msg-error" ng-show="error" class="label">{{error}}</div> ​​ <md-button type="submit" class="md-raised login-button" ng-disabled="clicked" translate="login.LOGIN">Login</md-button> </section> ​​ </div> </fieldset> </form> <md-divider></md-divider> <footer class="login-footer"> <div layout="row" layout-align="center center"> <md-button ng-click="goToCustomerCare()" class="login-footer-link" translate="login.CUSTOMER_CARE">Contact Customer Care</md-button> <div> | </div> <md-button ng-click="showDisclaimer()" class="login-footer-link" translate="login.DISCLAIMER">Disclaimer</md-button> </div> </footer> </div>

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


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

  • podría ser que hay otro elemento que coincide 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 a veces ayudó):

    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 intento tonto, haga clic 2 veces (no puedo creer que realmente aconseje eso):

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

  • deshabilitar animaciones angulares

  • haga clic en el botón mediante 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. Mover al elemento, dormir durante medio segundo y luego hacer clic:

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

    O, 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:

Como nota al margen, en Protractor, utiliza los accesos directos $ y $$ para los localizadores CSS:

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


Solo agrego browser.sleep después de que el clic funcionó para mí:

it(''Some test'', function () { element(by.css("button[type=''submit'']")).click(); browser.sleep(1000); });


Tengo una sugerencia más, puede esperar que se muestre un elemento en particular y borrar el cuadro de texto. De hecho, puedes escribir en 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(); }); }