Bird
Raised Fist0
Selenium Pythontesting~5 mins

Explicit waits (WebDriverWait) in Selenium Python

Choose your learning style10 modes available
Introduction

Explicit waits help your test wait for a specific condition before moving on. This avoids errors when elements take time to appear or change.

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 popup or alert to show up before interacting.
Waiting for a loading spinner to disappear before checking results.
Syntax
Selenium Python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, timeout_in_seconds)
wait.until(EC.condition((By.LOCATOR_TYPE, 'locator_value')))

WebDriverWait creates a wait object with a max time to wait.

until() pauses test until the condition is true or timeout happens.

Examples
Waits up to 10 seconds for the button with ID 'submit-btn' to be clickable.
Selenium Python
wait = WebDriverWait(driver, 10)
wait.until(EC.element_to_be_clickable((By.ID, 'submit-btn')))
Waits up to 5 seconds for an element with class 'message' to be visible.
Selenium Python
wait = WebDriverWait(driver, 5)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, '.message')))
Sample Program

This script opens a webpage and waits up to 10 seconds for a login button to be clickable. It prints a success message if clickable, or an error if not.

Selenium Python
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Setup driver (using Chrome as example)
driver = webdriver.Chrome()
driver.get('https://example.com')

try:
    wait = WebDriverWait(driver, 10)
    # Wait for the login button to be clickable
    login_button = wait.until(EC.element_to_be_clickable((By.ID, 'login-btn')))
    print('Login button is clickable.')
except Exception as e:
    print('Login button not clickable:', e)
finally:
    driver.quit()
OutputSuccess
Important Notes

Always import expected_conditions as EC for readability.

Use tuples like (By.ID, 'value') as locators inside conditions.

Explicit waits are better than fixed sleeps because they wait only as long as needed.

Summary

Explicit waits pause test until a condition is met or timeout occurs.

Use WebDriverWait with expected conditions for reliable element interaction.

This helps tests handle slow loading or dynamic page changes smoothly.

Practice

(1/5)
1. What is the main purpose of using WebDriverWait in Selenium tests?
easy
A. To automatically retry failed tests
B. To pause the test for a fixed amount of time regardless of conditions
C. To speed up the test execution by skipping waits
D. To wait explicitly until a certain condition is met or timeout occurs

Solution

  1. Step 1: Understand the role of explicit waits

    Explicit waits pause the test until a specific condition is true or a timeout happens, making tests more reliable.
  2. Step 2: Compare with other wait types

    Unlike fixed waits, explicit waits respond to page conditions, not just time delays.
  3. Final Answer:

    To wait explicitly until a certain condition is met or timeout occurs -> Option D
  4. Quick Check:

    Explicit wait = wait for condition [OK]
Hint: Explicit waits wait for conditions, not fixed times [OK]
Common Mistakes:
  • Confusing explicit wait with fixed sleep
  • Thinking it speeds up tests
  • Assuming it retries tests automatically
2. Which of the following is the correct syntax to create a WebDriverWait object with a 10-second timeout in Python?
easy
A. wait = WebDriverWait(driver, 10)
B. wait = WebDriverWait(10, driver)
C. wait = WebDriverWait(driver, timeout=10s)
D. wait = WebDriverWait(driver, "10")

Solution

  1. Step 1: Recall WebDriverWait constructor parameters

    The constructor takes the driver first, then the timeout as an integer or float in seconds.
  2. Step 2: Check each option's correctness

    wait = WebDriverWait(driver, 10) matches the correct order and type. wait = WebDriverWait(10, driver) reverses parameters. wait = WebDriverWait(driver, timeout=10s) uses invalid syntax with '10s'. wait = WebDriverWait(driver, "10") passes timeout as string, which is incorrect.
  3. Final Answer:

    wait = WebDriverWait(driver, 10) -> Option A
  4. Quick Check:

    WebDriverWait(driver, seconds) [OK]
Hint: Driver first, then timeout as number [OK]
Common Mistakes:
  • Swapping driver and timeout parameters
  • Using string instead of number for timeout
  • Adding units like 's' in timeout
3. What will be the output of the following code snippet if the element with id 'submit' appears after 3 seconds?
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 5)
element = wait.until(EC.element_to_be_clickable((By.ID, 'submit')))
print('Element found:', element is not None)
medium
A. Element found: False
B. Element found: True
C. TimeoutException error
D. SyntaxError

Solution

  1. Step 1: Understand wait.until behavior

    The wait will pause up to 5 seconds for the element to be clickable. Since the element appears after 3 seconds, it will be found within timeout.
  2. Step 2: Check the print statement output

    The element variable will hold the found element, so 'element is not None' is True, printing 'Element found: True'.
  3. Final Answer:

    Element found: True -> Option B
  4. Quick Check:

    Element appears before timeout = True [OK]
Hint: If element appears before timeout, wait.until returns it [OK]
Common Mistakes:
  • Assuming wait.until returns False if element appears
  • Expecting TimeoutException when element appears in time
  • Confusing syntax errors with runtime behavior
4. Identify the error in this code snippet using WebDriverWait:
wait = WebDriverWait(driver, 10)
wait.until(EC.presence_of_element_located(By.ID, 'username'))
medium
A. Missing tuple around locator in presence_of_element_located
B. Timeout value should be a string, not integer
C. WebDriverWait requires a third parameter for polling
D. EC.presence_of_element_located does not exist

Solution

  1. Step 1: Check expected condition usage

    The method presence_of_element_located expects a single argument: a tuple like (By.ID, 'username').
  2. Step 2: Identify the mistake in argument format

    The code passes By.ID and 'username' as separate arguments, missing the tuple, causing a TypeError.
  3. Final Answer:

    Missing tuple around locator in presence_of_element_located -> Option A
  4. Quick Check:

    Locator must be tuple (By.ID, 'value') [OK]
Hint: Always wrap locator in a tuple for expected conditions [OK]
Common Mistakes:
  • Passing locator arguments separately instead of tuple
  • Using string timeout instead of number
  • Thinking polling parameter is mandatory
5. You want to wait until either a button with id 'save' is clickable or a text element with id 'status' contains the text 'Ready', whichever happens first. Which approach correctly uses explicit waits to handle this?
hard
A. Use implicit wait instead of explicit wait for both elements
B. Use two separate WebDriverWait calls one after another for each condition
C. Use WebDriverWait with a custom expected condition combining both checks using a lambda function
D. Use time.sleep() to wait a fixed time before checking both elements

Solution

  1. Step 1: Understand waiting for multiple conditions

    WebDriverWait can accept a custom function that returns True when either condition is met, allowing waiting for multiple conditions simultaneously.
  2. Step 2: Evaluate options for efficiency and correctness

    Use WebDriverWait with a custom expected condition combining both checks using a lambda function uses a lambda combining both conditions, so wait ends as soon as one is true. Use two separate WebDriverWait calls one after another for each condition waits sequentially, possibly longer. Use implicit wait instead of explicit wait for both elements uses implicit wait, which is not suitable for condition checks. Use time.sleep() to wait a fixed time before checking both elements uses fixed sleep, which is unreliable.
  3. Final Answer:

    Use WebDriverWait with a custom expected condition combining both checks using a lambda function -> Option C
  4. Quick Check:

    Custom combined condition = fastest wait [OK]
Hint: Combine conditions in one wait with lambda [OK]
Common Mistakes:
  • Waiting sequentially causing longer delays
  • Using implicit wait for condition checks
  • Using fixed sleep instead of waits
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard