问题 量角器超时


我一直在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()

资料来源: 量角器超时文档Timeout-spec.js(量角器文档)Issue909Issue279Issue92StackQuestion1


8355
2018-04-30 11:16


起源

我一直在遇到关于使用$ timeout进行轮询的常见问题中的相同间歇性超时。如果它的失败,我也会徘徊,如果不是民意调查。对于我的团队来说,由于我们依赖Angular Material组件,所以它更加轻松。他们在动画交互方面很重,大量使用$ timeout(func,0)。 - Gabriel Kohen


答案:


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

browser.wait(function() {
  return element(by.id('some-element')).isPresent();
}, 1000);

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

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

并且命令流将等待,反复调用传递给的函数 wait,直到它返回的承诺解决 true


11
2018-04-30 13:03



您还可以使用ExpectedConditions等待元素存在,可点击,包含文本等cf protractortest.org/#/api?view=ProtractorExpectedConditions - floribon


如果要在元素存在时执行任何操作或希望等到页面上显示该元素,则可以使用此方法。

    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();
        });

    },

0
2017-11-22 21:05