How to wait until an element is present in Selenium?

JavaSeleniumSelenium WebdriverWaitPredicate

Java Problem Overview


I'm trying to make Selenium wait for an element that is dynamically added to the DOM after page load. Tried this:

fluentWait.until(ExpectedConditions.presenceOfElement(By.id("elementId"));

In case it helps, here is fluentWait:

FluentWait fluentWait = new FluentWait<>(webDriver) {
    .withTimeout(30, TimeUnit.SECONDS)
    .pollingEvery(200, TimeUnit.MILLISECONDS);
}

But it throws a NoSuchElementException - looks like presenceOfElement expects the element to be there so this is flawed. This must be bread and butter to Selenium and don't want to reinvent the wheel... could anyone suggest an alternative, ideally without rolling my own Predicate?

Java Solutions


Solution 1 - Java

You need to call ignoring with exception to ignore while the WebDriver will wait.

FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
        .withTimeout(30, TimeUnit.SECONDS)
        .pollingEvery(200, TimeUnit.MILLISECONDS)
        .ignoring(NoSuchElementException.class);

See the documentation of FluentWait for more info. But beware that this condition is already implemented in ExpectedConditions so you should use

WebElement element = (new WebDriverWait(driver, 10))
   .until(ExpectedConditions.elementToBeClickable(By.id("someid")));

*Update for newer versions of Selenium:

withTimeout(long, TimeUnit) has become withTimeout(Duration)
pollingEvery(long, TimeUnit) has become pollingEvery(Duration)

So the code will look as such:

FluentWait<WebDriver> fluentWait = new FluentWait<>(driver)
        .withTimeout(Duration.ofSeconds(30)
        .pollingEvery(Duration.ofMillis(200)
        .ignoring(NoSuchElementException.class);

Basic tutorial for waiting can be found here.

Solution 2 - Java

WebDriverWait wait = new WebDriverWait(driver,5)
wait.until(ExpectedConditions.visibilityOf(element));

you can use this as some time before loading whole page code gets executed and throws and error. time is in second

Solution 3 - Java

Let me recommend you using Selenide library. It allows writing much more concise and readable tests. It can wait for presence of elements with much shorter syntax:

$("#elementId").shouldBe(visible);

Here is a sample project for testing Google search: https://github.com/selenide-examples/google

Solution 4 - Java

public WebElement fluientWaitforElement(WebElement element, int timoutSec, int pollingSec) {

	FluentWait<WebDriver> fWait = new FluentWait<WebDriver>(driver).withTimeout(timoutSec, TimeUnit.SECONDS)
		.pollingEvery(pollingSec, TimeUnit.SECONDS)
		.ignoring(NoSuchElementException.class, TimeoutException.class).ignoring(StaleElementReferenceException.class);

	for (int i = 0; i < 2; i++) {
	    try {
	    	//fWait.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("//*[@id='reportmanager-wrapper']/div[1]/div[2]/ul/li/span[3]/i[@data-original--title='We are processing through trillions of data events, this insight may take more than 15 minutes to complete.']")));
		fWait.until(ExpectedConditions.visibilityOf(element));
		fWait.until(ExpectedConditions.elementToBeClickable(element));
	    } catch (Exception e) {
		
		System.out.println("Element Not found trying again - " + element.toString().substring(70));
		e.printStackTrace();

	    }
	}

	return element;

    }

Solution 5 - Java

FluentWait throws a NoSuchElementException is case of the confusion

org.openqa.selenium.NoSuchElementException;		

with

java.util.NoSuchElementException

in

.ignoring(NoSuchElementException.class)

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionSteve ChambersView Question on Stackoverflow
Solution 1 - JavaPetr MensikView Answer on Stackoverflow
Solution 2 - JavabhupendraView Answer on Stackoverflow
Solution 3 - JavaAndrei SolntsevView Answer on Stackoverflow
Solution 4 - JavaAshwiniView Answer on Stackoverflow
Solution 5 - JavapalandlomView Answer on Stackoverflow