Explicit wait helps your test wait for a specific condition before continuing. This avoids errors when elements take time to appear or become ready.
Waiting for a button to become clickable before clicking it.
Waiting for a text message to appear after submitting a form.
Waiting for a page element to load after navigation.
Waiting for a dropdown list to be populated before selecting an option.
Syntax
Selenium Java
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
wait.until(ExpectedConditions.elementToBeClickable(By.id("elementId")));
Use WebDriverWait with a maximum wait time.
Use ExpectedConditions to specify what to wait for.
Examples
Waits up to 5 seconds for an element with class 'my-class' to be visible.
Selenium Java
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".my-class")));
Waits up to 15 seconds for the page title to contain the word 'Welcome'.
Selenium Java
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(15));
wait.until(ExpectedConditions.titleContains("Welcome"));
Sample Program
This test opens a login page, waits for the username field and login button to be ready, performs login, then waits for a welcome message to confirm success.
Selenium Java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.time.Duration;
public class ExplicitWaitExample {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
WebDriver driver = new ChromeDriver();
try {
driver.get("https://example.com/login");
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
// Wait for username field to be visible
WebElement username = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("username")));
username.sendKeys("testuser");
// Wait for login button to be clickable
WebElement loginButton = wait.until(ExpectedConditions.elementToBeClickable(By.id("loginBtn")));
loginButton.click();
// Wait for welcome message to appear
WebElement welcomeMsg = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("welcomeMessage")));
System.out.println("Welcome message displayed: " + welcomeMsg.isDisplayed());
} finally {
driver.quit();
}
}
}
OutputSuccess
Important Notes
Always set a reasonable timeout to avoid long waits.
Explicit wait is better than fixed sleep because it waits only as long as needed.
Use specific ExpectedConditions for reliable waits.
Summary
Explicit wait pauses test until a condition is met or timeout occurs.
Use WebDriverWait with ExpectedConditions to wait for elements or page states.
This helps tests run smoothly on slow or dynamic web pages.
Practice
(1/5)
1. What is the main purpose of using WebDriverWait in Selenium tests?
easy
A. To automatically retry failed tests
B. To speed up the test execution by skipping waits
C. To pause the test until a specific condition is met or timeout occurs
D. To capture screenshots during test execution
Solution
Step 1: Understand the role of waits in Selenium
Waits help tests handle dynamic page content by pausing until elements are ready.
Step 2: Identify what WebDriverWait does
WebDriverWait explicitly waits for a condition like element visibility or clickability before proceeding.
Final Answer:
To pause the test until a specific condition is met or timeout occurs -> Option C
Quick Check:
Explicit wait = pause until condition met [OK]
Hint: Waits pause tests until conditions, not speed up [OK]
Common Mistakes:
Confusing explicit wait with implicit wait
Thinking it speeds up tests by skipping steps
Using it to retry tests automatically
2. Which of the following is the correct syntax to create a WebDriverWait object with a 10-second timeout in Java?
easy
A. WebDriverWait wait = new WebDriverWait(driver, 10);
B. WebDriverWait wait = new WebDriverWait(Duration.ofSeconds(10), driver);
C. WebDriverWait wait = new WebDriverWait(10, driver);
D. WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
Solution
Step 1: Recall the constructor for WebDriverWait in Selenium 4+
It requires the WebDriver instance and a Duration object for timeout.
Step 2: Match the correct syntax
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); uses Duration.ofSeconds(10) correctly with the driver as first argument.
Final Answer:
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10)); -> Option D
Quick Check:
Use Duration for timeout in WebDriverWait [OK]
Hint: Use Duration.ofSeconds for timeout in WebDriverWait [OK]
Common Mistakes:
Passing timeout as int instead of Duration
Swapping driver and timeout arguments
Using deprecated constructors
3. What will happen when the following code runs if the element with id "submitBtn" becomes clickable after 5 seconds?
A. The test waits up to 10 seconds, finds the button when clickable, then clicks it
B. The test immediately throws a timeout exception
C. The test clicks the button immediately without waiting
D. The test waits 5 seconds then throws a stale element exception
Solution
Step 1: Understand the wait condition and timeout
The wait will pause up to 10 seconds for the button to become clickable.
Step 2: Analyze the element state after 5 seconds
The button becomes clickable after 5 seconds, so wait.until returns the element successfully.
Final Answer:
The test waits up to 10 seconds, finds the button when clickable, then clicks it -> Option A
Quick Check:
Waits up to timeout, proceeds when condition met [OK]
Hint: Waits up to timeout, proceeds once condition is true [OK]
Common Mistakes:
Assuming immediate failure if element not ready
Thinking wait always waits full timeout
Confusing stale element with clickable condition
4. Identify the error in this code snippet using WebDriverWait:
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("username")));
medium
A. ExpectedConditions is not imported
B. Timeout value should be wrapped in Duration.ofSeconds()
C. By.id() cannot be used with visibilityOfElementLocated
D. wait.until() should return a boolean, not void
Solution
Step 1: Check the WebDriverWait constructor usage
Since Selenium 4, the timeout must be a Duration object, not an int.
Step 2: Confirm the correct way to specify timeout
Use Duration.ofSeconds(10) to specify 10 seconds timeout.
Final Answer:
Timeout value should be wrapped in Duration.ofSeconds() -> Option B
Quick Check:
Timeout must be Duration, not int [OK]
Hint: Use Duration.ofSeconds for timeout, not plain int [OK]
Common Mistakes:
Passing int instead of Duration causes compile error
Ignoring import errors for ExpectedConditions
Misunderstanding return type of wait.until()
5. You want to wait for a button with CSS class "submit-btn" to be clickable, but only wait up to 5 seconds. If it doesn't become clickable, you want to log a message and continue without failing the test. Which code snippet correctly implements this using WebDriverWait?
hard
A. try {
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
WebElement btn = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(".submit-btn")));
btn.click();
} catch (TimeoutException e) {
System.out.println("Button not clickable in time, continuing test.");
}
B. WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
WebElement btn = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(".submit-btn")));
btn.click();
System.out.println("Button not clickable in time, continuing test.");
C. WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
if (wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(".submit-btn")))) {
driver.findElement(By.cssSelector(".submit-btn")).click();
} else {
System.out.println("Button not clickable in time, continuing test.");
}
D. WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));
WebElement btn = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector(".submit-btn")));
btn.click();
Solution
Step 1: Use try-catch to handle timeout without failing test
Wrap the wait in try block and catch TimeoutException to log and continue.
Step 2: Use elementToBeClickable with correct selector and timeout
Create WebDriverWait with 5 seconds timeout and wait for clickable condition.
Step 3: Click the button if found, else log message
If wait succeeds, click the button; if timeout occurs, catch block logs message and test continues.
Final Answer:
Code with try-catch around wait and logging on timeout -> Option A
Quick Check:
Handle timeout with try-catch to continue test [OK]
Hint: Use try-catch around wait to handle timeout gracefully [OK]
Common Mistakes:
Not catching TimeoutException causing test failure
Using visibility instead of clickable condition
Logging message after wait without exception handling
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.