我是Protractor的新手,我正在尝试为一个非常简单的场景编写测试用例:转到登录页面并提交表单,重定向到仪表板页面,然后单击仪表板上的搜索按钮。登录部分工作正常:
页/ login.js:
'use strict';
var LoginPage = function () {
this.email = element(by.css('#email'));
this.password = element(by.css('#password'));
this.submit = element(by.css('[type="submit"]'));
expect(this.email.isPresent()).toBe(true, 'Email field not found');
expect(this.password.isPresent()).toBe(true, 'Password field not found');
expect(this.submit.isPresent()).toBe(true, 'Submit button not found');
};
module.exports = new LoginPage();
测试spec.js:
it('should log in', function () {
console.log('Logging into Application.');
browser.get('https://example.com/auth/login');
var loginPage = require('./pages/login');
loginPage.email.sendKeys('myemail@example.com');
loginPage.password.sendKeys('mypassword');
loginPage.submit.click();
console.log('Waiting to be redirected to the dashboard page...');
return browser.driver.wait(function () {
return browser.driver.getCurrentUrl().then(function (url) {
return /dashboard/.test(url);
});
}, 30000);
});
然而,当我尝试找到搜索按钮并点击它时......
页/ dashboard.js:
'use strict';
var DashboardPage = function () {
var elementFromSecondPage = $('a[href*="/property/search"]');
console.log('trying to wait for element to be visible: ' + elementFromSecondPage);
browser.wait(protractor.until.elementIsVisible(elementFromSecondPage), 60000, 'Error: Element did not display within 1 minute');
console.log('done waiting');
console.log('trying to find this.search element');
this.search = element(by.css('a[href*="/property/search"]'));
console.log('this.search: ' + this.search);
expect(this.search.isPresent()).toBe(true, 'Search button not found');
};
module.exports = new DashboardPage();
测试spec.js:
it('should go to search', function () {
console.log('Going to the Search page.');
var dashboardPage = require('./pages/dashboard');
dashboardPage.search.click();
});
尝试查找搜索按钮时,错误:
登录上游。
等待重定向到仪表板页面...
转到搜索页面。
试图等待元素可见:[object Object]
完成等待
试图找到this.search元素
this.search:[object Object]
失败:1)angularjs上游添加列表应该去搜索消息:失败:超时等待异步角度任务在11秒后完成。这可能是因为当前页面不是Angular应用程序。有关详细信息,请参阅常见问题解答:https://github.com/angular/protractor/blob/master/docs/timeouts.md#waiting-for-angular在等待带定位符的元素时 - 定位器:By(css选择器,[href * =“/ property / search”])
以下是我正在搜索的元素的html:
<a routerlinkactive="active" class="caret rpr-labeled-button rpr-labeled-button-search-alt active" href="/property/search">
...
</a>
我尝试了许多不同的解决方案来尝试等待仪表板页面及其DOM加载,但无论如何我仍然会收到此错误。这很令人困惑,因为如果你看看上面的输出,当我做一个jQuery找到它成功加载元素,所以它显然在那里。
答案 0 :(得分:1)
这个问题最终成为了@Gunderson所建议的。 Angular正在进行连续(轮询)网络调用,因此Protractor从未将其视为“完成”加载。因此,无论我等多久,每个查找元素调用都会超时。
作为黑客,我使用此命令禁用等待:
browser.waitForAngularEnabled(false);
然而,如果它没有特别等待Angular应用程序,那么使用Protractor而不是另一个测试框架有什么意义呢?然后,我们更改了我们正在测试的Web应用程序,以便在对其运行测试时禁用轮询(通过登录页面上的查询字符串参数),然后一切都开始运行良好。
答案 1 :(得分:0)
所有browser.wait()
都会安排一个等待条件的命令。您表明您的JQuery选择器$('a[href*="/property/search"]');
正在努力获取该元素。 可能的解决方法是创建自己的函数,该函数具有自己的超时,并将使用该选择器查找元素并返回布尔值true,一旦找到元素,或者在超时时返回false。
function waitForElem(){
//JQuery timeout logic here
if(elementFound){ return true}
else{//after some time interval
return false;
}
}
然后在你的Protractor代码中仍然使用browser.wait()
browser.wait(waitFormElem(), 60000, 'Error: Element did not display within 1 minute');
我为伪代码道歉,但我真的不知道JQuery,看起来你这样做了,我觉得你已经足够了解实现那个逻辑
答案 2 :(得分:0)
您可以使用此库: https://www.protractortest.org/#/api?view=ProtractorExpectedConditions 有几个选项可以让等待元素可见,可点击,包含一些文本,检查最适合你的内容。我通常会将元素看得像这样:
{{1}}