How to wait until Element is Visible in Selenium Python?


Python Selenium - Wait until specific element is visible

We can wait for a specific element in the webpage to be visible, before performing an action on that element, or some other.

To wait for a specific element in the webpage to be visible, using Selenium in Python, you can use Explicit Waits.

Follow these steps to create an explicit wait condition for an element in Selenium.

1. Create a WebDriverWait object

Set up the WebDriverWait instance, specifying the maximum waiting time in seconds (in this case, 10 seconds).

wait = WebDriverWait(driver, 10)

2. Specify the element locator

This is the element for which we are going to wait for it to load.

Get the appropriate locator (e.g., ID, XPath, CSS selector) for the element.

For example, consider the following element locator, where we identify the element by id attribute.

element_locator = (By.ID, 'element_id')

3. Wait for the element to become visible

Now, write the code to wait for the element to become visible.

The visibility_of_element_located() method from ExpectedConditions is used to create a condition that waits for the element to become visible.

For example, consider the following wait condition applied on the element locator. The until() method returns the element located by the given locator, with the applied visibility condition.

element = wait.until(EC.visibility_of_element_located(element_locator))

Example

In the following program, we load the URL /tmp/selenium/index-18.html.

<html>
<body> 
    <h3>My Form</h3> 
    <form action=""> 
        <label for="firstname">First name:</label> 
        <input type="text" id="firstname" name="firstname"><br><br> 
        <label for="lastname">Last name:</label>
        <input type="text" id="lastname" name="lastname"><br><br>
        <input type="submit" value="Submit">
    </form>
</body>
</html>

And wait for the element (input text field) with id="firstname" to load. Once the element is loaded, we shall enter some text into the input text field, and take a screenshot of that element.

Python Program

from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

# Setup chrome driver
driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))

# Navigate to the url
driver.get('/tmp/selenium/index-18.html')

# Set the maximum waiting time in seconds
wait = WebDriverWait(driver, 10)  # Adjust the waiting time (e.g., 10 seconds)

# Find the element you want to wait for (using any appropriate locator)
element_locator = (By.ID, 'firstname')  # Replace 'element_id' with the actual ID of the element

# Wait until the element is visible
element = wait.until(EC.visibility_of_element_located(element_locator))

# Perform actions on the element after it becomes visible
element.send_keys('Apple Banana')
screenshot = element.screenshot_as_png
# Save the screenshot to a file
with open('element_screenshot.png', 'wb') as file:
    file.write(screenshot)

# Close the WebDriver
driver.quit()

Summary

In this Python Selenium tutorial, we have seen how to introduce an Explicit Wait to wait for a specific element in the web page to be visible, with examples.