【问题标题】:Protractor - Where to use browser.waitForAngular()量角器 - 在哪里使用 browser.waitForAngular()
【发布时间】:2015-09-02 03:53:50
【问题描述】:

我有一些使用量角器为 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();
    };
};

在一些规范文件中,我像这样使用这个页面对象..

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 有没有关于如何使用它的最佳实践?

【问题讨论】:

    标签: javascript angularjs testing protractor angularjs-e2e


    【解决方案1】:

    来自量角器的documentation

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

    你根本不应该调用这个,我想不出一个你应该调用的有效案例。

    【讨论】:

    • 我有这个用例,在刷新后测试页面上所做的更改。进行更改 -> 单击保存(不会导致任何页面刷新) -> 刷新 -> 测试重新加载的页面。在这种情况下,会在保存功能完成之前触发刷新,从而导致页面上出现不必要的浏览器警报。在触发页面刷新之前,我必须使用 waitForAngular()。
    • 好吧,如果您通过调用browser.refresh 进行刷新,它应该等待上一个操作自动完成。我只是看了一下代码,验证了it does(如果你没有关闭同步功能的话)。也许你发现了一个错误 - 如果是这种情况,你可以在 protractor's github page 中提出问题。
    • 我正在与角度异步加载数据。使用 waitForAngular 我可以测试组件。否则量角器会在尚未收到数据时进行检查
    【解决方案2】:

    你应该处理click返回的promise,而不是使用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 Protractor 测试套件的state/page-object version

    【讨论】:

    • 这对我不起作用。我试过button.click().then(() => {expect(browser.getCurrentUrl()).toEqual(newPageUrl);});,但我仍然得到旧网址。
    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-04-05
      • 1970-01-01
      • 2023-04-04
      • 2020-10-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多