硒等待Ajax内容加载 - 通用方法
2022-09-02 01:08:41
Selenium有没有一种通用的方法来等待所有ajax内容都加载完毕?(不绑定到特定网站 - 因此它适用于每个ajax网站)
Selenium有没有一种通用的方法来等待所有ajax内容都加载完毕?(不绑定到特定网站 - 因此它适用于每个ajax网站)
您需要等待Javascript和jQuery完成加载。执行 Javascript 以检查 is 和 is ,这意味着 JS 和 jQuery 加载已完成。jQuery.active
0
document.readyState
complete
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);
}
正如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);");
}
};
}
}