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.