【问题标题】:Implicit and Explicit wait approaches in the framework框架中的隐式和显式等待方法
【发布时间】:2017-02-13 19:09:09
【问题描述】:

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

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

当前方法: 团队在隐式等待没有帮助的地方使用了 30 秒的隐式等待()和静态等待(可能是 60 秒)。

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

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      对您的问题的简短回答是,根据 SUT、您的自动化目标、您的项目优先级和你的技术知识。

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

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

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

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

      第 1 步和第 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-14
        • 2014-11-01
        • 2018-01-24
        • 2020-01-20
        • 2017-04-19
        • 1970-01-01
        • 2021-03-25
        相关资源
        最近更新 更多