私は人々が使用することを提案する場所を何度も見ました:
browser.ignoreSynchronization=true; // or false
しかし、なぜ必要なのか理解できませんか?
簡単な答えは、分度器がAngularの約束($http
や$timeout
からの約束など)を待たずに解決することです。 $http
または$timeout
(たとえば、「読み込み中」メッセージ)中、または別のログインページなどの非Angularサイトまたはページのテスト中。
たとえば、リクエスト中に読み込みメッセージを設定するボタンをテストするには、要素を取得してその内容を確認するときに、true
に設定します。
element(by.css('button[type="submit"]')).click();
browser.ignoreSynchronization = true;
expect(element(by.css('.message')).getText().toBe('Loading...');
browser.ignoreSynchronization = false;
expect(element(by.css('.message')).getText().toBe('Loaded');
より複雑な答えは、それをtrue
に設定することは、制御フローへの後続の追加/注入もbrowser.waitForAngular
を追加しないことを意味するということです。制御フローを理解し、いつ/どのように物を追加/注入するかが重要な場合があります。たとえば、browser.wait
を使用してマルチステージプロセスをテストしている場合、wait
に渡された関数は制御フローに挿入されますafterの残りの関数テストが制御フローに追加されました。
element(by.css('button[type="submit"]')).click();
browser.ignoreSynchronization = true;
expect(element(by.css('.message')).getText().toBe('Stage 1');
browser.wait(function () {
// This function is added to the control flow after the final
// browser.ignoreSynchronization = false in the test
// so we need to set it again here
browser.ignoreSynchronization = true;
return element(by.cssContainingText('.message', 'Stage 2')).isPresent().then(function(isPresent) {
// Cleanup so later tests have the default value of false
browser.ignoreSynchronization = false;
return !isPresent;
});
});
expect(element(by.css('.message')).getText().toBe('Stage 2');
browser.ignoreSynchronization = false;
expect(element(by.css('.message')).getText().toBe('Stage 3');
browser.ignoreSynchronization
を使用する代わりに、標準のwebdriver APIに直接アクセスすることもできます
element(by.css('button[type="submit"]')).click();
expect(browser.driver.findElement(by.css('.message')).getText().toBe('Loading...');
expect(element(by.css('.message')).getText().toBe('Loaded');
ドライバーメソッドを直接使用して要素を見つけると、システムは$http
を設定するのと同様に、進行中のbrowser.ignoreSynchronization = true
要求が完了するのを待たずに要素を見つけようとします。
この設定は、分度器がページでangularを待つかどうかを制御します。適切に文書化されていませんが、ここに コードの文書化文字列 があります。
/**
* If true, Protractor will not attempt to synchronize with the page before
* performing actions. This can be harmful because Protractor will not wait
* until $timeouts and $http calls have been processed, which can cause
* tests to become flaky. This should be used only when necessary, such as
* when a page continuously polls an API using $timeout.
*
* @type {boolean}
*/
つまり、非角形サイトに対してテストする場合は、ignoreSynchronization
設定をtrue
に設定します。実世界の例として、angularページから非角形ページを開くときに直面した課題の1つを参照してください。 クリック後に開く非角形ページ 。