问题
Please refer the below code, this code will fetch all the orderID from findtable method and it passes all of the orderID to clickonIndividualOrderID method so the cursor moves to each orderid and it clicks on it, a new page will come and it fetch the status and clicks on done and it comes back to old page now if we try to select next orderID, it will throw the exeception
Could you please suggest some approaches to resolve this issue Thanks in advance
List<WebElement> orderID = new ArrayList<WebElement>();
List<WebElement> statusID = new ArrayList<WebElement>();
public void OrderandReleases()
{
orderID = outboxpage.findtable(orderID);
util.pause("1");
statusID = outboxpage.findordernumber(statusID, orderID);
}
public List<WebElement> findOrderID(List<WebElement> orderID) {
WebElement table = driver.findElement(By.id("_kod7c3"));
List<WebElement> allRows = table.findElements(By.tagName("tr"));
//And iterate over them, getting the cells
for (int i = 1; i < allRows.size(); i++) {
List<WebElement> alltd = allRows.get(i).findElements(By.tagName("td"));
for (int j = 0; j < alltd.size(); j++) {
if (j == 1) {
orderID.add(alltd.get(j));
continue;
}
}
}
return orderID;
}
public List<WebElement> clickonIndividualOrderID(List<WebElement>
statusID,List<WebElement> orderID){
for (int i = 0; i < orderID.size(); i++) {
WebElement table = driver.findElement(By.id("_kod7c3"));
if (table.isDisplayed()) {
System.out.println("Clicking on
order="+orderID.get(i).getText()); -> //first time it will run fine , second time when it loops back it will thow the execption StaleElementReferenceException here
orderID.get(i).click(); -> //it is clicking on a order link and it will take me to next page
driver.findElement(By.id("_jxndro")).click();
WebElement table2 = driver.findElement(By.xpath("//*
[@id=\"_mfb\"]"));
List<WebElement> allRows2 =
table2.findElements(By.tagName("tr"));
String col = "";
for (int j = 1; j < allRows2.size(); j++) {
List<WebElement> alltd2 =
allRows2.get(j).findElements(By.tagName("td"));
int flag = 0;
for (int k = 0; k < alltd2.size(); k++) {
col = alltd2.get(k).getText().toString().trim();
System.out.println(col);
if (col.equals("Failed")||col.contains("FE-")) {
statusID.add(alltd2.get(++k));
driver.findElement(By.id("_uvsub")).click(); --> // it will take me back to the first page
flag =1;
break;
}
}
if(flag==1)
break;
}
}
}
return statusID;
}
回答1:
Whenever you find a specific exception from any third party code, you should look for information in the official documentation of said code if available. You can find information about the "StaleElementReferenceException" here
In said page you will find this
The most frequent cause of this is that page that the element was part of has been refreshed, or the user has navigated away to another page.
You're navigating to another page, so all the references will be lost. The driver do not have the knowledge that its the same page, with the same objects.
You need to look for a different way to keep track of which links you already clicked, or open the links in a new tab/window, to do whatever you need to, and then dispose the tab/window instead of navigating back.
回答2:
The official documentation for StaleElementReferenceException
says:
Indicates that a reference to an element is now "stale" --- the element no longer appears on the DOM of the page.
If you are navigating back and forth between pages, as you are doing, then this is the expected behaviour.
The normal way to approach this is to not keep track of the WebElement
s outside of the loop, but find them inside the loop during each iteration. Something like this:
// this will not change, but you need to adjust for your case!
By pageLocator = By.tagName("a");
int pageCount = driver.findElements(pageLocator).size();
for (int i = 0; i < pageCount; i++) {
WebElement pageLink = driver.findElements(pageLocator).get(i);
pageLink.click();
// at this point pageLink is gone stale!
// do some stuff
driver.navigate().back();
}
来源:https://stackoverflow.com/questions/48649819/staleelementreferenceexception-in-selenium-for-a-listwebelement