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:
- org.openqa.selenium.support.ui.ExpectedConditions for similar shortcuts for various wait scenarios.
- org.openqa.selenium.support.ui.WebDriverWait for its various constructors.
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) );