2

我们在项目中使用 Protractor 3.6 版本来自动化 angularJS 应用程序。我们有主 Angular 应用程序,其中许多独立的 Angular 应用程序被实现为 iframe。

也就是说,我们可以直接通过 SPA 访问这些应用程序,也可以通过我们的主集成应用程序访问这些应用程序。

当前方法:团队在隐式等待无济于事的地方使用 30 秒的隐式等待()和静态等待(可能是 60 秒)。

问题:每次我们执行测试脚本时都会看到不一致的结果,而且执行时间相当长。

解决方案:我们提出了显式等待添加到隐式等待和静态等待,这提高了一致性并减少了执行时间。

问题:在框架中同时使用所有三种等待(隐式等待、显式等待、thred.sleep)是否正确?注意:在少数导航中我们不得不使用 thread.sleep()。隐式等待和显式等待都不起作用。

4

2 回答 2

1

是的,使用多种类型的等待很好,我 95% 的时间使用隐式等待,但在某些条件下需要使用显式等待。如果您的应用程序完全是 Angular 并正确同步(即没有未完成的 $http 调用 -更多信息),您不需要太多等待,因为 Protractor 往往会知道 Angular/您的应用程序何时准备就绪。但是我不知道您的应用程序,这很可能不适用于您的情况,我将就该主题提出一些想法:

隐含的:对于一致性和稳定性而言,这些是您最好的选择。我会挑战你并说你的大部分等待问题可能可以通过正确使用隐式等待来解决(更强大的用例,在多个条件下复合等)。但同样,我不知道你的应用程序,但我认为值得重新审视。您可以在此处查看列表,我经常使用的是presenceOf()visibilityOf()以及它们的对应物 stalenessOf()invisibilityOf().

明确的:我非常努力地避免这些,但是我发现在某些情况下是必要的。例如几秒钟内发生的动画,并且没有任何内容可以通过隐式等待进行跟踪。我创建了一些自己的方法来尝试捕捉这些场景并使用更隐式的等待方法,例如下面的方法:

// wait for an attribute to be present i.e. "ng-invalid" to be added to a class
// el = element, attr = attribute to check (i.e. class, id etc), target = attribute value to look for
Util.prototype.waitForAttributePresent = function (el, attr, target, time) {
    var timeout = time || 0;
    return browser.wait(function () {
        return el.getAttribute(attr).then(function (val) {
            return ~val.indexOf(target) < 0;
        });
    }, timeout);
};

用例:

// waits 5 seconds for the elements class to contain "active"
var el = $('div');
Util.waitForAttributePresent(el, 'class', 'active', 5000);
expect(true).toBe(true); 

静态:不确定您所说的静态是什么意思,这听起来与显式等待相同。您将停止它一段时间,而不是基于任何条件。

于 2016-10-05T12:34:37.057 回答
0

也许分享更多关于为什么隐式等待不起作用的细节将使社区能够从技术上帮助您。

对您的问题的简短回答是,使用两种类型的等待是正确的(不确定“显式”和“静态”之间有什么区别),具体取决于 SUT、您的自动化目标、项目优先级和您的技术知识.

我见过无数使用显式等待的情况,但有一种方法可以实现更有效的隐式等待。然而,有时这样做的努力超过了好处,所以我总是首先追求“大胜利”——弄清楚如何隐式等待的领域将节省最多的执行时间,或者(更重要的是)提高执行稳定性。通常首先需要进行一些分析工作来确定这些区域的位置。

另外需要注意的是,在大多数情况下,执行稳定性比执行时间更重要;如果使用显式等待导致更稳定的测试,那么显式等待是绝对有效的。您总是可以在之后的几轮优化中回到这些案例,以寻找在保持稳定性的同时减少等待时间的方法。

我接近测试自动化的顺序是:

  1. 编写有效的测试
  2. 稳定测试
  3. 优化

第 1 步和第 2 步是强制性的,但第 3 步不是强制性的,这取决于您的项目优先级。例如,添加新测试可能比优化现有测试更重要。另一方面,执行时间可能很长,从而降低了 CI 系统提供的好处。在这种情况下,优化现有测试可能更重要。

最后但同样重要的是:不建议混合显式和隐式等待。- http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-and-implicit-waits

将隐式等待和显式等待结合在一起会导致意外的等待时间

澄清 Selenium doc 混合隐式和显式等待的原因

于 2016-10-11T03:22:27.297 回答