web-dev-qa-db-ja.com

分度器のbrowser.ignoreSynchronizationとは何ですか?

私は人々が使用することを提案する場所を何度も見ました:

browser.ignoreSynchronization=true;  // or false

しかし、なぜ必要なのか理解できませんか?

57

簡単な答えは、分度器が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要求が完了するのを待たずに要素を見つけようとします。

77
Michal Charemza

この設定は、分度器がページで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つを参照してください。 クリック後に開く非角形ページ

18
alecxe