web-dev-qa-db-ja.com

分度器-browser.waitForAngular()を使用する場所

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の呼び出し先はどこですか?

20
Kasun Kodagoda

分度器から ドキュメント

Angularがレンダリングを終了し、未処理の$ httpまたは$ timeout呼び出しがなくなるまで待機するようにwebdriverに指示します。Protractorは、すべてのWebDriverアクションの前にこのコマンドを自動的に適用します。

あなたはこれを全く呼び出すべきではありません、そして、私はあなたがそうするべき正しいケースを考えることができません。

30
Delian Mitankin

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 Protractorテストスイートのmy state/page-object version を参照してください。

8
avandeursen

Browser.Urlを介して特定のページに移動する前にbrowser.WaitForAngular()を使用しています。そうしないと、テストクリーンアップでアサートしているブラウザーログにエラーが記録されます。

0