Существует ли универсальный подход для Selenium дождаться загрузки всего содержимого ajax? (не привязанный к определенному веб-сайту - поэтому он работает для каждого веб-сайта ajax)
Selenium ждет загрузки контента Ajax - универсальный подход
Ответ 1
Вам нужно дождаться завершения Javascript и jQuery. Выполните Javascript, чтобы проверить, jQuery.active
ли jQuery.active
0
и complete
document.readyState
, что означает, что загрузка 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);
}
Ответ 2
Как описал Марк Коллин в своей книге "Освоение 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);");
}
};
}
}
Ответ 3
Я не считаю, что существует универсальный подход из коробки. Обычно я делаю метод, который выполняет .waituntilrowcount(2)
или waituntilvisible()
который waituntilvisible()
элемент.
Ответ 4
Я использовал этот простой do do для итерации до завершения 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);
}
}