Selenium中的“StaleElementReferenceException”用于List <webelement>

时间:2018-02-06 18:43:27

标签: java selenium page-factory staleelementreferenceexception

请参考下面的代码,此代码将从findtable方法获取所有orderID,并将所有orderID传递给clickonIndividualOrderID方法 所以光标移动到每个orderid并点击它,一个新的页面将会出现并获取状态并点击完成,如果我们尝试选择下一个orderID,它将返回到旧页面,它将抛出异常

您能否提出一些解决此问题的方法 提前致谢

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;
}

2 个答案:

答案 0 :(得分:0)

每当您从任何第三方代码中发现特定异常时,您应该在所述代码的官方文档中查找信息(如果有)。您可以找到有关“StaleElementReferenceException”here

的信息

在所述页面中,您会找到这个

  

最常见的原因是该元素所属的页面已刷新,或者用户已导航到另一页面。

您正在导航到另一个页面,因此所有引用都将丢失。驱动程序不知道它的相同页面具有相同的对象。

您需要寻找一种不同的方式来跟踪您已经点击的链接,或者在新的标签/窗口中打开链接,以执行您需要的任何操作,然后处置选项卡/窗口而不是导航回来

答案 1 :(得分:0)

StaleElementReferenceException的官方文档说:

  

表示对元素的引用现在是#st;&#34; stale&#34; ---该元素不再出现在页面的DOM上。

如果您在页面之间来回导航,那么这就是预期的行为。

接近此方法的正常方法是跟踪循环外的WebElement,但在每次迭代期间在循环内找到它们。像这样:

// 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();
}