Selenium attend le chargement du contenu Ajax – approche universelle

Existe-t-il une approche universelle permettant à Selenium d’attendre que tout le contenu ajax soit chargé? (non lié à un site Web spécifique – cela fonctionne donc pour tous les sites Web ajax)

Vous devez attendre que Javascript et jQuery soient chargés pour terminer le chargement. Exécutez Javascript pour vérifier si jQuery.active 0 et que document.readyState est complete , ce qui signifie que la charge de JS et de jQuery est terminée.

 public boolean waitForJSandJQueryToLoad() { WebDriverWait wait = new WebDriverWait(driver, 30); // wait for jQuery to load ExpectedCondition jQueryLoad = new ExpectedCondition() { @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 jsLoad = new ExpectedCondition() { @Override public Boolean apply(WebDriver driver) { return ((JavascriptExecutor)getDriver()).executeScript("return document.readyState") .toSsortingng().equals("complete"); } }; return wait.until(jQueryLoad) && wait.until(jsLoad); } 

Comme Mark Collin l’a décrit dans son livre “Mastering Selenium Webdriver”, utilisez JavascriptExecutor pour déterminer si un site Web utilisant jQuery a fini de passer des appels AJAX.

 public class AdditionalConditions { public static ExpectedCondition jQueryAJAXCallsHaveCompleted() { return new ExpectedCondition() { @Override public Boolean apply(WebDriver driver) { return (Boolean) ((JavascriptExecutor) driver).executeScript("return (window.jQuery != null) && (jQuery.active === 0);"); } }; } } 

Je ne crois pas qu’il existe une approche universelle hors de la boîte. Je .waituntilrowcount(2) généralement une méthode qui effectue un .waituntilrowcount(2) ou waituntilvisible() qui interroge un élément.