0

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;
}
Deepak
  • 1
  • 5
  • **Help us help you!** abbreviate your code to show only the relevant part, describe the page further (add its code if possible, or attach its URL) and generally just give us tools to help! – GalAbra Feb 06 '18 at 18:46
  • `code`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 `code`orderID.get(i).click(); //it is clicking on a order link and it will take me to next page – Deepak Feb 06 '18 at 18:56
  • Further Code: `code` driver.findElement(By.id("_jxndro")).click(); `code` WebElement table2 = driver.findElement(By.xpath("//* [@id=\"_mfb\"]")); `code` List allRows2 = table2.findElements(By.tagName("tr")); let me know if you require further information,thanks in advance – Deepak Feb 06 '18 at 18:57

2 Answers2

0

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.

IvanGrasp
  • 118
  • 10
  • Thank you for the update , one query, in this code `code`orderID.get(i).click(); when its click it takes us to another page so how can i implement it in this code of going to new window/tab. please help me in this – Deepak Feb 07 '18 at 04:54
0

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 WebElements 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();
}
SiKing
  • 10,003
  • 10
  • 39
  • 90