java selenium selenium-webdriver pageload dom-events

java - ¿Tenemos alguna función genérica para verificar si la página se ha cargado completamente en Selenium?



selenium-webdriver pageload (5)

Estoy tratando de verificar si la página web está cargada o no (es decir, verificando que todo el control esté cargado) en selenio.

Intenté debajo del código:

new WebDriverWait(firefoxDriver, pageLoadTimeout).until( webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));

pero incluso si la página se está cargando el código anterior no espera.

Sé que puedo verificar si hay algún elemento en particular para verificar si se puede hacer clic, etc., pero estoy buscando una solución genérica


Algo como esto debería funcionar (por favor, disculpe a la pitón en una respuesta en java):

idle = driver.execute_async_script(""" window.requestIdleCallback(() => { arguments[0](true) }) """)

Esto debería bloquearse hasta que el bucle de eventos esté inactivo, lo que significa que todos los activos deben cargarse.


Como mencionó si hay alguna función genérica para verificar si la página se ha cargado completamente en Selenium_, la respuesta es No.

Primero echemos un vistazo a su código de prueba, que es el siguiente:

new WebDriverWait(firefoxDriver, pageLoadTimeout).until(webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));

El parámetro pageLoadTimeout en la línea de código anterior no se puede volver a asemejar a pageLoadTimeout() real pageLoadTimeout() .

Aquí puede encontrar una discusión detallada de pageLoadTimeout en Selenium no funciona

Ahora que su base de datos se relaciona con la página que se está cargando por completo, puede usar la pageLoadStrategy() configurada como normal [los valores admitidos son ninguno , ávido o normal ] usando una instancia de la Clase DesiredCapabilities o la Clase ChromeOptions de la siguiente manera:

  • Usando la clase DesiredCapabilities :

    import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.remote.DesiredCapabilities; public class myDemo { public static void main(String[] args) throws Exception { System.setProperty("webdriver.gecko.driver", "C://Utility//BrowserDrivers//geckodriver.exe"); DesiredCapabilities dcap = new DesiredCapabilities(); dcap.setCapability("pageLoadStrategy", "normal"); FirefoxOptions opt = new FirefoxOptions(); opt.merge(dcap); WebDriver driver = new FirefoxDriver(opt); driver.get("https://www.google.com/"); System.out.println(driver.getTitle()); driver.quit(); } }

  • Usando la clase ChromeOptions :

    import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.PageLoadStrategy; public class myDemo { public static void main(String[] args) throws Exception { System.setProperty("webdriver.gecko.driver", "C://Utility//BrowserDrivers//geckodriver.exe"); FirefoxOptions opt = new FirefoxOptions(); opt.setPageLoadStrategy(PageLoadStrategy.NORMAL); WebDriver driver = new FirefoxDriver(opt); driver.get("https://www.google.com/"); System.out.println(driver.getTitle()); driver.quit(); } }

Puede encontrar una discusión detallada en Estrategia de carga de página para el controlador Chrome (Actualizado hasta Selenium v3.12.0)

Ahora, al establecer PageLoadStrategy en NORMAL y su prueba de código, ambos se aseguran de que el Cliente del navegador (es decir, el Navegador web ) haya alcanzado ''document.readyState'' igual a "complete" . Una vez que se cumple esta condición, Selenium realiza la siguiente línea de código.

Puede encontrar una discusión detallada en Selenium IE WebDriver solo funciona durante la depuración

Pero el cliente del navegador que obtiene ''document.readyState'' igual a "complete" todavía no garantiza que se hayan completado todas las llamadas de JavaScript y Ajax .

Para esperar a que se completen todas las llamadas de JavaScript y Ajax , puede escribir una función de la siguiente manera:

public void WaitForAjax2Complete() throws InterruptedException { while (true) { if ((Boolean) ((JavascriptExecutor)driver).executeScript("return jQuery.active == 0")){ break; } Thread.sleep(100); } }

Puede encontrar una discusión detallada en Esperar a que se complete la solicitud de ajax - Selenium webdriver

Ahora, los dos enfoques anteriores a través de PageLoadStrategy y "return jQuery.active == 0" parecen estar esperando eventos indefinidos. Por lo tanto, para una espera definida, puede inducir el WebDriverWait con ExpectedConditions establecido en titleContains() que garantizará que el título de la página (es decir, la página web ) sea visible y asumirá que todos los elementos también son visibles de la siguiente manera:

driver.get("https://www.google.com/"); new WebDriverWait(driver, 10).until(ExpectedConditions.titleContains("partial_title_of_application_under_test")); System.out.println(driver.getTitle()); driver.quit();

Ahora, a veces es posible, aunque el título de la página coincida con el título de la aplicación, aunque el elemento deseado que desea interactuar no haya terminado de cargarse. Por lo tanto, un enfoque más detallado sería inducir el problema de WebDriverWait con ExpectedConditions configuradas en visibilityOfElementLocated() que harán que su programa espere a que el elemento deseado sea ​​visible de la siguiente manera:

driver.get("https://www.google.com/"); WebElement ele = new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("xpath_of_the_desired_element"))); System.out.println(ele.getText()); driver.quit();


Implementar esto, está funcionando para muchos de nosotros, incluyéndome a mí. Incluye la espera de la página web en JavaScript, Angular, JQuery si está allí.

Si su aplicación contiene Javascript y JQuery, puede escribir código solo para esos,

Al definirlo en un solo método y puedes llamarlo en cualquier lugar:

// Wait for jQuery to load { ExpectedCondition<Boolean> jQueryLoad = driver -> ((Long) ((JavascriptExecutor) driver).executeScript("return jQuery.active") == 0); boolean jqueryReady = (Boolean) js.executeScript("return jQuery.active==0"); if (!jqueryReady) { // System.out.println("JQuery is NOT Ready!"); wait.until(jQueryLoad); } wait.until(jQueryLoad); } // Wait for ANGULAR to load { String angularReadyScript = "return angular.element(document).injector().get(''$http'').pendingRequests.length === 0"; ExpectedCondition<Boolean> angularLoad = driver -> Boolean.valueOf(((JavascriptExecutor) driver).executeScript(angularReadyScript).toString()); boolean angularReady = Boolean.valueOf(js.executeScript(angularReadyScript).toString()); if (!angularReady) { // System.out.println("ANGULAR is NOT Ready!"); wait.until(angularLoad); } } // Wait for Javascript to load { ExpectedCondition<Boolean> jsLoad = driver -> ((JavascriptExecutor) driver).executeScript("return document.readyState").toString() .equals("complete"); boolean jsReady = (Boolean) js.executeScript("return document.readyState").toString().equals("complete"); // Wait Javascript until it is Ready! if (!jsReady) { // System.out.println("JS in NOT Ready!"); wait.until(jsLoad); } }

Haga clic aquí para ver el enlace de referencia

Hazme saber si te quedaste en algún lugar implementando.

Supera el uso de Thread o Explicit Wait.


También uso selenio y tuve el mismo problema, para solucionar eso, también espero a que se cargue el jQuery.

Así que si tienes el mismo problema prueba esto también

((Long) ((JavascriptExecutor) browser).executeScript("return jQuery.active") == 0);

Puede envolver ambas funciones en un método y verificar hasta que se cargue la página y jQuery


public static void waitForPageToLoad(long timeOutInSeconds) { ExpectedCondition<Boolean> expectation = new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver driver) { return ((JavascriptExecutor) driver).executeScript("return document.readyState").equals("complete"); } }; try { System.out.println("Waiting for page to load..."); WebDriverWait wait = new WebDriverWait(Driver.getDriver(), timeOutInSeconds); wait.until(expectation); } catch (Throwable error) { System.out.println( "Timeout waiting for Page Load Request to complete after " + timeOutInSeconds + " seconds"); } }

Prueba este método