0 votes
1 view
in Devops and Agile by (19.8k points)

I have the following code in a Selenium 2 Web Driver test which works when I am debugging but most of the time fails when I run it in the build. I know it must be something to do with the way the page is not being refreshed but do not know how to resolve it so any pointers as to what I have done wrong are appreciated. I am using JSF primefaces as my web application framework. When I click on the add new link a popup dialog box appears with an input box that I can enter a date into then click save. It is on getting the input element to enter text into that I get a stale element ref exception.

Thanks in advance

import static org.junit.Assert.assertEquals;

import java.util.HashMap;

import java.util.List;

import java.util.Map;

import org.junit.Test;

import org.openqa.selenium.By;

import org.openqa.selenium.StaleElementReferenceException;

import org.openqa.selenium.WebDriver;

import org.openqa.selenium.WebElement;

import org.openqa.selenium.chrome.ChromeDriver;

import org.openqa.selenium.support.ui.ExpectedCondition;

import org.openqa.selenium.support.ui.WebDriverWait;

public class EnterActiveSubmissionIntegrationTest {

Map<String, Map<String, String>> tableData = new HashMap<String, Map<String, String>>();

@Test

public void testEnterActiveSubmission() throws Exception {

    // Create a new instance of the Firefox driver

    // Notice that the remainder of the code relies on the interface, 

    // not the implementation.

    System.setProperty("webdriver.chrome.driver", "C:/apps/chromedriver.exe");

    WebDriver driver = new ChromeDriver();

    // And now use this to visit Google

    driver.get("http://localhost:8080/strfingerprinting");

    // Alternatively the same thing can be done like this

    // driver.navigate().to("http://www.google.com");

    // Find the text input element by its name

    WebElement element = driver.findElement(By.linkText("Manage Submissions"));

    element.click();

    parseTableData(driver, "form:submissionDataTable_data", 1);

    assertEquals(tableData.get("form:submissionDataTable_data").get("12"), "Archived");

    WebElement newElement = driver.findElement(By.linkText("Add new"));

    newElement.click();

    WebDriverWait wait = new WebDriverWait(driver,10);

    wait.until(new ExpectedCondition<Boolean>() {

        public Boolean apply(WebDriver driver) {

            WebElement button = driver.findElement(By

                    .name("createForm:dateInput_input"));

            if (button.isDisplayed())

                return true;

            else

                return false;

        }

    });

    WebElement textElement = driver.findElement(By.name("createForm:dateInput_input"));

    textElement.sendKeys("24/04/2013");

    WebElement saveElement = driver.findElement(By.name("createForm:saveButton"));

    saveElement.click();

    driver.navigate().refresh();

    parseTableData(driver, "form:submissionDataTable_data", 2);

    //Close the browser

    driver.quit();

}

private void parseTableData(WebDriver driver, String id, int expectedRows) {

    // Check the title of the page or expected element on page

    WebElement subTableElement = driver.findElement(By.id(id));

    List<WebElement> tr_collection=subTableElement.findElements(By.xpath("id('"+ id + "')/tr"));

    assertEquals("incorrect number of rows returned", expectedRows, tr_collection.size());

    int row_num,col_num;

    row_num=1;

    if(tableData.get(id) == null) {

        tableData.put(id, new HashMap<String, String>());

    }

    Map<String, String> subTable = tableData.get(id);

    for(WebElement trElement : tr_collection)

    {

        List<WebElement> td_collection=trElement.findElements(By.xpath("td"));

        col_num=1;

        for(WebElement tdElement : td_collection)

        {

            subTable.put(row_num + "" + col_num, tdElement.getText());

            col_num++;

        }

        row_num++;

    }

}

}

When I run this I get the following exception but it can occur on

WebElement textElement = driver.findElement(By.name("createForm:dateInput_input")); 

or

if (button.isDisplayed())

exception trace

org.openqa.selenium.StaleElementReferenceException: stale element reference: element is not attached to the page document

(Session info: chrome=26.0.1410.64)

  (Driver info: chromedriver=0.8,platform=Windows NT 6.0 SP2 x86) (WARNING: The server did not provide any stacktrace information)

Command duration or timeout: 56 milliseconds

For documentation on this error, please visit:        http://seleniumhq.org/exceptions/stale_element_reference.html

Build info: version: '2.32.0', revision: '6c40c187d01409a5dc3b7f8251859150c8af0bcb', time: '2013-04-09 10:39:28'

System info: os.name: 'Windows Vista', os.arch: 'x86', os.version: '6.0', java.version: '1.6.0_10'

Session ID: 784c53b99ad83c44d089fd04e9a42904

Driver info: org.openqa.selenium.chrome.ChromeDriver

Capabilities [{platform=XP, acceptSslCerts=true, javascriptEnabled=true,   browserName=chrome, rotatable=false, driverVersion=0.8, locationContextEnabled=true,  version=26.0.1410.64, cssSelectorsEnabled=true, databaseEnabled=true, handlesAlerts=true,  browserConnectionEnabled=false, nativeEvents=true, webStorageEnabled=true,   applicationCacheEnabled=false, takesScreenshot=true}]

at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)

at  sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)

at  sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)

at java.lang.reflect.Constructor.newInstance(Constructor.java:513)

at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:187)

at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:145)

at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:554)

at org.openqa.selenium.remote.RemoteWebElement.execute(RemoteWebElement.java:268)

at org.openqa.selenium.remote.RemoteWebElement.isDisplayed(RemoteWebElement.java:320)

at com.integration.web.EnterActiveSubmissionIntegrationTest$1.apply(EnterActiveSubmissionIntegrationTest.java:58)

at com.integration.web.EnterActiveSubmissionIntegrationTest$1.apply(EnterActiveSubmissionIntegrationTest.java:1)

at org.openqa.selenium.support.ui.FluentWait.until(FluentWait.java:208)

at com.integration.web.EnterActiveSubmissionIntegrationTest.testEnterActiveSubmission(EnterActiveSubmissionIntegrationTest.java:53)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

1 Answer

+1 vote
by (63.4k points)

Causes of Stale Element Reference Exception:

A stale element reference exception is thrown in one of two cases, the first being more common than the second.

 

The two reasons for Stale element reference are

 

  1. The element has been deleted entirely.
  2. The element is no longer attached to the DOM.

We face this stale element reference exception when the element we are interacting is destroyed and then recreated again. When this happens the reference of the element in the DOM becomes stale. Hence we are not able to get the reference to the element.

How To Overcome Stale Element Reference Exception in Selenium:

Solution 1:

You could refresh the page and try again for the same element.

I am taking a scenario that says you are trying to click on a link and getting the stale element exception.

Sample code to overcome the issue

driver.navigate().refresh();

driver.findElement(By.xpath("xpath here")).click();

Welcome to Intellipaat Community. Get your technical queries answered by top developers !


Categories

...