Bird
Raised Fist0
Selenium Pythontesting~15 mins

Explicit waits (WebDriverWait) in Selenium Python - Build an Automation Script

Choose your learning style10 modes available
Verify login button becomes clickable after page load
Preconditions (3)
Step 1: Open the browser and navigate to 'https://example.com/login'
Step 2: Wait until the login button with id 'loginBtn' is clickable
Step 3: Click the login button
Step 4: Verify that the URL changes to 'https://example.com/dashboard'
✅ Expected Result: The login button becomes clickable after page load, clicking it navigates to the dashboard page
Automation Requirements - Selenium with Python
Assertions Needed:
Assert login button is clickable before clicking
Assert current URL is 'https://example.com/dashboard' after clicking
Best Practices:
Use WebDriverWait with expected_conditions for explicit waits
Avoid using time.sleep() for waiting
Use By.ID locator for the login button
Handle exceptions if element is not found or not clickable
Automated Solution
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
from selenium.common.exceptions import TimeoutException

# Initialize the Chrome WebDriver
with webdriver.Chrome() as driver:
    driver.get('https://example.com/login')

    try:
        # Wait up to 10 seconds until the login button is clickable
        wait = WebDriverWait(driver, 10)
        login_button = wait.until(EC.element_to_be_clickable((By.ID, 'loginBtn')))

        # Click the login button
        login_button.click()

        # Wait until URL changes to dashboard
        wait.until(EC.url_to_be('https://example.com/dashboard'))

        # Assert the current URL is the dashboard URL
        assert driver.current_url == 'https://example.com/dashboard', f"Expected URL to be 'https://example.com/dashboard' but got {driver.current_url}"

        print('Test Passed: Login button clickable and dashboard loaded')

    except TimeoutException:
        print('Test Failed: Element not clickable or URL did not change in time')

This script uses Selenium WebDriver with Python to automate the manual test case.

First, it opens the browser and navigates to the login page URL.

Then, it uses WebDriverWait with expected_conditions.element_to_be_clickable to wait up to 10 seconds for the login button to become clickable. This is better than using fixed waits because it waits only as long as needed.

After the button is clickable, it clicks the button.

Next, it waits until the URL changes to the dashboard URL using expected_conditions.url_to_be.

Finally, it asserts that the current URL is the expected dashboard URL to confirm navigation succeeded.

Exceptions like TimeoutException are caught to handle cases where the button never becomes clickable or the URL does not change in time, printing a failure message.

This approach follows best practices by using explicit waits, proper locators, and assertions.

Common Mistakes - 3 Pitfalls
Using time.sleep() instead of explicit waits
Using incorrect locator types or hardcoded XPath
Not handling exceptions for element not found or timeout
Bonus Challenge

Now add data-driven testing with 3 different login URLs and verify the login button on each page becomes clickable.

Show Hint

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