Causa raiz: Sempre que você estiver carregando alguma página com a ajuda do driver selenium, driver
aguarde o script até a página estar completamente carregada. Mas, em algum momento, o webdriver leva mais tempo para carregar a página; nesse caso, você verá uma TimeoutException
exceção no seu console.
Solução: quando o carregamento da página demorar muito e você precisar parar de baixar sub-recursos adicionais (imagens, css, js etc.), poderá alterar o pageLoadStrategy por meio do driver da web.
Abaixo do código, basta carregar o conteúdo html da página. Você pode definir a estratégia de carregamento da página no chromeoptions
ChromeOptions options = new ChromeOptions();
options.setPageLoadStrategy(PageLoadStrategy.NONE);
Solução atualizada -2: Estou de acordo com o DebanjanB, a estratégia PageLoad com None, sem baixar arquivos adicionais (imagens, css, js etc.) não é uma boa ideia durante a execução do teste. Eu pesquisei todos os problemas e tentei encontrar uma solução válida. Tentei as opções abaixo, já que em algum momento ele foi capaz de resolver esse 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");
Nenhum deles ajudou. Mas encontrei uma solução novamente com a estratégia de carregamento de página. Desta vez, estamos baixando todos os sub-recursos, mas aguardamos o evento DOMContentLoaded . Essa estratégia chamou Ansioso . Uma pequena definição de todas as três estratégias de carregamento de página disponíveis
1. normal:
Essa estratégia faz com que o Selenium aguarde o carregamento da página inteira (conteúdo html e sub-recursos baixados e analisados).
2. ansioso:
Essa estratégia faz com que o Selenium aguarde o evento DOMContentLoaded (somente conteúdo html baixado e analisado).
3. nenhum:
essa estratégia faz com que o Selenium retorne imediatamente após o recebimento total do conteúdo da página inicial (download do conteúdo html).
NOTA: Por padrão, quando o Selenium carrega uma página, segue a pageLoadStrategy normal.
Snippet de código sem usar a estratégia Pageload (ou Normal, conforme usado pelo selênio por padrão)
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();
Saída do console:
Iniciando o ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs / branch-heads / 3987 @ {# 185}) na porta 41540 Somente conexões locais são permitidas. Proteja as portas usadas pelo ChromeDriver e estruturas de teste relacionadas para impedir o acesso por código malicioso. 11 de fevereiro de 2020 10:22:12 AM org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Dialeto detectado: W3C [1581412933.937] [SEVERE]: excedeu o tempo limite ao receber mensagem do representante: 0.100 [1581412934.066] [SEVERE]: excedeu o tempo limite recebendo mensagem do representante: 0.100 [1581412934.168] [SEVERE]: excedeu o tempo limite recebendo mensagem do representante: 0.100 [1581412934.360] [SEVERE]: expirou o recebimento da mensagem do representante: 0.100 [1581412934.461] [SEVERE]: expirou o recebimento da mensagem do representante: 0.100 [1581412934.618] [GRAVE]:
Com PageLoad Strategy - Eager:
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();
Saída do console:
Iniciando o ChromeDriver 80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs / branch-heads / 3987 @ {# 185}) na porta 1175 Somente conexões locais são permitidas. Proteja as portas usadas pelo ChromeDriver e estruturas de teste relacionadas para impedir o acesso por código malicioso. 11 de fevereiro de 2020 10:29:05 org.openqa.selenium.remote.ProtocolHandshake createSession INFO: Dialeto detectado: W3C
21