这是我用于单击按钮的代码。在第一页中,我有一个按钮,单击可以将其重定向到下一页。第二页没有加载很长时间,测试失败了
describe('Login', function() {
it('should display Login home', function() {
browser.get('https://xxxxx.org/yyyy/');
browser.driver.manage().window().maximize();
var acrIdBtn = browser.driver.findElement(by.css('a.btn.btn-lg.btn-success'));
acrIdBtn.click().then(function() {
browser.driver.findElement(by.id('ContentPlaceHolder1_MFALoginControl1_UserIDView_txtUserid_UiInput')).click();
});
});
});
HTML代码:
<div class="col-sm-12">
<!-- ngIf: method.label.text !== ' *' && method.input.id.length > 0 --><input tabindex="0" class="form-control ng-pristine ng-scope ng-empty ng-invalid ng-invalid-required ng-touched" id="ContentPlaceHolder1_MFALoginControl1_UserIDView_txtUserid_UiInput" aria-invalid="true" required="" type="text" placeholder="Username" autocomplete="off" ng-if="method.label.text !== ' *' && method.input.id.length > 0" ng-init="AuthMethod.getUser()" focus-if="" ng-disabled="false" ng-change="AuthMethod.getMethodOnChange(method.input.id)" ng-model="AuthMethod.user"><!-- end ngIf: method.label.text !== ' *' && method.input.id.length > 0 -->
<!-- ngIf: AuthMethod.forgotUser.link --><a class="help-block link--color ng-binding ng-scope" href="javascript:__doPostBack('ctl00$ContentPlaceHolder1$MFALoginControl1$UserIDView$ctl00$ContentPlaceHolder1_MFALoginControl1_UserIDView_hlinkUsernameLink','')" ng-if="AuthMethod.forgotUser.link">Forgot User ID</a><!-- end ngIf: AuthMethod.forgotUser.link -->
答案 0 :(得分:1)
因此,首先让我们看一下代码,了解为什么会发生这种情况。
describe('Login', function() {
it('should display Login home', function() {
browser.get('https://xxxxx.org/yyyy/');
browser.driver.manage().window().maximize();
var acrIdBtn = browser.driver.findElement(by.css('a.btn.btn-lg.btn-success'));
// click is thenable, this is okay
acrIdBtn.click().then(function() {
// This promise gets queued but this is a void function meaning. So in jasminwd, the
// function to find the element and click is a void function and the promise
// would not be awaited.
browser.driver.findElement(by.id('ContentPlaceHolder1_MFALoginControl1_UserIDView_txtUserid_UiInput')).click();
});
});
});
因此,快速解决方案是确保回调函数返回了promise:
acrIdBtn.click().then(function() {
// If we return the click, jasminewd should await this callback.
return browser.driver.findElement(by.id('ContentPlaceHolder1_MFALoginControl1_UserIDView_txtUserid_UiInput')).click();
这似乎仍然依赖于控制流。附带说明一下,我建议使用配置文件中的SELENIUM_PROMISE_MANAGER: false,
并使用async等待来退出控制流。有关配置文件和async / await的一个很好的示例,请参见Protractor in STS IDE -> Could not find update-config.json。
describe('Login', () => {
it('should display Login home', async () => {
await browser.get('https://xxxxx.org/yyyy/');
await browser.driver.manage().window().maximize();
// If you are using "element" but do not want to use wait for angular
// think about using "await waitForAngularEnabled(false);"
// If you prefer to use the WebDriver findElement version, then you could just keep it the same.
// const acrIdBtn = browser.driver.findElement(by.css('a.btn.btn-lg.btn-success'));
const acrIdBtn = element(by.css('a.btn.btn-lg.btn-success'));
await acrIdBtn.click();
const contentBtn = element(by.id('ContentPlaceHolder1_MFALoginControl1_UserIDView_txtUserid_UiInput'));
await contentBtn .click();
});
});
答案 1 :(得分:0)
首先检查可单击的按钮总是很好:
const button = element(by.id('ContentPlaceHolder1_MFALoginControl1_UserIDView_txtUserid_UiInput'));
await browser.wait(ExpectedConditions.elementToBeClickable(button));
await button.click();