Gibt es einen universellen Ansatz für Selenium, um zu warten, bis der gesamte Ajax-Inhalt geladen ist? (nicht an eine bestimmte Website gebunden - so funktioniert es für jede Ajax-Website)
Sie müssen warten, bis Javascript und jQuery vollständig geladen sind. Führen Sie Javascript aus, um zu prüfen, ob jQuery.active
0
und document.readyState
complete
sind. Dies bedeutet, dass das Laden von JS und jQuery abgeschlossen ist.
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);
}
Wie Mark Collin in seinem Buch "Mastering Selenium Webdriver" beschrieben hat, können Sie mit JavascriptExecutor herausfinden, ob eine Website, die jQuery verwendet, die Aufrufe von AJAX beendet hat
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);");
}
};
}
}
Ich habe diese einfache Methode verwendet, um zu iterieren, bis ein AJAX abgeschlossen ist. Es funktioniert konsequent für mich.
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);
}
}
Ich glaube nicht, dass es eine universelle Herangehensweise gibt. Ich mache normalerweise eine Methode, die eine .waituntilrowcount(2)
oder waituntilvisible()
durchführt, die ein Element abfragt.