Debug School

rakesh kumar
rakesh kumar

Posted on • Updated on

Explain TimeoutException exception in selenium

TimeoutException in Selenium occurs when a WebDriver operation times out while waiting for a specific condition to be met. This exception is often encountered in various scenarios when dealing with web elements or page loading. Here are different scenarios where a TimeoutException can occur along with coding examples:
Waiting for an Element to Be Present

Waiting for an Element to Be Clickable:

Waiting for a Page to Load:

Waiting for AJAX Requests

Waiting for an Element to Be Present

Setting Implicit Wait

In this scenario, you are waiting for an element to appear on the web page.

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
try:
    driver.get("https://example.com")
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "some-element")))
except TimeoutException as e:
    print(f"TimeoutException: {e}")
finally:
    driver.quit()
Enter fullscreen mode Exit fullscreen mode

Another Example

HTML Code (example.html):

<!DOCTYPE html>
<html>
<head>
    <title>Element Waiting Example</title>
</head>
<body>
    <div id="element-to-wait-for">
        <p>This is the element we're waiting for!</p>
    </div>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

Python Code (example.py):

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

# Initialize the WebDriver (you need to have a compatible webdriver installed, e.g., ChromeDriver)
driver = webdriver.Chrome()

# Open the web page
driver.get("file:///path/to/your/example.html")  # Replace with the actual path

try:
    # Wait for the element to be present (timeout set to 10 seconds)
    element = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "element-to-wait-for"))
    )

    # Once the element is present, you can perform actions on it
    print("Element is present:", element.text)

    # Additional actions can be performed here

finally:
    # Close the browser window
    driver.quit()
Enter fullscreen mode Exit fullscreen mode

Make sure to replace file:///path/to/your/example.html with the actual file path to your HTML file, and ensure that you have the appropriate WebDriver installed (in this example, we're using ChromeDriver).

This code will open the HTML file, wait for the element with the ID "element-to-wait-for" to be present on the page, and then print its text. You can perform additional actions on the element as needed once it becomes present.

Waiting for an Element to Be Clickable:

In this scenario, you are waiting for an element to become clickable so that you can interact with it.

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
try:
    driver.get("https://example.com")
    WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "clickable-element")))
except TimeoutException as e:
    print(f"TimeoutException: {e}")
finally:
    driver.quit()
Enter fullscreen mode Exit fullscreen mode

o wait for an element to be clickable in Selenium using Python, you can also use the WebDriverWait class along with the expected_conditions module. Here's an example of HTML code and Python code to demonstrate how to wait for an element to be clickable:

HTML Code (example.html):

<!DOCTYPE html>
<html>
<head>
    <title>Element Clickable Waiting Example</title>
</head>
<body>
    <button id="clickable-element" onclick="alert('Element clicked!')">Click Me</button>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

Python Code (example.py):

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

# Initialize the WebDriver (you need to have a compatible webdriver installed, e.g., ChromeDriver)
driver = webdriver.Chrome()

# Open the web page
driver.get("file:///path/to/your/example.html")  # Replace with the actual path

try:
    # Wait for the element to be clickable (timeout set to 10 seconds)
    element = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.ID, "clickable-element"))
    )

    # Once the element is clickable, you can click it
    element.click()

    # Additional actions can be performed here after the click

finally:
    # Close the browser window
    driver.quit()
Enter fullscreen mode Exit fullscreen mode

As with the previous example, make sure to replace file:///path/to/your/example.html with the actual file path to your HTML file, and ensure that you have the appropriate WebDriver installed (in this example, we're using ChromeDriver).

This code will open the HTML file, wait for the button with the ID "clickable-element" to become clickable, and then click it. You can perform additional actions after the click as needed.

Waiting for a Page to Load:

In this scenario, you are waiting for a web page to fully load, including all its resources like images, scripts, and styles.

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.support.ui import WebDriverWait

driver = webdriver.Chrome()
try:
    driver.get("https://example.com/slow-loading-page")
    WebDriverWait(driver, 10).until(lambda x: x.execute_script("return document.readyState === 'complete';"))
except TimeoutException as e:
    print(f"TimeoutException: {e}")
finally:
    driver.quit()
Enter fullscreen mode Exit fullscreen mode

To wait for a page to load in Selenium using Python, you can use the WebDriverWait class along with the expected_conditions module to wait for a specific condition to be met, such as the document.readyState property to be "complete." Here's an example of HTML code and Python code to demonstrate how to wait for a page to load:

HTML Code (example.html):

<!DOCTYPE html>
<html>
<head>
    <title>Page Loading Example</title>
</head>
<body>
    <h1>Welcome to the Page</h1>
    <p>This is some content on the page.</p>
    <script>
        // Simulate a delay in page loading
        setTimeout(function () {
            document.getElementById("loading-complete").innerText = "Page loaded!";
        }, 3000);
    </script>
    <div id="loading-complete"></div>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

Python Code (example.py):

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

# Initialize the WebDriver (you need to have a compatible webdriver installed, e.g., ChromeDriver)
driver = webdriver.Chrome()

# Open the web page
driver.get("file:///path/to/your/example.html")  # Replace with the actual path

try:
    # Wait for the page to load completely (timeout set to 10 seconds)
    WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "loading-complete"))
    )

    # Once the page has loaded, you can perform actions on it
    heading = driver.find_element(By.TAG_NAME, "h1")
    print("Page title:", driver.title)
    print("Heading text:", heading.text)

    # Additional actions can be performed here

finally:
    # Close the browser window
    driver.quit()
Enter fullscreen mode Exit fullscreen mode

Replace file:///path/to/your/example.html with the actual file path to your HTML file, and ensure that you have the appropriate WebDriver installed (in this example, we're using ChromeDriver).

This code will open the HTML file, wait for the element with the ID "loading-complete" to be present on the page (which is a simulated indication of the page being fully loaded), and then perform actions on the page. You can adjust the simulated delay in the HTML script to match your actual use case.
Another Example

import time
time.sleep(5)

# Create an empty list to store the URLs


for page in range(0, 7):
    try:

        # Find and click the "Next" button
        next_button = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.LINK_TEXT, 'Next')))
        next_button.click()

        # Wait for the new page to load (you may need to adjust the wait time)
        time.sleep(5)

        # Get the current page's URL and add it to the list
        current_url = driver.current_url
        all_urls.append(current_url)

    except (TimeoutException, NoSuchElementException, ElementClickInterceptedException):
        # If there's no "Next" button or a timeout occurs, exit the loop
        break
all_urls
Enter fullscreen mode Exit fullscreen mode

Error
TimeoutException Traceback (most recent call last)
Cell In[100], line 11
8 try:
9

10 # Find and click the "Next" button
---> 11 next_button = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.LINK_TEXT, 'Next')))
12 next_button.click()

File ~\anaconda3\lib\site-packages\selenium\webdriver\support\wait.py:95, in WebDriverWait.until(self, method, message)
94 break
---> 95 raise TimeoutException(message, screen, stacktrace)
solution

import time
time.sleep(5)

# Create an empty list to store the URLs


for page in range(0, 6):// CORRECTED HERE
    try:

        # Find and click the "Next" button
        next_button = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.LINK_TEXT, 'Next')))
        next_button.click()

        # Wait for the new page to load (you may need to adjust the wait time)
        time.sleep(5)

        # Get the current page's URL and add it to the list
        current_url = driver.current_url
        all_urls.append(current_url)

    except (TimeoutException, NoSuchElementException, ElementClickInterceptedException):
        # If there's no "Next" button or a timeout occurs, exit the loop
        break
all_urls
Enter fullscreen mode Exit fullscreen mode

output

['https://www.amazon.in/s?k=Guitar&ref=nb_sb_noss',
 'https://www.amazon.in/s?k=Guitar&page=2&qid=1695966046&ref=sr_pg_1',
 'https://www.amazon.in/s?k=Guitar&page=3&qid=1695966061&ref=sr_pg_2',
 'https://www.amazon.in/s?k=Guitar&page=4&qid=1695966066&ref=sr_pg_3',
 'https://www.amazon.in/s?k=Guitar&page=5&qid=1695966071&ref=sr_pg_4',
 'https://www.amazon.in/s?k=Guitar&page=6&qid=1695966077&ref=sr_pg_5',
 'https://www.amazon.in/s?k=Guitar&page=7&qid=1695966082&ref=sr_pg_6']
Enter fullscreen mode Exit fullscreen mode

Waiting for AJAX Requests:

In this scenario, you are waiting for asynchronous data to load via AJAX requests.

from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Chrome()
try:
    driver.get("https://example.com/ajax-page")
    WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, "ajax-loaded-element")))
except TimeoutException as e:
    print(f"TimeoutException: {e}")
finally:
    driver.quit()
Enter fullscreen mode Exit fullscreen mode

To wait for AJAX requests to complete in Selenium using Python, you can use the WebDriverWait class along with the expected_conditions module to wait for a condition that indicates the AJAX request has finished. Here's an example of HTML code and Python code to demonstrate how to wait for AJAX requests:

HTML Code (example.html):

<html>
<head>
    <title>AJAX Loading Example</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <h1>Content Loaded by AJAX</h1>
    <div id="ajax-content"></div>
    <script>
        // Simulate an AJAX request after a delay
        setTimeout(function () {
            $.get("https://jsonplaceholder.typicode.com/posts/1", function (data) {
                $("#ajax-content").html(data.title);
            });
        }, 2000);
    </script>
</body>
</html>
Enter fullscreen mode Exit fullscreen mode

Python Code (example.py):

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

# Initialize the WebDriver (you need to have a compatible webdriver installed, e.g., ChromeDriver)
driver = webdriver.Chrome()

# Open the web page
driver.get("file:///path/to/your/example.html")  # Replace with the actual path

try:
    # Wait for the AJAX request to complete (timeout set to 10 seconds)
    WebDriverWait(driver, 10).until(
        EC.text_to_be_present_in_element((By.ID, "ajax-content"), "sunt aut facere repellat provident occaecati excepturi optio reprehenderit")
    )

    # Once the AJAX request is complete, you can perform actions on the page
    heading = driver.find_element(By.TAG_NAME, "h1")
    ajax_content = driver.find_element(By.ID, "ajax-content")
    print("Page title:", driver.title)
    print("Heading text:", heading.text)
    print("AJAX content:", ajax_content.text)

    # Additional actions can be performed here

finally:
    # Close the browser window
    driver.quit()
Enter fullscreen mode Exit fullscreen mode

Replace file:///path/to/your/example.html with the actual file path to your HTML file, and ensure that you have the appropriate WebDriver installed (in this example, we're using ChromeDriver).

In this code, we simulate an AJAX request using jQuery's $.get() method with a delay of 2 seconds. The Python script waits for the text content of the element with the ID "ajax-content" to match the expected text from the AJAX response. Once the AJAX request is complete, it performs actions on the page, such as printing the page title, heading text, and AJAX content. Adjust the expected text to match the actual content your AJAX request will load.

Setting Implicit Wait:

In this scenario, you have set an implicit wait, and the WebDriver is waiting for an element to appear.

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)  # Set implicit wait to 10 seconds
try:
    driver.get("https://example.com")
    element = driver.find_element_by_id("nonexistent-element")
except TimeoutException as e:
    print(f"TimeoutException: {e}")
finally:
    driver.quit()
Enter fullscreen mode Exit fullscreen mode

TimeoutException is a common exception in Selenium, and handling it appropriately is crucial to ensure your automated tests run smoothly. You can adjust the timeout duration, use different expected conditions, or set implicit waits to handle specific scenarios where timeouts may occur.

In Selenium, you can set an implicit wait to specify a default timeout that will be applied to all the elements in your WebDriver. This means that Selenium will wait for the specified amount of time for an element to appear before throwing a TimeoutException if the element is not found within that time. Here's an example of how to set an implicit wait using Python and Selenium:

Python Code (example.py):

from selenium import webdriver

# Initialize the WebDriver (you need to have a compatible webdriver installed, e.g., ChromeDriver)
driver = webdriver.Chrome()

# Set an implicit wait of 10 seconds (this will be applied to all elements)
driver.implicitly_wait(10)

# Open a web page
driver.get("https://www.example.com")

try:
    # Find an element (e.g., a search input field)
    search_input = driver.find_element_by_name("q")

    # Perform actions on the element
    search_input.send_keys("Selenium Implicit Wait")
    search_input.submit()

    # Additional actions can be performed here after the element is found and interacted with

finally:
    # Close the browser window
    driver.quit()
Enter fullscreen mode Exit fullscreen mode

In this example, we set an implicit wait of 10 seconds using driver.implicitly_wait(10). This means that if an element is not immediately found when using methods like find_element_by_*, Selenium will wait up to 10 seconds for the element to appear before raising an exception.

The code then proceeds to interact with a search input field on the example.com website. The implicit wait is applied to this element lookup, so if the element is not immediately found, Selenium will wait for up to 10 seconds before raising an exception.

You can adjust the implicit wait duration (10 seconds in this example) according to your specific requirements.

Top comments (0)