请参考下面的代码,此代码将从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;
}
答案 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();
}