selenium selenium-webdriver webdriver selenium-chromedriver pageloadstrategy

Estrategia de carga de página para el controlador de Chrome(actualizado hasta Selenium v3.12.0)



selenium-webdriver webdriver (3)

Estoy usando el navegador Chrome para probar la aplicación web.

A veces las páginas se cargan después de mucho tiempo. Necesitaba dejar de descargar o limitar su tiempo de descarga.

En FireFox sé sobre PAGE_LOAD_STRATEGY = "eager" .

¿Hay algo similar para Chrome?

PD: driver.manage().timeouts().pageLoadTimeout() funciona, pero después de eso, cualquier tratamiento para Webdriver arroja TimeOutException . Necesito obtener la URL actual de la página después de detener su arranque.


De las especificaciones de Webdriver:

Para los comandos que hacen que se cargue un nuevo documento, el punto en el que el comando regresa está determinado por la estrategia de carga de la página de la sesión .

Cuando la Page Loading toma demasiado tiempo y necesita dejar de descargar recursos adicionales (imágenes, css, js, etc.), puede cambiar pageLoadStrategy través del webdriver .

Al momento de escribir esto, pageLoadStrategy admite los siguientes valores:

  1. normal

    Esta estrategia hace que Selenium espere a que se cargue la página completa (contenido html y recursos secundarios descargados y analizados).

  2. eager

    Esta estrategia hace que Selenium espere el evento DOMContentLoaded (contenido html descargado y analizado únicamente).

  3. none

    Esta estrategia hace que Selenium regrese inmediatamente después de que el contenido inicial de la página se reciba por completo (contenido html descargado).

De manera predeterminada, cuando Selenium carga una página, sigue la página pageLoadStrategy .

Aquí está el bloque de código para configurar pageLoadStrategy() través de una instancia de DesiredCapabilities Class y ChromeOptions Class de la siguiente manera:

  • Usando la clase DesiredCapabilities :

    package demo; //replace by your own package name import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.DesiredCapabilities; public class A_Chrome_DCap_Options { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "C://Utility//BrowserDrivers//chromedriver.exe"); DesiredCapabilities dcap = new DesiredCapabilities(); dcap.setCapability("pageLoadStrategy", "normal"); ChromeOptions opt = new ChromeOptions(); opt.merge(dcap); WebDriver driver = new ChromeDriver(opt); driver.get("https://www.google.com/"); System.out.println(driver.getTitle()); driver.quit(); } }

  • Usando la clase ChromeOptions :

    package demo; //replace by your own package name import org.openqa.selenium.PageLoadStrategy; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; public class A_Chrome_Options_test { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "C://Utility//BrowserDrivers//chromedriver.exe"); ChromeOptions opt = new ChromeOptions(); opt.setPageLoadStrategy(PageLoadStrategy.NORMAL); WebDriver driver = new ChromeDriver(opt); driver.get("https://www.google.com/"); System.out.println(driver.getTitle()); driver.quit(); } }

Nota : los valores de pageLoadStrategy son normal , eager y none es un requisito según el borrador del editor de WebDriver W3C, pero el valor de pageLoadStrategy como eager sigue siendo un WIP (Work In Progress) dentro de la implementación de ChromeDriver . Puede encontrar una discusión detallada en la solución de estrategia de carga de página "Eager" para Chromedriver Selenium en Python

Referencias


En C #, dado que PageLoadStrategy.Eager no parece funcionar para Chrome, lo escribí yo mismo con un WebDriverWait. Establezca PageLoadStrategy en none y luego hacer esto básicamente lo anulará:

new WebDriverWait(_driver, TimeSpan.FromSeconds(20)) .Until(d => { var result = ((IJavaScriptExecutor) d).ExecuteScript("return document.readyState"); return result.Equals("interactive") || result.Equals("complete"); });

Simplemente agrega su controlador de Chrome como parámetro y el TimeSpan se establece en un máximo de 20 segundos en mi caso. Por lo tanto, esperará un máximo de 20 segundos para que la página sea interactiva o completa


Intenta usar la espera explícita. Visita this enlace. Puede ser útil

Prueba este código también:

WebDriver driver = new FirefoxDriver(); String startURL = //a starting url; String currentURL = null; WebDriverWait wait = new WebDriverWait(driver, 10); foo(driver,startURL); /* go to next page */ if(driver.findElement(By.xpath("//*[@id=''someID'']")).isDisplayed()){ String previousURL = driver.getCurrentUrl(); driver.findElement(By.xpath("//*[@id=''someID'']")).click(); driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS); ExpectedCondition e = new ExpectedCondition<Boolean>() { public Boolean apply(WebDriver d) { return (d.getCurrentUrl() != previousURL); } }; wait.until(e); currentURL = driver.getCurrentUrl(); System.out.println(currentURL); }

Espero que su problema se resuelva utilizando el código anterior.