鉴于网站上的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很常见,总是可以检查。
由于
答案 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");