Selenium使用JavascriptExecutor等待页面完全加载

时间:2018-03-20 20:41:37

标签: java selenium selenium-webdriver async-await

鉴于网站上的AJAX组件,我需要等到整个页面完全加载。

这是我的等待方法,使用JavascriptExecutor检查document.readyState:

public void waitForLoading2() {
        WebDriverWait wait = new WebDriverWait(driver, timeOut);
        if(!driver.findElements(By.xpath("//*[@id='wait'][contains(@style, 'display: block')]")).isEmpty()) {
            wait.until(ExpectedConditions.presenceOfElementLocated(By.xpath("//*[@id='wait'][contains(@style, 'display: none')]")));
        }

            ExpectedCondition<Boolean> expectation = new
                    ExpectedCondition<Boolean>() {
                        public Boolean apply(WebDriver driver) {
                            return ((JavascriptExecutor) driver).executeScript("return document.readyState").toString().equalsIgnoreCase("complete");
                        }
                    };
            wait.until(expectation);

    }

有时它会因以下错误消息而失败:

  

org.openqa.selenium.JavascriptException:JavaScript错误(警告:   服务器没有提供任何堆栈跟踪信息)

我在这里想念什么?我的假设是document.readyState很常见,总是可以检查。

由于

3 个答案:

答案 0 :(得分:0)

检查document.readyState对AJAX调用没有帮助。最好的办法是在AJAX中加载区域中找到一个元素并等到它可见。然后你就会知道页面已经加载了。如果AJAX调用加载了多个/单独的区域,那么您将需要从每个区域中选择一个元素。

答案 1 :(得分:0)

如果使用jQuery发送AJAX请求,则可以获得jQuery.active的值。它等同于jQuery.active=0时完成的所有AJAX请求。

使用executeScript("return jQuery.active==0")。有关详细信息,请阅读此artical

答案 2 :(得分:0)

还有更多complex options,就像这个

public static void waitForAjax(WebDriver driver, String action) {
       driver.manage().timeouts().setScriptTimeout(5, TimeUnit.SECONDS);
       ((JavascriptExecutor) driver).executeAsyncScript(
               "var callback = arguments[arguments.length - 1];" +
                       "var xhr = new XMLHttpRequest();" +
                       "xhr.open('POST', '/" + action + "', true);" +
                       "xhr.onreadystatechange = function() {" +
                       "  if (xhr.readyState == 4) {" +
                       "    callback(xhr.responseText);" +
                       "  }" +
                       "};" +
                       "xhr.send();");
}

按顺序

  

等待整个页面满载

但以下为我做了诀窍 - 我检查是否有正在进行的AJAX调用,并等到完成后:

JavascriptExecutor js = (JavascriptExecutor) driverjs;
js.executeScript("return((window.jQuery != null) && (jQuery.active === 0))").equals("true");