Handling StaleElementReferenceException in Selenium Java - Build an Automation Script
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.
Now add data-driven testing to click multiple buttons with different ids and handle stale elements for each
Practice
StaleElementReferenceException in Selenium WebDriver?Solution
Step 1: Understand the exception cause
StaleElementReferenceExceptionoccurs when the element you found earlier is no longer present in the page's current DOM structure.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.Final Answer:
The web element is no longer attached to the current page DOM. -> Option BQuick Check:
Stale element = Detached from DOM [OK]
- Confusing stale element with wrong locator syntax
- Thinking browser size causes stale element
- Assuming WebDriver initialization causes this
StaleElementReferenceException in Java Selenium?Solution
Step 1: Identify the exception to catch
The exception to handle stale elements isStaleElementReferenceException.Step 2: Match the catch block
Only try { element.click(); } catch (StaleElementReferenceException e) { /* handle */ } catchesStaleElementReferenceExceptioncorrectly.Final Answer:
try { element.click(); } catch (StaleElementReferenceException e) { /* handle */ } -> Option DQuick Check:
Catch stale element exception = try { element.click(); } catch (StaleElementReferenceException e) { /* handle */ } [OK]
- Catching wrong exceptions like NoSuchElementException
- Not catching any exception causing test failure
- Using deprecated exceptions
WebElement button = driver.findElement(By.id("submit"));
button.click();
// Page reloads here
button.click();What will happen when the second
button.click() runs?Solution
Step 1: Analyze element usage after page reload
The elementbuttonwas found before the page reload. After reload, the old reference is invalid.Step 2: Understand exception on stale element use
Using the oldbuttonreference after reload causesStaleElementReferenceException.Final Answer:
A StaleElementReferenceException will be thrown. -> Option CQuick Check:
Using old element after reload = StaleElementReferenceException [OK]
- Assuming element reference stays valid after reload
- Confusing stale element with no such element
- Thinking test hangs instead of throwing exception
StaleElementReferenceException. How can you fix it?WebElement link = driver.findElement(By.linkText("Home"));
link.click();
link.click();Solution
Step 1: Identify cause of stale element
The first click likely changes the page, making the oldlinkreference stale.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.Final Answer:
Wrap the second click in a try-catch and re-find the element inside catch. -> Option AQuick Check:
Catch stale exception and re-find element [OK]
- Relying only on waits without handling stale exception
- Using Thread.sleep which is unreliable
- Changing locator without reason
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++;
}
}
}Solution
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.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.Final Answer:
This retry loop handles stale element by re-finding and retrying clicks. -> Option AQuick Check:
Retry with re-find fixes stale element [OK]
- Thinking loop causes infinite retries without break
- Using waits alone without retry logic
- Finding element once outside loop causing stale reference
Ready to prove it?
Pass the test and this pattern moves unknown
