WebDriver - wait for element using Java WebDriver - wait for element using Java java java

WebDriver - wait for element using Java


This is how I do it in my code.

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

or

wait.until(ExpectedConditions.elementToBeClickable(By.id<locator>));

to be precise.

See also:


You can use Explicit wait or Fluent Wait

Example of Explicit Wait -

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

Example of Fluent Wait -

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

Check this TUTORIAL for more details.


We're having a lot of race conditions with elementToBeClickable. See https://github.com/angular/protractor/issues/2313. Something along these lines worked reasonably well even if a little brute force

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)        );