Selenium web驱动程序-Java中的过时元素引用异常?
我尝试了我在Selenium web驱动程序中知道的所有方法,但我无法解决过时的元素引用异常。我在SeleniumWeb驱动程序中尝试了Selenium web驱动程序-Java中的过时元素引用异常?,java,selenium,selenium-webdriver,testing,automated-tests,Java,Selenium,Selenium Webdriver,Testing,Automated Tests,我尝试了我在Selenium web驱动程序中知道的所有方法,但我无法解决过时的元素引用异常。我在SeleniumWeb驱动程序中尝试了隐式等待,显式等待,以及流畅等待 我的HTML看起来像下面的屏幕截图。我必须单击此列表中的所有li选项 如果我使用foreach、for或迭代器来循环此操作,我可以单击第一个选项,但第二个选项会引发陈旧元素引用异常 我的selenium代码是: List<WebElement> chapterNames = driver.findElements(
隐式等待
,显式等待
,以及流畅等待
我的HTML看起来像下面的屏幕截图。我必须单击此列表中的所有li选项
如果我使用foreach
、for
或迭代器来循环此操作,我可以单击第一个选项,但第二个选项会引发陈旧元素引用异常
我的selenium代码是:
List<WebElement> chapterNames = driver.findElements(By.xpath("//*[@id='ctl00_PageContent_ddlreviewCat_DropDown']/child::div/ul/li"));
//List<WebElement> chapterQues = driver.findElements(By.xpath("//*[@id='ctl00_PageContent_grdReviewDocDetailList_ctl00']/child::tbody/tr/td[1]"));
WebElement ChapterNamedrpdwn = driver.findElement(By.id("ctl00_PageContent_ddlreviewCat_Input"));
Thread.sleep(2000);
for (int i = 0; i < chapterNames.size(); i++) {
try {
wait=new WebDriverWait(driver,30);
ChapterNamedrpdwn.click();
wait.until(ExpectedConditions.refreshed(ExpectedConditions.visibilityOfAllElements(chapterNames)));
chapterNames.get(i).click();
System.out.println(chapterNames.get(i).getAttribute("innerHTML")+ " clicked..");
Thread.sleep(3000);
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
List chapterNames=driver.findElements(By.xpath(“//*[@id='ctl00\u PageContent\u ddleviewcat\u DropDown']/child::div/ul/li”);
//List chapterQues=driver.findElements(By.xpath(“/*[@id='ctl00\u PageContent\u grdReviewDocDetailList\u ctl00']]/child::tbody/tr/td[1]”);
WebElement ChapterNamedrpdwn=driver.findElement(By.id(“ctl00\u PageContent\u ddleviewcat\u Input”);
《睡眠》(2000年);
对于(int i=0;i
错误消息是:
List<WebElement> chapterNames = driver.findElements(By.xpath("//*[@id='ctl00_PageContent_ddlreviewCat_DropDown']/child::div/ul/li"));
//List<WebElement> chapterQues = driver.findElements(By.xpath("//*[@id='ctl00_PageContent_grdReviewDocDetailList_ctl00']/child::tbody/tr/td[1]"));
WebElement ChapterNamedrpdwn = driver.findElement(By.id("ctl00_PageContent_ddlreviewCat_Input"));
Thread.sleep(2000);
for (int i = 0; i < chapterNames.size(); i++) {
try {
wait=new WebDriverWait(driver,30);
ChapterNamedrpdwn.click();
wait.until(ExpectedConditions.refreshed(ExpectedConditions.visibilityOfAllElements(chapterNames)));
chapterNames.get(i).click();
System.out.println(chapterNames.get(i).getAttribute("innerHTML")+ " clicked..");
Thread.sleep(3000);
}
catch(Exception e) {
System.out.println(e.getMessage());
}
}
陈旧元素引用:元素未附加到页面文档
(会话信息:chrome=86.0.4240.198)
有关此错误的文档,请访问:
在代码中,您等待刷新—如果您的DOM被更改,旧的引用将不再可用(您的驱动程序会告诉您这一点)。每次再次单击LIs后,您都必须在下次重新获取对它的引用StaleElementReferenceException,当元素被操作且其引用已被销毁,并且您仍在尝试与DOM中引用不可用的元素进行交互时,会发生异常。因此,您可以检查是否为xpath。谢谢。。是否有其他解决此问题的方法?而不是每次刷新都获取每个元素。因为列表中几乎有20个选项,所以如何获取每次刷新的元素并再次循环它们。如果你对这个问题有任何想法,请告诉我。谢谢。。但是,如果我在等待时不刷新就运行代码,它会返回相同的错误。我认为,如果我在列表中选择一个选项,页面将刷新,DOM元素将重新创建,因此旧元素不会用于循环。是否有其他解决此问题的方法?而不是每次刷新都获取每个元素。因为列表中几乎有20个选项,所以如何获取每次刷新的元素并再次循环它们。此异常意味着网页中发生了更改,您通过web驱动程序获取的引用不再可用。您必须在刷新后重新获取它们。