我见过很多次有人建议使用它:
browser.ignoreSynchronization=true; // or false
但是我不明白为什么我们需要它?
一个简单的答案是,它使量角器不必等待Angular承诺,例如来自$http或$timeout解决的Angular承诺,如果您在$http或期间$timeout(例如,“正在加载”消息)测试行为或测试非Angular承诺,角度站点或页面,例如单独的登录页面。
$http
$timeout
例如,要测试在请求期间设置加载消息的按钮,可以true在获取元素时将其设置为+检查其内容
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控制流 之后 ,将传递给的功能注入到控制流中。
browser.waitForAngular
browser.wait
wait
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
browser.ignoreSynchronization
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。
browser.ignoreSynchronization = true