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

Kas*_*oda 22 javascript testing angularjs angularjs-e2e protractor

我有一些使用protractor for angular.js应用程序编写的测试.我正在使用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();
    };
};
Run Code Online (Sandbox Code Playgroud)

在一些spec文件中,我使用这样的页面对象..

var DashboardPage = require('../dashboardPageObject.js');
dashboardPage = new DashboardPage();

...

dashboardPage.goToCompanyPage();
Run Code Online (Sandbox Code Playgroud)

但问题是有时我得到angular could not be found on the window错误,我的测试失败了.大多数时候测试运行.这个问题是随机的.我的问题是,我应该browser.waitForAngular()从页面对象方法中删除并在我进行方法调用后调用它...

修改了页面对象

...
this.goToCompanyPage = function () {
    this.companyNameLink.click();
};
...
Run Code Online (Sandbox Code Playgroud)

规格文件

dashboardPage.goToCompanyPage();
browser.waitForAngular();
Run Code Online (Sandbox Code Playgroud)

呼叫browser.waitForAngular()导致问题?我应该在哪里打电话waitForAngular有关于如何使用它的最佳做法?

Del*_*kin 32

从量角器的文档:

指示webdriver等到Angular完成渲染并且在继续之前没有未完成的$ http或$ timeout调用.请注意,Protractor会在每次WebDriver操作之前自动应用此命令.

你根本不应该打电话给我,我想不出你应该做的有效案例.


ava*_*sen 8

而不是使用waitForAngular,你应该处理由返回的承诺click.

因此,首先,您的页面对象方法应该返回这些承诺:

this.goToCompanyPage = function () {
    return this.companyNameLink.click();
};
Run Code Online (Sandbox Code Playgroud)

然后,您实际使用此方法可能如下所示:

dashboardPage.goToCompanyPage().then(function() {
  // this will be executed when the click is done.
  // No need for any waitForAngular.
});
Run Code Online (Sandbox Code Playgroud)

有关其他示例,请参阅Angular PhoneCat Protractor测试套件的状态/页面对象版本.