量角器 - 在哪里使用browser.waitForAngular()

时间:2015-06-17 05:01:57

标签: javascript angularjs testing protractor angularjs-e2e

我使用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是否有关于如何使用它的最佳做法?

3 个答案:

答案 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()。 否则,我会在测试清除中主张的浏览器日志中出现错误。