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:
-
normal
Esta estrategia hace que Selenium espere a que se cargue la página completa (contenido html y recursos secundarios descargados y analizados).
-
eager
Esta estrategia hace que Selenium espere el evento DOMContentLoaded (contenido html descargado y analizado únicamente).
-
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
sonnormal
,eager
ynone
es un requisito según el borrador del editor de WebDriver W3C, pero el valor depageLoadStrategy
comoeager
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.