Bird
Raised Fist0
Selenium Javatesting~15 mins

Handling StaleElementReferenceException in Selenium Java - Build an Automation Script

Choose your learning style10 modes available
Handle StaleElementReferenceException when clicking a dynamic button
Preconditions (2)
Step 1: Navigate to the test page URL
Step 2: Locate the button with id 'dynamic-button'
Step 3: Click the button
Step 4: Immediately try to click the same button again
Step 5: If StaleElementReferenceException occurs, re-locate the button and click it again
✅ Expected Result: The button is clicked twice successfully without test failure due to StaleElementReferenceException
Automation Requirements - Selenium WebDriver with Java
Assertions Needed:
Verify no StaleElementReferenceException is thrown during the second click
Verify the button click triggers expected page behavior (e.g., URL change or element update)
Best Practices:
Use explicit waits to wait for element to be clickable
Catch StaleElementReferenceException and re-locate the element before retrying
Avoid storing WebElement references for long periods when page updates dynamically
Automated Solution
Selenium Java
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.StaleElementReferenceException;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.time.Duration;

public class HandleStaleElement {
    public static void main(String[] args) {
        System.setProperty("webdriver.chrome.driver", "path/to/chromedriver");
        WebDriver driver = new ChromeDriver();
        WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));

        try {
            driver.get("https://example.com/testpage");

            // Locate the button
            WebElement button = wait.until(ExpectedConditions.elementToBeClickable(By.id("dynamic-button")));

            // First click
            button.click();

            // Try second click, handle stale element
            try {
                button.click();
            } catch (StaleElementReferenceException e) {
                // Re-locate the button and click again
                button = wait.until(ExpectedConditions.elementToBeClickable(By.id("dynamic-button")));
                button.click();
            }

            // Add assertion or verification here if needed
            // For example, check URL or element text changed
            String currentUrl = driver.getCurrentUrl();
            if (!currentUrl.contains("expected-part-after-click")) {
                throw new AssertionError("URL did not change as expected after button clicks");
            }

            System.out.println("Test passed: Button clicked twice without stale element error.");

        } finally {
            driver.quit();
        }
    }
}

This code uses Selenium WebDriver with Java to automate the test case.

First, it opens the browser and navigates to the test page.

It waits explicitly for the button with id 'dynamic-button' to be clickable, then clicks it once.

For the second click, it tries to click the same WebElement. If a StaleElementReferenceException occurs, it catches the exception, re-locates the button again using the explicit wait, and clicks it again.

This approach ensures the test does not fail due to stale element references caused by page updates.

Finally, it verifies the URL changed as expected after the clicks to confirm the button worked.

The driver quits to close the browser.

Common Mistakes - 3 Pitfalls
Storing WebElement in a variable and reusing it after page update without re-locating
Not using explicit waits and trying to interact immediately
Ignoring StaleElementReferenceException and letting test fail
Bonus Challenge

Now add data-driven testing to click multiple buttons with different ids and handle stale elements for each

Show Hint

Practice

(1/5)
1. What causes a StaleElementReferenceException in Selenium WebDriver?
easy
A. The locator syntax is incorrect.
B. The web element is no longer attached to the current page DOM.
C. The browser window is not maximized.
D. The WebDriver instance is not initialized.

Solution

  1. Step 1: Understand the exception cause

    StaleElementReferenceException occurs when the element you found earlier is no longer present in the page's current DOM structure.
  2. Step 2: Identify the correct cause

    Incorrect locator or browser state issues do not cause this exception. It specifically relates to the element's presence in the DOM.
  3. Final Answer:

    The web element is no longer attached to the current page DOM. -> Option B
  4. Quick Check:

    Stale element = Detached from DOM [OK]
Hint: Stale means element lost from page DOM, re-find it [OK]
Common Mistakes:
  • Confusing stale element with wrong locator syntax
  • Thinking browser size causes stale element
  • Assuming WebDriver initialization causes this
2. Which of the following is the correct way to catch a StaleElementReferenceException in Java Selenium?
easy
A. try { element.click(); } catch (ElementNotVisibleException e) { /* handle */ }
B. try { element.click(); } catch (NoSuchElementException e) { /* handle */ }
C. try { element.click(); } catch (TimeoutException e) { /* handle */ }
D. try { element.click(); } catch (StaleElementReferenceException e) { /* handle */ }

Solution

  1. Step 1: Identify the exception to catch

    The exception to handle stale elements is StaleElementReferenceException.
  2. Step 2: Match the catch block

    Only try { element.click(); } catch (StaleElementReferenceException e) { /* handle */ } catches StaleElementReferenceException correctly.
  3. Final Answer:

    try { element.click(); } catch (StaleElementReferenceException e) { /* handle */ } -> Option D
  4. Quick Check:

    Catch stale element exception = try { element.click(); } catch (StaleElementReferenceException e) { /* handle */ } [OK]
Hint: Catch StaleElementReferenceException to handle stale elements [OK]
Common Mistakes:
  • Catching wrong exceptions like NoSuchElementException
  • Not catching any exception causing test failure
  • Using deprecated exceptions
3. Consider the following code snippet:
WebElement button = driver.findElement(By.id("submit"));
button.click();
// Page reloads here
button.click();

What will happen when the second button.click() runs?
medium
A. The click will succeed without any exception.
B. The test will hang indefinitely.
C. A StaleElementReferenceException will be thrown.
D. A NoSuchElementException will be thrown.

Solution

  1. Step 1: Analyze element usage after page reload

    The element button was found before the page reload. After reload, the old reference is invalid.
  2. Step 2: Understand exception on stale element use

    Using the old button reference after reload causes StaleElementReferenceException.
  3. Final Answer:

    A StaleElementReferenceException will be thrown. -> Option C
  4. Quick Check:

    Using old element after reload = StaleElementReferenceException [OK]
Hint: After page reload, re-find elements to avoid stale exception [OK]
Common Mistakes:
  • Assuming element reference stays valid after reload
  • Confusing stale element with no such element
  • Thinking test hangs instead of throwing exception
4. You have this code that sometimes throws StaleElementReferenceException. How can you fix it?
WebElement link = driver.findElement(By.linkText("Home"));
link.click();
link.click();
medium
A. Wrap the second click in a try-catch and re-find the element inside catch.
B. Increase the implicit wait time to 30 seconds.
C. Use Thread.sleep(5000) before the second click.
D. Change locator to XPath instead of linkText.

Solution

  1. Step 1: Identify cause of stale element

    The first click likely changes the page, making the old link reference stale.
  2. Step 2: Fix by catching exception and re-finding element

    Wrapping the second click in try-catch and re-finding the element inside catch handles the stale reference properly.
  3. Final Answer:

    Wrap the second click in a try-catch and re-find the element inside catch. -> Option A
  4. Quick Check:

    Catch stale exception and re-find element [OK]
Hint: Catch stale exception and re-find element before retry [OK]
Common Mistakes:
  • Relying only on waits without handling stale exception
  • Using Thread.sleep which is unreliable
  • Changing locator without reason
5. You want to click a button that reloads the page, but avoid StaleElementReferenceException. Which approach is best?
public void clickButtonWithRetry() {
  int attempts = 0;
  while (attempts < 3) {
    try {
      WebElement btn = driver.findElement(By.id("reloadBtn"));
      btn.click();
      break;
    } catch (StaleElementReferenceException e) {
      attempts++;
    }
  }
}
hard
A. This retry loop handles stale element by re-finding and retrying clicks.
B. This code will cause infinite loop if stale exception occurs.
C. The code should use explicit wait instead of retry loop.
D. The button should be found once outside the loop to improve performance.

Solution

  1. Step 1: Understand retry logic for stale element

    The loop tries to find and click the button up to 3 times, catching stale exceptions and retrying.
  2. Step 2: Confirm this approach avoids stale element errors

    Re-finding the element inside the loop ensures a fresh reference each attempt, preventing stale exceptions.
  3. Final Answer:

    This retry loop handles stale element by re-finding and retrying clicks. -> Option A
  4. Quick Check:

    Retry with re-find fixes stale element [OK]
Hint: Retry clicks with re-find inside loop to fix stale element [OK]
Common Mistakes:
  • Thinking loop causes infinite retries without break
  • Using waits alone without retry logic
  • Finding element once outside loop causing stale reference
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard