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
の呼び出し先はどこですか?
分度器から ドキュメント :
Angularがレンダリングを終了し、未処理の$ httpまたは$ timeout呼び出しがなくなるまで待機するようにwebdriverに指示します。Protractorは、すべてのWebDriverアクションの前にこのコマンドを自動的に適用します。
あなたはこれを全く呼び出すべきではありません、そして、私はあなたがそうするべき正しいケースを考えることができません。
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 を参照してください。
Browser.Urlを介して特定のページに移動する前にbrowser.WaitForAngular()を使用しています。そうしないと、テストクリーンアップでアサートしているブラウザーログにエラーが記録されます。