【问题标题】:When do I have to wait for a promise in Protractor?我什么时候必须等待 Protractor 中的承诺?
【发布时间】:2016-07-21 22:44:06
【问题描述】:

我知道这里有 similar questions 关于这个,但我一辈子都无法理解它们。

这是一个例子,我需要点击一个按钮并检查 url。

我最初的想法是我会把它写成

element(by.id('button')).click();
expect(browser.getCurrentUrl()).toContain('asyncisconfusing');

我知道 expect 处理了它的承诺,但是 .click 呢?我不应该这样写吗?

element(by.id('button')).click().then(() => {
    expect(browser.getCurrentUrl()).toContain('asyncisconfusing')
})

还是量角器/webdriver 自动神奇地做到了这一点?

【问题讨论】:

    标签: javascript selenium-webdriver promise protractor angularjs-e2e


    【解决方案1】:

    理论上,由于Protractor 通过Control Flow 维护一个promise 队列并且与正在测试的AngularJS 应用程序同步工作,所以除非你需要一个真正的值,否则你不应该明确地解决promise进一步处理。换句话说,这应该是首选形式:

    element(by.id('button')).click();
    expect(browser.getCurrentUrl()).toContain('asyncisconfusing');
    

    但在实践中,显式解决 click() 承诺,或通过 browser.wait() 添加显式等待有助于处理偶尔和随机的计时问题

    【讨论】:

    • 知道了,因为控制流是一个队列。这些时间问题是由我们不应该做的控制流之外的事情引起的吗?还是我们不应该依赖控制流顺序?
    • @Dinny 我们仍然应该这样做,但是在现实世界中,有些情况仍然需要特殊处理。例如,客户端动画、浏览器未最大化、网络缓慢或不稳定等问题可能会导致测试流程不像我们预期的那样自然。例如,我们有一个正在测试的 Angular 应用程序,但在代码库的不同部分,我们必须添加 browser.wait(),例如,等待元素变为可点击或可见或当前 url 包含预期的子字符串。在某些地方,我们也有 click().then() 部分。
    • 这是有道理的。我们应该明确解决承诺并尽可能使用browser.wait()?或者当您遇到问题时,这种情况会更多吗?
    • @Dinny 是的,只有在遇到问题时才应用这些东西,从完全依赖控制流开始。
    • 感谢您的帮助和快速响应。快乐测试:)
    【解决方案2】:

    http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/promise.html

    第一部分讨论了如何使用控制流来管理承诺,而无需将每个命令链接在一起。

    【讨论】:

    • 谢谢,这也很有帮助。
    猜你喜欢
    • 2013-10-23
    • 2019-04-29
    • 1970-01-01
    • 2016-01-27
    • 2014-11-08
    • 2013-01-28
    • 2011-03-18
    • 2012-04-26
    相关资源
    最近更新 更多