框架中的隐式和显式等待方法

时间:2016-10-05 11:03:56

标签: selenium gulp protractor automated-tests protractor-net

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

即我们可以直接访问SPA以及通过我们的主集成应用程序访问这些应用程序。

目前的做法: Team在隐式等待没有帮助的地方使用Implicit wait()30秒和静态等待(可能是60秒)。

问题: 每次执行测试脚本时都会看到不一致的结果,并且执行时间过长会有很多。

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

问题: 在框架中一起使用所有三个等待(隐式等待,显式等待,thred.sleep)是否正确。 注意:在少数导航中,我们必须使用thread.sleep()。隐式等待和显式等待都不起作用。

2 个答案:

答案 0 :(得分:1)

是的,可以使用多种类型的等待,我在95%的时间使用隐式等待但需要在某些条件下使用显式等待。如果你的app是完全Angular并且正确同步(即没有未完成的$ http调用 - more info)你不需要太多的等待,因为Protractor倾向于知道Angular /你的应用何时准备好了。但是我不知道你的应用程序,这对你的情况很可能不是真的,我会就这个话题给出一些想法:

隐含:对于一致性和稳定性,这些是您最好的选择。我会挑战你并说你的大多数等待问题都可能通过正确使用Implicit等待来解决(更强的用例,在多个条件下复合等)。但同样,我不知道你的应用程序,我认为值得重新审视。您可以查看here列表,我经常使用的列表是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); 

静态:不确定静音是什么意思,听起来和显式等待一样。您将停留一段时间,而不是基于任何条件。

答案 1 :(得分:0)

或许分享有关隐式等待无效的原因的更多细节将使社区能够在技术上更具帮助。

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

我已经看过无数使用显式等待的情况,但有一种方法可以实现更有效的隐式等待。然而,有时候,这样做的努力超过了好处,所以我总是首先选择“大赢” - 确定如何隐式等待的区域将节省大部分执行时间或(更重要的是)提高执行稳定性。通常首先需要进行一些分析工作,以确定这些区域的位置。

另一点需要注意的是,在大多数情况下,执行稳定性比执行时间更重要;如果使用显式等待导致更稳定的测试,则明确等待绝对有效。 您可以在优化轮次期间稍后回到这些情况,以寻找减少等待时间的方法,同时保持稳定性。

我接近测试自动化的命令是:

  1. 编写有效的测试
  2. 稳定测试
  3. 优化
  4. 步骤1&amp; 2是强制性的,但步骤3不是,取决于您的项目优先级。例如,添加新测试可能比优化现有测试更重要。另一方面,可能是执行时间非常长的情况,从而降低了CI系统提供的益处。在这种情况下,优化现有测试可能更为重要。

    最后但并非最不重要:不建议混合使用显式和隐式等待。看到- http://docs.seleniumhq.org/docs/04_webdriver_advanced.jsp#explicit-and-implicit-waits

    Combining implicit wait and explicit wait together results in unexpected wait times

    Clarification on the cause of mixing Implicit and Explicit waits of Selenium doc