0
0
Selenium-pythonHow-ToBeginner · 3 min read

How to Wait for Element to Be Visible in Selenium

In Selenium, you can wait for an element to be visible by using WebDriverWait combined with ExpectedConditions.visibility_of_element_located. This explicit wait pauses the test until the element appears and is visible on the page or until a timeout occurs.
📐

Syntax

The syntax uses WebDriverWait to create a wait object and ExpectedConditions.visibility_of_element_located to specify the condition to wait for.

  • WebDriverWait(driver, timeoutInSeconds): Creates a wait with a maximum timeout.
  • until(condition): Waits until the condition is true or timeout.
  • ExpectedConditions.visibility_of_element_located(By.locator): Waits for the element located by the given locator to be visible.
python
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, 10)  # wait up to 10 seconds
visible_element = wait.until(EC.visibility_of_element_located((By.ID, 'element_id')))
💻

Example

This example opens a webpage, waits for a button with ID submit-btn to become visible, then clicks it.

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 WebDriver (Chrome in this example)
driver = webdriver.Chrome()
driver.get('https://example.com')

try:
    wait = WebDriverWait(driver, 10)  # wait up to 10 seconds
    button = wait.until(EC.visibility_of_element_located((By.ID, 'submit-btn')))
    button.click()
    print('Button clicked successfully.')
except Exception as e:
    print(f'Element not visible or other error: {e}')
finally:
    driver.quit()
Output
Button clicked successfully.
⚠️

Common Pitfalls

  • Using time.sleep() instead of explicit waits causes unnecessary delays or flaky tests.
  • Waiting for element presence (presence_of_element_located) instead of visibility can cause errors if the element is hidden.
  • Not using a tuple for the locator in visibility_of_element_located leads to errors.
  • Ignoring exceptions like TimeoutException can hide why a test failed.
python
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

wait = WebDriverWait(driver, 10)

# Wrong: missing tuple for locator
# element = wait.until(EC.visibility_of_element_located(By.ID, 'submit-btn'))  # This will raise an error

# Right:
element = wait.until(EC.visibility_of_element_located((By.ID, 'submit-btn')))

# Handling timeout exception
try:
    element = wait.until(EC.visibility_of_element_located((By.ID, 'submit-btn')))
except TimeoutException:
    print('Element was not visible within 10 seconds.')
📊

Quick Reference

Use this quick guide to remember how to wait for visibility:

StepCode SnippetDescription
1wait = WebDriverWait(driver, 10)Create a wait object with 10 seconds timeout
2locator = (By.ID, 'element_id')Define the locator as a tuple
3element = wait.until(EC.visibility_of_element_located(locator))Wait until element is visible
4element.click()Interact with the visible element

Key Takeaways

Use WebDriverWait with ExpectedConditions.visibility_of_element_located to wait for element visibility.
Always pass the locator as a tuple, e.g., (By.ID, 'id_value').
Avoid using fixed sleeps; explicit waits make tests reliable and faster.
Handle TimeoutException to catch cases when elements do not appear.
Waiting for presence is not enough; visibility ensures the element can be interacted with.