我知道这里有关于similar questions的内容,但我无法理解它们的生命。
这是一个例子,我需要点击一个按钮并检查网址。
我最初的想法是我会把它写成
element(by.id('button')).click();
expect(browser.getCurrentUrl()).toContain('asyncisconfusing');
我知道期望处理它的承诺但是.click呢?我不应该这样写吗?
element(by.id('button')).click().then(() => {
expect(browser.getCurrentUrl()).toContain('asyncisconfusing')
})
或者是量角器/网络驱动程序自动神奇地做这个吗?
答案 0 :(得分:5)
理论上,由于Protractor
通过Control Flow维护一个承诺队列,并且与正在测试的AngularJS应用程序同步,因此除非您需要,否则不应明确解析承诺进一步处理的真正价值。换句话说,这应该是预先形成的形式:
element(by.id('button')).click();
expect(browser.getCurrentUrl()).toContain('asyncisconfusing');
在实践中,明确解析click()
承诺,或通过browser.wait()
添加明确等待有助于处理偶然和随机的时间问题。
答案 1 :(得分:0)
http://seleniumhq.github.io/selenium/docs/api/javascript/module/selenium-webdriver/lib/promise.html
第一部分讨论如何使用控制流来管理承诺,而不必将每个命令链接在一起。