量angular器中的browser.ignoreSynchronization是什么?

我曾多次看到人们build议使用的地方:

browser.ignoreSynchronization=true; // or false 

但我不明白为什么我们需要它?

简单的答案是,它使得量angular器不会等待Angular promise,例如$http$timeout那些promise,如果您在$http$timeout期间testing行为,您可能会想要做这些操作(例如,“loading “消息),或testing非Angular网站或页面(例如单独的login页面)。

例如,要testing在请求期间设置加载消息的button,可以在获取元素时将其设置为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表示后续添加/注入控制stream不会添加browser.waitForAngular 。 有些情况下,理解控制stream程,什么时候/如何添加/注入是很重要的。 例如,如果您使用browser.waittesting多阶段进程,那么在testing中的其余function添加到控制stream之后 ,传递给wait的函数将被注入到控制stream中。

 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器是否应等待页面上的angular度。 它没有正确logging,但是这里是代码的文档string :

 /** * 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} */ 

换句话说,如果您正在对非angular度站点进行testing,请将ignoreSynchronization设置为true 。 作为一个真实世界的例子,看到我从一个angular度页面打开一个非angular度页面时遇到的挑战之一: 点击后打开非angular度页面 。