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

时间:2015-03-02 11:16:54

标签: javascript angularjs testing protractor end-to-end

我已经多次看到人们建议使用它:

browser.ignoreSynchronization=true;  // or false

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

3 个答案:

答案 0 :(得分:75)

简单的答案是,它使量角器不等待Angular承诺,例如来自$http$timeout的承诺,如果您在{{{{}}期间测试行为,您可能想要这样做1}}或$http(例如,“加载”消息),或测试非Angular站点或页面,例如单独的登录页面。

例如,要测试在请求期间设置加载消息的按钮,您可以在获取元素时将其设置为$timeout并检查其内容

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

使用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'); 的替代方法是直接访问标准的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一样。

答案 1 :(得分:18)

此设置控制量角器是否应等待页面上的角度。它没有正确记录,但这里是documentation string from the code

/**
   * 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。作为一个真实世界的例子,请看一下我从角度页面打开非角度页面时遇到的挑战之一:Non-angular page opened after a click

答案 2 :(得分:3)

2021 答案

browser.ignoreSynchronization 现在什么都不是。字面意思

此命令已于 2018 年 1 月 25 日在量角器 v5.3.0 发布时弃用

改为使用 browser.waitForAngularEnabled()

但是它所做的以及 ignoreSynchronization 过去所做的,它启用了 Protractor 的内置处理来等待 Angular 应用程序。想象一下,你点击登录按钮,你不需要使用“睡眠 10 秒”命令,或者“等到加载动画消失”等。所有这些理论上都应该由量角器开箱即用

但实际上,有太多的边缘情况,你不能依赖这个,不得不禁用这个功能,因为它会使脚本挂起。这就是 await browser.waitForAngularEnabled(false) 发挥作用的时候。或 await browser.waitForAngularEnabled(true) 重新启用它

阅读how it can be used