Javascript 量角器-使用browser.waitForAngular()的位置

Javascript 量角器-使用browser.waitForAngular()的位置,javascript,angularjs,testing,protractor,angularjs-e2e,Javascript,Angularjs,Testing,Protractor,Angularjs E2e,我使用angular.js应用程序的量角器编写了一些测试。我使用的是页面对象设计模式,我有一些方法可以通过单击链接和按钮导航到其他页面。不久之后,我将调用browser.waitForAngular() 页面对象 module.exports = function () { this.companyNameLink = element(by.id('viewCompany')); this.newMeetingButton = element(by.id('newMeetingB

我使用angular.js应用程序的量角器编写了一些测试。我使用的是
页面对象
设计模式,我有一些方法可以通过单击链接和按钮导航到其他页面。不久之后,我将调用
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();
    };
};
...
this.goToCompanyPage = function () {
    this.companyNameLink.click();
};
...
在一些规范文件中,我使用这个页面对象,如下

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

...

dashboardPage.goToCompanyPage();
但问题是,有时在窗口上找不到
角度,导致测试失败。大多数情况下,测试都会运行。这个问题是随机的。我的问题是,我是否应该从page对象方法中删除
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();
    };
};
...
this.goToCompanyPage = function () {
    this.companyNameLink.click();
};
...
规范文件

dashboardPage.goToCompanyPage();
browser.waitForAngular();
调用
browser.waitForAngular()
是否导致问题?我应该在哪里调用
waitForAngular
有关于如何使用此功能的最佳实践吗?

来自量角器:

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


你根本不应该打电话给我,我想不出一个你应该打电话给我的有效案例。

你应该处理
点击
返回的承诺,而不是使用
waitForAngular

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

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量角器测试套件的my。

在通过browser.Url导航到特定页面之前,我正在使用browser.WaitForAngular()
否则,我将在浏览器日志中获得错误,我将在测试清理中断言该错误。

我有这个用例,如中所示,测试刷新后在页面上所做的更改。进行更改->单击保存(不会导致任何页面刷新)->刷新->测试重新加载的页面。在这种情况下,在保存功能完成之前会触发刷新,导致页面上出现不必要的浏览器警报。在触发页面上的刷新之前,我必须使用waitForAngular()。如果通过调用
browser.refresh
进行刷新,它应该等待上一个操作自动完成。我只是查看了代码并验证了这一点(如果没有关闭同步功能)。也许你发现了一个bug——如果是这样的话,你可以在中提交一个问题。使用waitForAngular,我可以测试组件。否则,量角器将在尚未收到任何数据时进行检查。这对我不起作用。我尝试了
按钮。单击()。然后(()=>{expect(browser.getCurrentUrl()).toEqual(newPageUrl);})但我仍然得到旧的url。