0
0
Selenium-pythonHow-ToBeginner · 4 min read

How to Use Fluent Wait in Selenium Python for Dynamic Elements

Use FluentWait in Selenium Python by importing WebDriverWait with custom poll_frequency and ignored_exceptions. It waits for an element with a flexible timeout and polling interval, retrying until the element is found or timeout occurs.
📐

Syntax

The FluentWait in Selenium Python is implemented using WebDriverWait with parameters for timeout, polling frequency, and exceptions to ignore. It repeatedly checks for a condition until it is met or the timeout expires.

  • driver: Your Selenium WebDriver instance.
  • timeout: Maximum wait time in seconds.
  • poll_frequency: How often to check the condition (in seconds).
  • ignored_exceptions: Exceptions to ignore while waiting (e.g., NoSuchElementException).
python
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.by import By

wait = WebDriverWait(driver, timeout=10, poll_frequency=0.5, ignored_exceptions=[NoSuchElementException])
element = wait.until(EC.presence_of_element_located((By.ID, 'element_id')))
💻

Example

This example shows how to use Fluent Wait to wait for an element with ID dynamicElement to appear on the page. It checks every 0.5 seconds for up to 10 seconds, ignoring NoSuchElementException during the wait.

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 NoSuchElementException

# Setup WebDriver (make sure chromedriver is in PATH)
driver = webdriver.Chrome()
driver.get('https://example.com')  # Replace with your URL

# Fluent Wait setup
wait = WebDriverWait(driver, timeout=10, poll_frequency=0.5, ignored_exceptions=[NoSuchElementException])

try:
    element = wait.until(EC.presence_of_element_located((By.ID, 'dynamicElement')))
    print('Element found:', element.text)
except Exception as e:
    print('Element not found within timeout')

# Cleanup
driver.quit()
Output
Element found: (text of the element) OR Element not found within timeout
⚠️

Common Pitfalls

  • Not setting poll_frequency leads to default 0.5 seconds, which might be too slow or too fast for some cases.
  • Ignoring wrong exceptions can cause the wait to fail prematurely.
  • Using time.sleep() instead of Fluent Wait causes inefficient fixed delays.
  • Not quitting the driver after the test can leave browser instances open.
python
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# Wrong way: Using time.sleep (fixed wait)
import time

time.sleep(10)  # Waits fixed 10 seconds regardless of element presence

# Right way: Using Fluent Wait
wait = WebDriverWait(driver, 10, poll_frequency=0.5, ignored_exceptions=[NoSuchElementException])
try:
    element = wait.until(EC.presence_of_element_located((By.ID, 'dynamicElement')))
except TimeoutException:
    print('Element not found in time')
📊

Quick Reference

Fluent Wait Parameters:

  • timeout: Max wait time in seconds.
  • poll_frequency: Interval between checks.
  • ignored_exceptions: Exceptions to ignore during wait.

Common Expected Conditions:

  • presence_of_element_located(locator)
  • element_to_be_clickable(locator)
  • visibility_of_element_located(locator)

Key Takeaways

Use WebDriverWait with poll_frequency and ignored_exceptions for Fluent Wait in Selenium Python.
Fluent Wait retries checking for an element until timeout, improving test reliability for dynamic pages.
Avoid fixed waits like time.sleep() to keep tests fast and responsive.
Always handle exceptions like TimeoutException to manage wait failures gracefully.
Quit the WebDriver after tests to free resources.