【问题标题】:How to wait until all ajax requests are complete in Selenium IDE?如何等到 Selenium IDE 中的所有 ajax 请求都完成?
【发布时间】:2016-12-01 17:48:48
【问题描述】:

我有一个使用 Selenium 和 Selenium IDE 测试的相当重 ajax 的 Web 应用程序。在最终提交之前一切正常。通常,由于仍在处理中的 ajax 请求数量过多(通常大约 20 个),它会出错。有没有办法让 selenium 等待所有 ajax 请求完成?我试过 waitForEval Value = "$.active==0" (如下图所示),但这似乎没有任何作用

Selenium IDE 可以做到这一点吗?

注意 - 由于业务类型和我正在来回传递脚本,因此我必须使用 IDE。

【问题讨论】:

    标签: ajax selenium testing


    【解决方案1】:

    答案很简单——你所要做的就是使用 waitForEval 命令检查活动请求的数量(selenium.browserbot.getUserWindow().$.active),并将值设置为 0——然后这一切都发生在 ide 中。

    【讨论】:

    • 你可以简单地使用waitForEval | window.$.active | 0
    • 有与此等价的 Python 吗?
    【解决方案2】:

    我有一段时间没有使用 IDE。这是我用于 WebDriver 的。但是算法会翻译; JavaScript 就是 JavaScript。话虽如此,这取决于您的框架。

    对于 Angular,我使用这个:

    public boolean waitForAngularToLoad(WebDriver driver, int waitTimeInSeconds) {
    
        WebDriverWait wait = new WebDriverWait(driver, waitTimeInSeconds, 2000L);
    
        ExpectedCondition<Boolean> libraryLoad = new ExpectedCondition<Boolean>() {
    
          public Boolean apply(WebDriver driver) {
            try {
              return ((Boolean)((JavascriptExecutor)driver).executeScript(
                      "return angular.element(document.body).injector().get(\'$http\').pendingRequests.length == 0;"
                      ));
            }
            catch (Exception e) {
                // Angular not found
                log.info("Not found: " + "return angular.element(document.body).injector().get(\'$http\').pendingRequests.length == 0;");
                return true;
            }
          }
        };
    
        // wait for browser readystate complete; it is arguable if selenium does this all the time
        ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
    
          public Boolean apply(WebDriver driver) {
            return ((JavascriptExecutor)driver).executeScript("return document.readyState;")
            .toString().equals("complete");
          }
      };
    
      return wait.until(libraryLoad) && wait.until(jsLoad);
    
    }
    

    对于我使用的原型:

    public boolean waitForPrototypeToLoad(WebDriver driver, int waitTimeInSeconds) {
    
        WebDriverWait wait = new WebDriverWait(driver, waitTimeInSeconds, 2000L);
    
        // wait for jQuery to load
        ExpectedCondition<Boolean> libraryLoad = new ExpectedCondition<Boolean>() {
    
          public Boolean apply(WebDriver driver) {
            try {
              return ((Boolean)((JavascriptExecutor)driver).executeScript("return Ajax.activeRequestCount == 0;"));
            }
            catch (Exception e) {
                // Prototype  not found
                log.info("Not found: " + "return Ajax.activeRequestCount == 0;");
                return true;
            }
          }
        };
    
        // wait for browser readystate complete; it is arguable if selenium does this all the time
        ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
    
          public Boolean apply(WebDriver driver) {
            return ((JavascriptExecutor)driver).executeScript("return document.readyState;")
            .toString().equals("complete");
          }
      };
    
      return wait.until(libraryLoad) && wait.until(jsLoad);
    
    }
    

    对于 jQuery,我使用这个(你必须自定义等待微调器的逻辑,每个人的做法都不一样):

    public boolean waitForJSandJQueryToLoad(WebDriver driver, long waitTimeInSeconds) {
    
        WebDriverWait wait = new WebDriverWait(driver, waitTimeInSeconds, 2000L);
    
        /*
         * If you are curious about what follows see:
         *  http://selenium.googlecode.com/git/docs/api/java/org/openqa/selenium/support/ui/ExpectedCondition.html
         * 
         * We are creating an anonymous class that inherits from ExpectedCondition and then implements interface
         * method apply(...)
         */
        ExpectedCondition<Boolean> libraryLoad = new ExpectedCondition<Boolean>() {
    
          public Boolean apply(WebDriver driver) {
            boolean isAjaxFinished = false;
            boolean isLoaderSpinning = false;
            boolean isPageLoadComplete = false;
            try {
              isAjaxFinished = ((Boolean)((JavascriptExecutor)driver).executeScript("return jQuery.active == 0;"));
            } catch (Exception e) {
                // no Javascript library not found
                isAjaxFinished = true;
            }
            try { // Check your page, not everyone uses class=spinner
                // Reduce implicit wait time for spinner
                driver.manage().timeouts().implicitlyWait(10L, TimeUnit.SECONDS);
    
    //              isLoaderSpinning = driver.findElement(By.className("spinner")).isDisplayed(); // This is the default
                // Next was modified for GoComics
                isLoaderSpinning = driver.findElement(By.cssSelector("#progress_throbber > ul > li:nth-child(1) > img[alt='spinner']")).isDisplayed();
    
                if (isLoaderSpinning)
                    log.info("jquery loader is spinning");
            } catch (Exception f) {
                // no loading spinner found
                isLoaderSpinning = false;
            } finally { // Restore implicit wait time to default
                driver.manage().timeouts().implicitlyWait(new DriverFactory().getImplicitWait(), TimeUnit.SECONDS);
            }
            isPageLoadComplete = ((JavascriptExecutor)driver).executeScript("return document.readyState;")
                    .toString().equals("complete");
            if (!(isAjaxFinished & !(isLoaderSpinning) & isPageLoadComplete))
                log.info(isAjaxFinished + ", " + !(isLoaderSpinning) +", " + isPageLoadComplete);
    
            return isAjaxFinished & !(isLoaderSpinning) & isPageLoadComplete;
          }
        }; // Terminates statement started by ExpectedCondition<Boolean> libraryLoad = ...
    
      return wait.until(libraryLoad); 
    }
    

    【讨论】:

      【解决方案3】:

      最后,解决问题的方法是添加 AJAX。我正在测试它几天 - 一个巧妙的解决方案。附录关于在每一步使 selenium 自动等待 AJAX 的执行。

      https://addons.mozilla.org/pl/firefox/addon/sideex/

      【讨论】:

        猜你喜欢
        • 2015-07-17
        • 2020-03-17
        • 2013-11-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多