量角器超时

时间:2015-04-30 11:16:38

标签: angularjs selenium-webdriver protractor

我一直在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 DocsTimeout-spec.js (protractor docs)Issue909Issue279Issue92StackQuestion1

2 个答案:

答案 0 :(得分:11)

如果您可以设计某种测试来确定您等待的内容是否已完成,则可以使用browser.wait。从http://docsplendid.com/archives/209中获取想法,您可以传递一个函数,该函数返回一个解析为truefalse的承诺,例如使用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();
        });

    },