header_logo
Post thumbnail
SELENIUM

Fix Flaky Selenium Tests in Python with 6 Proven Ways

By Basil Ahamed

Writing automation tests with Selenium in Python can feel great at first. Your tests catch bugs, save time, and fit nicely into your workflow. 

But as your test suite grows, things start to break, sometimes randomly. One day your test passes, the next day it fails, even when nothing has changed.

These are called flaky tests, and they can be frustrating. They make it hard to trust your results and slow down your team. But here’s the good news: flaky tests can be fixed.

In this blog, we’ll explain why Selenium tests in Python become flaky, and more importantly, how to fix flaky Selenium tests in Python. 

You’ll learn easy, practical fixes you can apply right away with code examples.

Table of contents


  1. What Are Flaky Tests?
  2. Common Causes of Test Failures & Solutions
    • Problem: Timing Issues (Test Runs Too Early)
    • Problem: Element is There, But You Can’t Click It
    • Problem: Stale Element Reference
    • Problem: Tests Pass in Chrome but Fail in Firefox or Edge
    • Problem: Test Data is Wrong or Outdated
    • Problem: Test Environment is Unstable
  3. Conclusion
  4. Frequently Asked Questions

What Are Flaky Tests?

A flaky test is a test that sometimes passes and sometimes fails, even when the code or app hasn’t changed. This makes testing unreliable and frustrating. It wastes time and can hide real bugs.

Most flaky tests are caused by timing problems, bad data, or unstable environments, not Selenium itself.

Now let’s look at the most common issues and how to fix flaky Selenium tests in Python.

Common Causes of Test Failures & Solutions

1. Problem: Timing Issues (Test Runs Too Early)

Web pages often load parts of the content after the main page appears. If Selenium tries to click something before it’s ready, the test fails.

Fix: Use Explicit Waits Instead of time.sleep()

To fix flaky Selenium tests in Python, start by replacing time.sleep() With explicit waits.

Don’t guess how long to wait. Use WebDriverWait to wait until the element is ready.

Example:

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

driver = webdriver.Chrome()

driver.get("https://www.guvi.io")

wait = WebDriverWait(driver, 10)

login_button = wait.until(EC.visibility_of_element_located((By.ID, "login-btn")))

login_button.click()

driver.quit()

This makes your test wait only as long as needed, making it more stable. 

If you’re still new to Selenium and want to learn how waits, locators, and browser controls work, this Selenium for beginners course is a great starting point.

2. Problem: Element is There, But You Can’t Click It

Sometimes the element exists but is hidden or disabled, or covered by something else. This causes interaction errors.

Fix: Check if Element is Ready Before Clicking

Always check if the element is displayed and enabled to fix flaky Selenium tests in Python.

Example:

element = driver.find_element(By.ID, "nav-link-accountList")

if element.is_displayed() and element.is_enabled():

    element.click()

else:

    print("Element not ready yet.")

This avoids unnecessary failures when an element isn’t ready to interact with.

3. Problem: Stale Element Reference

Some websites update the page without a full reload. If your test grabs an element before it changes, you’ll get a stale element error.

Fix: Re-Find the Element Before Using It

Always find the element right before you use it if it might change.

Example:

element = driver.find_element(By.ID, "dynamicElement")

element.click()

This makes sure Selenium is using the latest version of the element.

To handle issues like this, you’ll also need good exception handling in your test scripts. This guide to exception handling in Selenium explains how to do it the right way with real examples.

4. Problem: Tests Pass in Chrome but Fail in Firefox or Edge

Different browsers behave slightly differently. What works in one browser might break in another.

Fix: Use Cross-Browser Testing

Test your code in multiple browsers using Selenium Grid or cloud tools like BrowserStack.

Example:

from selenium import webdriver

def launch_browser(browser_name, url):

    if browser_name == "chrome":

        driver = webdriver.Chrome()

    elif browser_name == "firefox":

        driver = webdriver.Firefox()

    elif browser_name == "edge":

        driver = webdriver.Edge()

    else:

        raise ValueError("Unsupported browser")

    driver.get(url)

    return driver

driver = launch_browser("chrome", "https://www.guvi.io")

driver.quit()

This helps you catch browser-specific bugs early.

MDN

5. Problem: Test Data is Wrong or Outdated

Using hardcoded or old data (like expired login info) can cause tests to fail when the real app changes.

Fix: Use Data-Driven Testing

Store your test data in a separate file like a CSV, JSON, or database.

Example (CSV):

import csv

from selenium import webdriver

driver = webdriver.Chrome()

with open('login_data.csv', newline='') as csvfile:

    reader = csv.DictReader(csvfile)

    for row in reader:

        username = row['username']

        password = row['password']

        print(f"Testing login for {username}")

        # Add your login test steps here

driver.quit()

This makes your tests flexible, reusable, and easier to update.

6. Problem: Test Environment is Unstable

Sometimes the test fails because the system is slow, the internet is shaky, or someone else is using the test server.

Fix: Use a Stable, Isolated Test Environment

Use tools like Docker to run tests in clean, reliable environments every time.

Benefits:

  • Same setup on every machine
  • No outside interference
  • Better performance and repeatability

If you want a full project-based course that teaches everything from test setup to CI/CD integration, check out this Selenium Automation Course.

Conclusion

Flaky Selenium tests can be annoying; they slow you down, break your CI/CD pipeline, and make you lose trust in your test results. 

But the good news is, most flaky tests can be fixed with small changes.

By using explicit waits, checking if elements are ready, avoiding stale references, testing in multiple browsers, keeping your data fresh, and running tests in stable environments, your Selenium tests in Python can become much more reliable.

You can also explore other tips in this helpful blog on easy fixes to stop flaky Selenium tests; it covers common issues and how to prevent them.

MDN

Frequently Asked Questions

1. What is a flaky test in Selenium?
A flaky test is a test that sometimes passes and sometimes fails, even when nothing has changed in the app. These tests are often caused by timing issues, bad data, or unstable environments.

2. How can I stop using time.sleep() in my tests?
Replace time.sleep() with explicit waits using WebDriverWait. This makes the test wait only as long as needed, making it faster and more stable.

3. Can I run Selenium tests in more than one browser?
Yes! You can use Selenium Grid, BrowserStack, or write scripts to run your tests in Chrome, Firefox, Edge, and more. This helps make sure your site works everywhere.

Success Stories

Did you enjoy this article?

Schedule 1:1 free counselling

Similar Articles

Loading...
Share logo Copy link
Power Packed Webinars
Free Webinar Icon
Power Packed Webinars
Subscribe now for FREE! 🔔
close
Webinar ad
Table of contents Table of contents
Table of contents Articles
Close button

  1. What Are Flaky Tests?
  2. Common Causes of Test Failures & Solutions
    • Problem: Timing Issues (Test Runs Too Early)
    • Problem: Element is There, But You Can’t Click It
    • Problem: Stale Element Reference
    • Problem: Tests Pass in Chrome but Fail in Firefox or Edge
    • Problem: Test Data is Wrong or Outdated
    • Problem: Test Environment is Unstable
  3. Conclusion
  4. Frequently Asked Questions