Causa raíz: cada vez que carga una página con la ayuda del controlador de selenio, entonces la driver
secuencia de comandos espera hasta que la página se cargue por completo. Pero en algún momento webdriver tarda más tiempo en cargar la página, en ese caso verá una TimeoutException
excepción en su consola.
Solución: cuando la carga de la página lleva demasiado tiempo y necesita dejar de descargar recursos adicionales (imágenes, CSS, JS, etc.) , puede cambiar la PageLoadStrategy a través del controlador web.
El siguiente código solo carga el contenido html de la página. Puede establecer la estrategia de carga de la página desde las opciones de Chrome
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.NONE);
Solución actualizada -2: Estoy de acuerdo con DebanjanB, la estrategia PageLoad con None, sin descargar archivos adicionales (imágenes, css, js, etc.) no es una buena idea al realizar las pruebas. Busqué todos los problemas al respecto e intenté encontrar una solución válida. Intenté las siguientes opciones, ya que en algún momento fue capaz de resolver este problema.
options.addArguments("start-maximized");
options.addArguments("enable-automation");
options.addArguments("--no-sandbox");
options.addArguments("--disable-infobars");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--disable-browser-side-navigation");
options.addArguments("--disable-gpu");
Ninguno de ellos ayudó Pero encontré una solución nuevamente con la estrategia de carga de página. Esta vez estamos descargando todos los recursos secundarios pero estamos esperando el evento DOMContentLoaded . Esta estrategia llamada Eager . Una pequeña definición de las 3 estrategias de carga de páginas disponibles
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. ansioso:
esta estrategia hace que Selenium espere el evento DOMContentLoaded (contenido html descargado y analizado únicamente).
3. ninguno:
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).
NOTA: De manera predeterminada, cuando Selenium carga una página, sigue la página pageLoadStrategy normal.
Fragmento de código sin usar la estrategia de carga de página (o Normal como lo usa el selenio por defecto)
System.setProperty("webdriver.chrome.driver", "C:\\Users\\...\\LatestDriver\\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.get("http://www.google.com");
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement el = wait.until(ExpectedConditions.elementToBeClickable(By.name("q")));
el.click();
List <WebElement> allLinks = driver.findElements(By.tagName("a"));
System.out.println(allLinks.size());
driver.quit();
Salida de consola:
Inicio de ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs / branch-heads / 3987 @ {# 185}) en el puerto 41540 Solo se permiten conexiones locales. Proteja los puertos utilizados por ChromeDriver y los marcos de prueba relacionados para evitar el acceso de código malicioso. 11 de febrero de 2020 10:22:12 AM org.openqa.selenium.remote.ProtocolHandshake createSession INFORMACIÓN: Dialecto detectado: W3C [1581412933.937] [SEVERE]: Se agotó el tiempo de recepción del mensaje del procesador: 0.100 [1581412934.066] [SEVERE]: Se agotó el tiempo de espera mensaje de recepción del procesador: 0.100 [1581412934.168] [SEVERE]: Tiempo de espera recibido mensaje del procesador: 0.100 [1581412934.360] [SEVERE]: Tiempo de espera del mensaje de recepción del procesador: 0.100 [1581412934.461] [SEVERE]: Tiempo de espera recibido del mensaje del procesador: 0.100 [1581412934.618] [GRAVE]:
Con la estrategia de PageLoad - Ansioso:
Fragmento de código:
System.setProperty("webdriver.chrome.driver", "C:\\Users\\...\\LatestDriver\\chromedriver.exe");
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.EAGER);
WebDriver driver=new ChromeDriver(options);
driver.get("http://www.google.com");
driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 20);
WebElement el = wait.until(ExpectedConditions.elementToBeClickable(By.name("q")));
el.click();
List <WebElement> allLinks = driver.findElements(By.tagName("a"));
System.out.println(allLinks.size());
driver.quit();
Salida de consola:
Inicio de ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs / branch-heads / 3987 @ {# 185}) en el puerto 1175 Solo se permiten conexiones locales. Proteja los puertos utilizados por ChromeDriver y los marcos de prueba relacionados para evitar el acceso de código malicioso. 11 de febrero de 2020 10:29:05 AM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Dialecto detectado: W3C
21