量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.wait
testing多阶段进程,那么在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度页面 。