【问题标题】:Selenium wait for Ajax content to load - universal approachSelenium 等待 Ajax 内容加载 - 通用方法
【发布时间】:2015-10-26 14:44:43
【问题描述】:

Selenium 是否有一种通用的方法来等待所有 ajax 内容加载完毕? (不绑定到特定网站 - 所以它适用于每个 ajax 网站)

【问题讨论】:

    标签: java selenium selenium-webdriver web-crawler


    【解决方案1】:

    您需要等待 Javascript 和 jQuery 完成加载。执行Javascript检查jQuery.active是否为0document.readyState是否为complete,表示JS和jQuery加载完成。

    public boolean waitForJSandJQueryToLoad() {
    
        WebDriverWait wait = new WebDriverWait(driver, 30);
    
        // wait for jQuery to load
        ExpectedCondition<Boolean> jQueryLoad = new ExpectedCondition<Boolean>() {
          @Override
          public Boolean apply(WebDriver driver) {
            try {
              return ((Long)((JavascriptExecutor)getDriver()).executeScript("return jQuery.active") == 0);
            }
            catch (Exception e) {
              // no jQuery present
              return true;
            }
          }
        };
    
        // wait for Javascript to load
        ExpectedCondition<Boolean> jsLoad = new ExpectedCondition<Boolean>() {
          @Override
          public Boolean apply(WebDriver driver) {
            return ((JavascriptExecutor)getDriver()).executeScript("return document.readyState")
            .toString().equals("complete");
          }
        };
    
      return wait.until(jQueryLoad) && wait.until(jsLoad);
    }
    

    【讨论】:

    • 谢谢 :) 这适用于每个网站还是仅适用于使用 jQuery 的网站?
    • 可以在任何网站上工作,它可以处理 Jquery 和 JS 的存在和不存在
    • 谢谢 - 我现在就试一试
    • 太棒了。它似乎有效 - 这也适用于 angularjs 吗?另外 - 我不是 100 了解 document.readyState - 这是否包括网页是否通过 ajax 加载内容? (例如 Pinterest?)
    • @FabianLurz 是的,我一直在带有 angularJs 的页面上使用它,它运行良好。 AJAX 页面加载也将属于 jQuery/JS,因此它也应该处理它。
    【解决方案2】:

    正如 Mark Collin 在他的“Mastering Selenium Webdriver”一书中所描述的,使用 JavascriptExecutor 可以让您确定使用 jQuery 的网站是否完成了 AJAX 调用

    public class AdditionalConditions {
    
      public static ExpectedCondition<Boolean> jQueryAJAXCallsHaveCompleted() {
        return new ExpectedCondition<Boolean>() {
    
            @Override
            public Boolean apply(WebDriver driver) {
                return (Boolean) ((JavascriptExecutor) driver).executeScript("return (window.jQuery != null) && (jQuery.active === 0);");
            }
        };
      }
    }
    

    【讨论】:

    • 感谢您的提示。但是如果一方不使用jQuery呢?
    • 如果你有其他的 JavaScript 库,你需要依赖它。在同一本书中,他有 AngularJS 的示例,否则我会同意另一个答案,你必须是特定领域的,并使用 Explicit and Implicit Waits
    【解决方案3】:

    我一直在使用这个简单的 do while 进行迭代,直到 AJAX 完成。 它一直对我有用。

    public void waitForAjax() throws InterruptedException{
        while (true)
        {
            Boolean ajaxIsComplete = (Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.active == 0");
            if (ajaxIsComplete){
                info("Ajax Call completed. ");
                break;
            }
            Thread.sleep(150);
        }
    }
    

    【讨论】:

      【解决方案4】:

      我不相信有一种开箱即用的通用方法。我通常会创建一个方法来执行.waituntilrowcount(2)waituntilvisible() 来轮询元素。

      【讨论】:

      • 嗯——该死的。是否有任何其他能够爬取 ajax 网站的库?尝试过 selenium、htmlunit 和 crawljax。问题 htmlunit:对错误非常敏感,您无法将其关闭。 Crawljax:可能能够抓取 ajax,但您无法获取网页的 html - 哎哟硒:请参阅问题;)
      猜你喜欢
      • 2018-04-11
      • 1970-01-01
      • 2019-05-31
      • 2011-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多