0

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

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

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

2 回答 2

0

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

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

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

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

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

于 2018-02-06T20:05:09.700 回答
0

的官方文档StaleElementReferenceException说:

表示对元素的引用现在是“陈旧的”——该元素不再出现在页面的 DOM 上。

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

解决这个问题的正常方法是不在循环外跟踪WebElements,而是在每次迭代期间在循环内找到它们。像这样的东西:

// 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();
}
于 2018-02-06T23:50:29.663 回答