FluentWait helps you wait for something on a web page by checking regularly until it appears or a timeout happens. It lets you control how often to check.
FluentWait with polling in Selenium Java
Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(30))
.pollingEvery(Duration.ofSeconds(5))
.ignoring(NoSuchElementException.class);
WebElement element = wait.until(driver -> driver.findElement(By.id("elementId")));withTimeout sets the maximum wait time.
pollingEvery sets how often to check the condition.
Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(20))
.pollingEvery(Duration.ofSeconds(2))
.ignoring(NoSuchElementException.class);
WebElement element = wait.until(driver -> driver.findElement(By.cssSelector(".my-class")));Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(10))
.pollingEvery(Duration.ofMillis(500))
.ignoring(NoSuchElementException.class);
Boolean isVisible = wait.until(driver -> driver.findElement(By.id("btnSubmit")).isDisplayed());This program opens a browser, goes to example.com, and waits up to 15 seconds checking every 3 seconds for an element with id 'dynamicElement'. If found, it prints the element's text. If not found in time, it prints a message.
import org.openqa.selenium.By; import org.openqa.selenium.NoSuchElementException; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.support.ui.FluentWait; import org.openqa.selenium.support.ui.Wait; import java.time.Duration; import java.util.function.Function; public class FluentWaitExample { public static void main(String[] args) { System.setProperty("webdriver.chrome.driver", "path/to/chromedriver"); WebDriver driver = new ChromeDriver(); try { driver.get("https://example.com"); Wait<WebDriver> wait = new FluentWait<>(driver) .withTimeout(Duration.ofSeconds(15)) .pollingEvery(Duration.ofSeconds(3)) .ignoring(NoSuchElementException.class); WebElement dynamicElement = wait.until(new Function<WebDriver, WebElement>() { public WebElement apply(WebDriver driver) { return driver.findElement(By.id("dynamicElement")); } }); System.out.println("Element found: " + dynamicElement.getText()); } catch (Exception e) { System.out.println("Element not found within timeout."); } finally { driver.quit(); } } }
Always set a reasonable timeout to avoid long waits.
Polling interval should balance between responsiveness and resource use.
Ignoring exceptions helps avoid test failure during waiting.
FluentWait lets you wait for elements with custom timeout and polling.
You can ignore exceptions while waiting to keep tests stable.
Use FluentWait when elements load dynamically and timing is uncertain.
Practice
FluentWait in Selenium Java?Solution
Step 1: Understand FluentWait functionality
FluentWait allows waiting for a condition with a custom timeout and polling frequency.Step 2: Compare options with FluentWait purpose
Only To wait for an element with a custom timeout and polling interval describes waiting with custom timeout and polling, which matches FluentWait's use.Final Answer:
To wait for an element with a custom timeout and polling interval -> Option BQuick Check:
FluentWait = custom wait with polling [OK]
- Confusing FluentWait with immediate findElement
- Thinking FluentWait throws exception immediately
- Assuming FluentWait skips polling
Solution
Step 1: Check correct Duration usage for pollingEvery
pollingEvery expects a Duration object, so Duration.ofMillis(500) is correct for 500 ms.Step 2: Analyze other options for syntax errors
new FluentWait(driver).pollingEvery(Duration.ofSeconds(500)) uses seconds instead of milliseconds; B uses deprecated TimeUnit syntax; C uses int without Duration.Final Answer:
new FluentWait(driver).pollingEvery(Duration.ofMillis(500)) -> Option AQuick Check:
pollingEvery needs Duration.ofMillis for milliseconds [OK]
- Using Duration.ofSeconds instead of ofMillis for milliseconds
- Passing int directly without Duration
- Using deprecated TimeUnit with pollingEvery
Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(5))
.pollingEvery(Duration.ofSeconds(1))
.ignoring(NoSuchElementException.class);
WebElement element = wait.until(d -> d.findElement(By.id("dynamicElement")));
System.out.println(element.getText());Solution
Step 1: Understand FluentWait behavior with polling and timeout
The wait polls every 1 second up to 5 seconds, ignoring NoSuchElementException until element appears.Step 2: Analyze timing and result
Since element appears after 3 seconds, wait finds it before timeout and prints its text.Final Answer:
The element is found and its text is printed after about 3 seconds -> Option CQuick Check:
FluentWait polls until element found or timeout [OK]
- Expecting immediate exception on missing element
- Assuming wait always waits full timeout
- Thinking element text prints null if not found
Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(10))
.pollingEvery(500)
.ignoring(NoSuchElementException.class);
WebElement element = wait.until(d -> d.findElement(By.id("test")));
Solution
Step 1: Check pollingEvery parameter type
pollingEvery expects a Duration object, but 500 (int) is passed, causing a compile error.Step 2: Verify other method usages
withTimeout(Duration.ofSeconds(10)) is correct; ignoring NoSuchElementException is valid; FluentWait works with WebDriver.Final Answer:
pollingEvery should use Duration, not int -> Option AQuick Check:
pollingEvery requires Duration parameter [OK]
- Passing int directly to pollingEvery
- Confusing withTimeout units
- Thinking ignoring exceptions is invalid
NoSuchElementException and ElementNotVisibleException. Which FluentWait code snippet correctly implements this?Solution
Step 1: Check timeout and polling interval syntax
withTimeout and pollingEvery correctly use Duration.ofSeconds(10) and Duration.ofSeconds(2) in new FluentWait<>(driver) .withTimeout(Duration.ofSeconds(10)) .pollingEvery(Duration.ofSeconds(2)) .ignoring(NoSuchElementException.class) .ignoring(ElementNotVisibleException.class) .until(d -> d.findElement(By.id("submitBtn")));.Step 2: Verify ignoring multiple exceptions
new FluentWait<>(driver) .withTimeout(Duration.ofSeconds(10)) .pollingEvery(Duration.ofSeconds(2)) .ignoring(NoSuchElementException.class) .ignoring(ElementNotVisibleException.class) .until(d -> d.findElement(By.id("submitBtn"))); chains .ignoring() calls for each exception, which is valid. new FluentWait<>(driver) .withTimeout(Duration.ofSeconds(10)) .pollingEvery(Duration.ofSeconds(2)) .ignoring(NoSuchElementException.class, ElementNotVisibleException.class) .until(d -> d.findElement(By.id("submitBtn"))); tries to pass two exceptions in one call, which is invalid.Step 3: Confirm other options
new FluentWait<>(driver) .withTimeout(10) .pollingEvery(2) .ignoring(NoSuchElementException.class) .ignoring(ElementNotVisibleException.class) .until(d -> d.findElement(By.id("submitBtn"))); uses int instead of Duration, causing errors. new FluentWait<>(driver) .withTimeout(Duration.ofSeconds(10)) .pollingEvery(Duration.ofSeconds(2)) .ignoring(NoSuchElementException.class) .until(d -> d.findElement(By.id("submitBtn"))); ignores only one exception, missing ElementNotVisibleException.Final Answer:
new FluentWait<>(driver) .withTimeout(Duration.ofSeconds(10)) .pollingEvery(Duration.ofSeconds(2)) .ignoring(NoSuchElementException.class) .ignoring(ElementNotVisibleException.class) .until(d -> d.findElement(By.id("submitBtn"))); -> Option DQuick Check:
Chain ignoring() for multiple exceptions with Duration times [OK]
- Passing multiple exceptions in one ignoring() call
- Using int instead of Duration for time values
- Ignoring only one exception when multiple needed
Ready to prove it?
Pass the test and this pattern moves unknown
