Bird
Raised Fist0
Selenium Pythontesting~8 mins

Explicit waits (WebDriverWait) in Selenium Python - Framework Patterns

Choose your learning style10 modes available
Framework Mode - Explicit waits (WebDriverWait)
Folder Structure
selenium-python-project/
├── src/
│   ├── pages/
│   │   ├── __init__.py
│   │   └── login_page.py
│   ├── tests/
│   │   ├── __init__.py
│   │   └── test_login.py
│   ├── utils/
│   │   ├── __init__.py
│   │   └── wait_helpers.py
│   └── config/
│       ├── __init__.py
│       └── settings.py
├── requirements.txt
└── pytest.ini
    
Test Framework Layers
  • Driver Layer: Manages WebDriver setup and teardown (e.g., ChromeDriver).
  • Page Objects: Classes representing web pages with locators and methods using explicit waits for elements.
  • Tests: Test cases that use page objects to perform actions and assertions.
  • Utilities: Helper functions for explicit waits (e.g., wait until element is clickable).
  • Config: Settings for environment URLs, browser options, and timeouts.
Configuration Patterns

Use a settings.py file to store environment URLs, default wait times, and browser options.

# settings.py
BASE_URL = "https://example.com"
DEFAULT_WAIT_TIME = 10  # seconds
BROWSER = "chrome"
    

Use environment variables or command-line options to switch environments or browsers.

Test Reporting and CI/CD Integration
  • Use pytest with plugins like pytest-html for readable HTML reports.
  • Integrate tests into CI/CD pipelines (e.g., GitHub Actions, Jenkins) to run tests on code changes.
  • Capture screenshots on test failures to help debug waits and element visibility issues.
Best Practices
  1. Use explicit waits instead of implicit waits: Explicit waits wait for specific conditions, reducing flaky tests.
  2. Centralize wait helpers: Put explicit wait functions in utilities to reuse and maintain easily.
  3. Wait for meaningful conditions: Wait for elements to be clickable, visible, or present before interacting.
  4. Set reasonable timeout values: Avoid too short or too long waits to balance speed and reliability.
  5. Use Page Object Model: Encapsulate waits inside page methods to keep tests clean and readable.
Self Check

Where in this folder structure would you add a new explicit wait helper function to wait for an element to be visible?

Key Result
Use explicit waits in utility helpers and page objects to improve test reliability and readability.

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