Causa principale: ogni volta che si carica una pagina con l'aiuto del driver di selenio, lo driver
script attende fino al completo caricamento della pagina. Ma a volte il webdriver impiega più tempo a caricare la pagina, in tal caso vedrai TimeoutException
un'eccezione nella tua console.
Soluzione: quando il caricamento della pagina richiede troppo tempo ed è necessario interrompere il download di risorse secondarie aggiuntive (immagini, css, js ecc.), È possibile modificare pageLoadStrategy tramite il webdriver.
Sotto il codice basta caricare il contenuto html dalla pagina. Puoi impostare la strategia di caricamento della pagina da chromeoptions
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.NONE);
Soluzione aggiornata -2: sono d'accordo con DebanjanB, la strategia PageLoad con None, senza scaricare file aggiuntivi (immagini, css, js ecc.) Non è una buona idea durante l'esecuzione dei test. Ho cercato tutti i problemi al riguardo e ho cercato di trovare una soluzione valida. Ho provato di seguito le opzioni in quanto a un certo punto è stato in grado di risolvere questo 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");
Nessuno di loro ha aiutato Ma ho trovato di nuovo una soluzione con la strategia di caricamento della pagina. Questa volta stiamo scaricando tutte le risorse secondarie ma stiamo aspettando l' evento DOMContentLoaded . Questa strategia chiamata Eager . Una piccola definizione di tutte e 3 le strategie di pageload disponibili
1. normale:
questa strategia fa sì che Selenium attenda il caricamento della pagina intera (contenuto html e risorse secondarie scaricate e analizzate).
2. desideroso:
questa strategia fa sì che Selenium attenda l'evento DOMContentLoaded (solo contenuto html scaricato e analizzato).
3. nessuno:
questa strategia fa sì che Selenium ritorni immediatamente dopo che il contenuto della pagina iniziale è stato completamente ricevuto (contenuto html scaricato).
NOTA: per impostazione predefinita, quando Selenium carica una pagina, segue la normale paginaLoadStrategy.
Snippet di codice senza utilizzare la strategia Pageload (o normale come utilizzato dal selenio per impostazione predefinita)
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();
Uscita console:
Avvio di ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs / branch-heads / 3987 @ {# 185}) sulla porta 41540 Sono consentite solo connessioni locali. Proteggi le porte utilizzate da ChromeDriver e i relativi framework di test per impedire l'accesso con codice dannoso. 11 febbraio 2020 10:22:12 org.openqa.selenium.remote.ProtocolHandshake createSession INFO: dialetto rilevato: W3C [1581412933.937] [SEVERE]: Timeout ricezione messaggio dal renderer: 0.100 [1581412934.066] [SEVERE]: Timeout ricezione messaggio dal renderer: 0.100 [1581412934.168] [SEVERE]: timeout ricezione messaggio dal renderer: 0.100 [1581412934.360] [SEVERE]: timeout ricezione messaggio dal renderer: 0.100 [1581412934.461] [SEVERE]: timeout ricezione messaggio dal renderer: 0.100 [1581412934.618] [SEVERE]:
Con PageLoad Strategy - Desideroso:
Snippet di codice:
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();
Uscita console:
Avvio di ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs / branch-heads / 3987 @ {# 185}) sulla porta 1175 Sono consentite solo connessioni locali. Proteggi le porte utilizzate da ChromeDriver e i relativi framework di test per impedire l'accesso con codice dannoso. 11 febbraio 2020 10:29:05 org.openqa.selenium.remote.ProtocolHandshake createSession INFO: dialetto rilevato: W3C
21