量角器超时

Tom*_*ijs 11 angularjs selenium-webdriver protractor

我一直在Protractor开发自动化测试很长一段时间,就像很多人一样,我遇到了只能与browser.sleep()-bridge 交叉的空白.我不喜欢硬编码这样的东西,但如果它是必要的,我会的.

我开发的测试让我发现每个browser.sleep(1000)都对我的运行时产生重大影响.这些测试目前正在测试不同帐户的权限(确切地说是128个),这涉及登录和退出,同时检查每个帐户的访问权限和访问权限.

我正在测试的网站是一个纯粹的AngularJS应用程序,在我看来,它应该是browser.sleep()一个弃用的方法,因为有一种browser.waitForAngular()方法可以准确地等待页面完全加载,相比之下browser.sleep()等待一段时间,如果你的网站是在那个时间内(它发生)加载,你将有一个不一致的测试(没有人喜欢不一致).

研究让我相信browser.waitForAngular()没有考虑动画和相关的耗时功能,因为它们不是AngularJS相关的,但我们的网站没有实现.也waitForAngular()基本上等待$digest,$http$timeout.

我要问的是,这是一个被认为是可接受的损失的东西,因为量角器总体上很棒或者有什么我在这里俯瞰?

TL; DR:那里有解决办法让我们不满足于此browser.sleep()吗?

来源:量角器超时文档, Timeout-spec.js(量角器文档), Issue909,Issue279,Issue92,StackQuestion1

Mic*_*mza 11

如果您可以设计某种测试来确定您所等待的内容是否已完成,则可以使用browser.wait.从http://docsplendid.com/archives/209获取想法,您可以传递一个函数,该函数返回一个解析为的promise true或者false,例如使用的promiseisPresent

browser.wait(function() {
  return element(by.id('some-element')).isPresent();
}, 1000);
Run Code Online (Sandbox Code Playgroud)

或者如果你有一些更复杂的条件,你可以使用promise chaining:

browser.wait(function() {
  return element(by.id('some-element')).isPresent().then(function(isPresent) {
    return !isPresent;
  });
}, 1000);
Run Code Online (Sandbox Code Playgroud)

并且命令流将等待,重复调用传递给的函数wait,直到它返回的promise解析为true.