我使用protractor为angular.js app编写了一些测试。我正在使用Page Objects
设计模式,我有一些方法可以通过点击链接和按钮导航到其他页面。不久之后我打电话给browser.waitForAngular()
。
页面对象
module.exports = function () {
this.companyNameLink = element(by.id('viewCompany'));
this.newMeetingButton = element(by.id('newMeetingButton'));
this.createNewGeneralMeeting = function () {
this.newMeetingButton.click();
browser.waitForAngular();
};
this.goToCompanyPage = function () {
this.companyNameLink.click();
browser.waitForAngular();
};
};
在某些规范文件中,我使用此页面对象..
var DashboardPage = require('../dashboardPageObject.js');
dashboardPage = new DashboardPage();
...
dashboardPage.goToCompanyPage();
但问题是有时我得到angular could not be found on the window
错误而我的测试失败了。大多数时候测试运行。这个问题是随机的。我的问题是,我应该从页面对象方法中删除browser.waitForAngular()
并在我按此方法调用之后调用它...
已修改的网页对象
...
this.goToCompanyPage = function () {
this.companyNameLink.click();
};
...
规范文件
dashboardPage.goToCompanyPage();
browser.waitForAngular();
调用browser.waitForAngular()
会导致问题吗?我应该在哪里致电waitForAngular
是否有关于如何使用它的最佳做法?
答案 0 :(得分:29)
来自量角器' documentation:
指示webdriver等到Angular完成呈现并且在继续之前没有未完成的$ http或$ timeout调用。请注意,Protractor会在每次WebDriver操作之前自动应用此命令。
你根本不应该打电话给我,我想不出你应该做的有效案例。
答案 1 :(得分:8)
您应该处理waitForAngular
返回的承诺,而不是使用click
。
因此,首先,您的页面对象方法应该返回这些承诺:
this.goToCompanyPage = function () {
return this.companyNameLink.click();
};
然后,您实际使用此方法可能如下所示:
dashboardPage.goToCompanyPage().then(function() {
// this will be executed when the click is done.
// No need for any waitForAngular.
});
有关其他一些示例,请参阅Angular PhoneCat量角器测试套件的state/page-object version。
答案 2 :(得分:0)
在通过browser.Url导航到特定页面之前,我正在使用browser.WaitForAngular()。 否则,我会在测试清除中主张的浏览器日志中出现错误。