我正在尝试使用Protractor和Appium在iPad模拟器中使用jasmine框架对AngularJS站点进行自动化测试,sendkeys()函数正在用于用户名和密码,但是当我点击登录按钮时,测试通过,但是操作没有完成:没有重定向到主页,并且没有为登录按钮显示点击效果,我确定该元素位置正确!因为当我希望gettext()等于“LOGIN”时,它会被传递但是没有重定向,即使我把browser.sleep(8000);
这是我的测试脚本:
这是我的测试脚本:
"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"); }); }); }); }); });
<div class="login_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>
我把关于登录按钮的Appium记录器的详细信息
解决方法
这可能有多种原因,无论如何它都将是一个猜谜游戏.
>可能有一个与.login按钮定位器匹配的另一个元素,而您正在单击另一个元素.让我们改进定位器:
element(by.css(".login-form .login-button")).click();
> wait for the element to be clickable:
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();
>在点击元素之前添加一个小延迟(愚蠢,但我有时会看到帮助):
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();
>另一个愚蠢的尝试,点击2次(我不敢相信我实际建议):
var loginButton = element(by.css('.login-form .login-button')); loginButton.click(); loginButton.click();
> disable angular animations
>点击按钮,通过browser.actions()
移动到点击前的元素:
var loginButton = element(by.css('.login-form .login-button')); browser.actions().mouseMove(loginButton).click().perform();
>对前一种方法的扩展.移动到元素,睡眠半秒然后单击:
browser.actions.mouseMove(loginButton).perform(); browser.sleep(500); loginButton.click();
或者,如果你愿意introduce a custom sleep()
action,你可以这样做:
browser.actions.mouseMove(loginButton).sleep(500).click().perform();
>单击元素via javascript:
var loginButton = element(by.css('.login-form .login-button')); browser.executeScript("arguments[0].click();",loginButton);
并且,在提交表单后,您可以等待URL明确更改,而不是browser.sleep(),请参阅:
> Protractor- Generic wait for URL to change
作为旁注,在Protractor中,您使用$
and $$
shortcuts作为CSS定位器:
var loginButton = $('.login-form .login-button');