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

Estoy usando el navegador Chrome para probar WebApp.

A veces las páginas se cargan después de mucho tiempo. Necesitaba detener la descarga o limitar el tiempo de descarga.

En Firefox sé de PAGE_LOAD_STRATEGY = "eager" .

¿Hay algo similar para Chrome?

PD: driver.manage().timeouts().pageLoadTimeout() funciona, pero después de eso cualquier tratamiento a 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 retorna el comando está determinado por la estrategia de carga de la página de la sesión .

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

Al escribir estas pageLoadStrategy , pageLoadStrategy admite los siguientes valores:

  1. normal

    Esta estrategia hace que Selenium espere la carga de 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 solamente).

  3. none

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

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


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

  • Usando la Clase de Capacidades Deseadas :

      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 myDemo2 { 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(); } } 
  • Uso de ChromeOptions Class:

     import org.openqa.selenium.WebDriver; import org.openqa.selenium.firefox.FirefoxDriver; import org.openqa.selenium.firefox.FirefoxOptions; import org.openqa.selenium.PageLoadStrategy; public class myDemo1 { 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(); } } 

Referencias

  • WebDriver navigation
  • Estrategias de carga de la página WebDriver
  • WhatWG Document readyStateChange / readyiness

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

Pruebe 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() { 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 usando el código anterior

En C #, dado que PageLoadStrategy.Eager no parece funcionar para Chrome, simplemente lo escribí con WebDriverWait. Establezca PageLoadStrategy en none y luego hacerlo 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 el controlador de Chrome como parámetro y el TimeSpan se establece en un máximo de 20 segundos en mi caso. Así que esperará un máximo de 20 segundos para que la página sea interactiva o completa