WebDriver – aguarde o elemento usando Java

Eu estou procurando por algo semelhante ao waitForElementPresent para verificar se o elemento é exibido antes de clicar nele. Eu pensei que isso pode ser feito por implicitWait , então usei o seguinte:

 driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS); 

e depois clique por

 driver.findElement(By.id(prop.getProperty(vName))).click(); 

Infelizmente, às vezes, aguarda o elemento e às vezes não. Eu olhei por um tempo e encontrei esta solução:

 for (int second = 0;; second++) { Thread.sleep(sleepTime); if (second >= 10) fail("timeout : " + vName); try { if (driver.findElement(By.id(prop.getProperty(vName))) .isDisplayed()) break; } catch (Exception e) { writeToExcel("data.xls", e.toString(), parameters.currentTestRow, 46); } } driver.findElement(By.id(prop.getProperty(vName))).click(); 

E esperou tudo bem, mas antes do tempo limite tinha que esperar 10 vezes 5, 50 segundos. Um pouco demais. Então eu coloquei implicitamente a espera para 1sec e tudo parecia bem até agora. Porque agora algumas coisas esperam 10s antes do tempo limite, mas algumas outras coisas param após 1s.

Como você cobre a espera pelo elemento presente / visível em seu código? Qualquer sugestão é apreciável.

É assim que faço no meu código.

 WebDriverWait wait = new WebDriverWait(webDriver, timeoutInSeconds); wait.until(ExpectedConditions.visibilityOfElementLocated(By.id)); 

ou

 wait.until(ExpectedConditions.elementToBeClickable(By.id)); 

para ser mais preciso.

Veja também:

  • org.openqa.selenium.support.ui.ExpectedConditions para atalhos semelhantes para vários cenários de espera.
  • org.openqa.selenium.support.ui.WebDriverWait por seus vários construtores.

Você pode usar Espera explícita ou Espera fluida

Exemplo de espera explícita –

 WebDriverWait wait = new WebDriverWait(WebDriverRefrence,20); WebElement aboutMe; aboutMe= wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("about_me"))); 

Exemplo de espera fluente –

 Wait wait = new FluentWait(driver) .withTimeout(20, TimeUnit.SECONDS) .pollingEvery(5, TimeUnit.SECONDS) .ignoring(NoSuchElementException.class); WebElement aboutMe= wait.until(new Function() { public WebElement apply(WebDriver driver) { return driver.findElement(By.id("about_me")); } }); 

Verifique este TUTORIAL para mais detalhes.

Estamos tendo muitas condições de corrida com elementToBeClickable . Veja https://github.com/angular/protractor/issues/2313 . Algo ao longo destas linhas funcionou razoavelmente bem, mesmo que um pouco de força bruta

 Awaitility.await() .atMost(timeout) .ignoreException(NoSuchElementException.class) .ignoreExceptionsMatching( Matchers.allOf( Matchers.instanceOf(WebDriverException.class), Matchers.hasProperty( "message", Matchers.containsString("is not clickable at point") ) ) ).until( () -> { this.driver.findElement(locator).click(); return true; }, Matchers.is(true) ); 

A declaração acima de espera é um bom exemplo de espera explícita.

As esperas explícitas são esperas inteligentes que estão confinadas a um determinado elemento da web (como mencionado no x-path acima).

Usando Esperas explícitas, você está basicamente dizendo ao WebDriver no máximo que é esperar pelas unidades X (o que você tiver dado como timeoutInSeconds) antes de desistir.