How To Overcome StaleElementReferenceException in Selenium?

How To Overcome StaleElementReferenceException in Selenium?

The StaleElementReferenceException in Selenium occurs when an element that was found in the DOM becomes stale or invalid (often due to a page refresh, navigation, or DOM update). Here's how to handle and overcome this exception effectively:

Solutions to Overcome StaleElementReferenceException

1. Use WebDriverWait with Expected Conditions

Wait until the element becomes visible or clickable before interacting with it.

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("elementId")));
element.click();

2. Refetch the Element

Locate the element again when required instead of holding its reference.

WebElement element = driver.findElement(By.id("elementId"));
element.click();

3. Try-Catch Block

Handle the exception by reattempting the interaction.

javaCopyEditWebElement element = null;
for (int i = 0; i < 3; i++) {
    try {
        element = driver.findElement(By.id("elementId"));
        element.click();
        break;
    } catch (StaleElementReferenceException e) {
        System.out.println("Stale element, retrying...");
    }
}

4. Use ExpectedConditions.refreshed()

Ensure the element is refreshed and valid before interacting with it.

javaCopyEditWebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(ExpectedConditions.refreshed(
    ExpectedConditions.elementToBeClickable(By.id("elementId"))));
element.click();

5. Avoid Premature Page Actions

Ensure the page has fully loaded before interacting with elements. You can wait for the presence of specific elements.

javaCopyEditnew WebDriverWait(driver, Duration.ofSeconds(10))
    .until(ExpectedConditions.presenceOfElementLocated(By.id("elementId")));

6. Scroll to Element (If Needed)

Sometimes scrolling the element into view helps.

javaCopyEditJavascriptExecutor js = (JavascriptExecutor) driver;
WebElement element = driver.findElement(By.id("elementId"));
js.executeScript("arguments[0].scrollIntoView(true);", element);
element.click();