¿Tenemos alguna función genérica para verificar si la página se ha cargado completamente en Selenium?
Estoy tratando de verificar si la página web está cargada por completo o no (es decir, verificando que todo el control esté cargado) en Selenium.
Probé el siguiente código:
new WebDriverWait(firefoxDriver, pageLoadTimeout).until(
webDriver -> ((JavascriptExecutor) webDriver).executeScript("return document.readyState").equals("complete"));
pero incluso si la página se carga, el código anterior no espera.
Sé que puedo verificar un elemento en particular para comprobar si es visible/se puede hacer clic, etc., pero estoy buscando alguna solución genérica.
Como mencionaste, si existe alguna función genérica para verificar si la página se ha cargado completamente a través de 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 realmente no se parece al pageLoadTimeout() real .
Aquí puede encontrar una discusión detallada sobre pageLoadTimeout en Selenium que no funciona
Ahora que su caso de uso se relaciona con la carga completa de la página, puede usar pageLoadStrategy() configurado en normal
[los valores admitidos son ninguno , ansioso 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, configurar PageLoadStrategy en NORMAL y su código de prueba garantizan que el cliente del navegador (es decir, el navegador web ) haya alcanzado 'document.readyState'
el valor "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 hecho de que el cliente del navegador alcance el valor '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 ajax - selenium webdriver
Ahora, los dos anteriores se acercan a través de PageLoadStrategy y "return jQuery.active == 0"
parecen estar esperando eventos indefinidos. Entonces, para una espera definitiva, puede inducir la combinación WebDriverWait con ExpectedConditions configuradas en el método titleContains() , lo 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 lo son 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 que, aunque el título de la página coincida con el título de la aplicación , el elemento deseado con el que desea interactuar no se haya completado. Por lo tanto, un enfoque más granular sería inducir la combinación WebDriverWait con ExpectedConditions configuradas en el método visibilidadOfElementLocated() , lo que hará 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();
Referencias
Puede encontrar un par de discusiones detalladas relevantes en:
- Selenium IE WebDriver solo funciona durante la depuración
- Selenium ¿cómo gestionar la espera de carga de la página?