我一直在Protractor开发自动化测试很长一段时间,就像很多人一样,我遇到了只能与browser.sleep()
- 桥交叉的空白。我不喜欢硬编码这样的东西,但如果它是必要的话我会。
我开发的测试让我发现每个browser.sleep(1000)
对我的运行时都有重大影响。这些测试目前正在测试不同帐户的权限(确切地说是128个),这涉及登录和退出,同时检查每个帐户的访问权限和未获得访问权限。
我测试的网站是一个纯粹的AngularJS应用程序,在我看来,应该使browser.sleep()
成为一种弃用的方法,因为有一个browser.waitForAngular()
方法可以准确地等待页面完全加载与等待一段时间的browser.sleep()
相比,如果您的网站在该时间内没有加载(它发生),您将会有一个不一致的测试(没有人喜欢不一致)。
研究让我相信browser.waitForAngular()
没有考虑动画和相关的耗时功能,因为它们与AngularJS无关,但这并未在我们的网站上实现。 waitForAngular()
基本上等待$digest
,$http
和$timeout
。
我要问的是,这是一种被认为是可接受的损失的东西,因为量角器一般都很棒,或者我有什么东西可以忽略这里?
TL; DR:
是否有解决方案允许我们不满足于browser.sleep()
?
来源:Protractor Timeout Docs, Timeout-spec.js (protractor docs), Issue909,Issue279,Issue92,StackQuestion1
答案 0 :(得分:11)
如果您可以设计某种测试来确定您等待的内容是否已完成,则可以使用browser.wait
。从http://docsplendid.com/archives/209中获取想法,您可以传递一个函数,该函数返回一个解析为true
或false
的承诺,例如使用isPresent
的承诺
browser.wait(function() {
return element(by.id('some-element')).isPresent();
}, 1000);
或者如果你有一些更复杂的条件,你可以使用保证链:
browser.wait(function() {
return element(by.id('some-element')).isPresent().then(function(isPresent) {
return !isPresent;
});
}, 1000);
并且命令流将等待,重复调用传递给wait
的函数,直到它返回的promise转换为true
。
答案 1 :(得分:0)
如果您想要在元素存在时执行任何操作或想要等到它出现在页面上,这就是这种方式。
element(by.id).isPresent().then(function(result) {
if (result) {
nextButton.click();
}
else{
browser.wait(function () {
return browser.isElementPresent(element(by.id));
},50000);
}
}).then(function () {
nextButton.click();
});
},