script javascriptexecutor executescript execute_script example java selenium selenium-webdriver web-crawler

javascriptexecutor - selenium executescript



Selenium espera a que se cargue el contenido de Ajax-enfoque universal (4)

¿Existe un enfoque universal para que Selenium espere hasta que todo el contenido de ajax se haya cargado? (no está vinculado a un sitio web específico, por lo que funciona para todos los sitios web de ajax)


Como lo describió Mark Collin en su libro "Mastering Selenium Webdriver", use JavascriptExecutor que le permite averiguar si un sitio web que utiliza jQuery ha terminado de realizar llamadas 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);"); } }; } }


He estado usando este sencillo do it para iterar hasta que se termina un AJAX. Siempre funciona para mí.

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); } }


No creo que haya un enfoque universal fuera de la caja. Normalmente hago un método que hace un .waituntilrowcount(2) o waituntilvisible() que sondea un elemento.


Necesitas esperar a que Javascript y jQuery terminen de cargarse. Ejecute Javascript para verificar si jQuery.active es 0 y document.readyState está complete , lo que significa que la carga de JS y jQuery está completa.

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); }