Selenium web驱动程序-Java中的过时元素引用异常?

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(

我尝试了我在Selenium web驱动程序中知道的所有方法,但我无法解决过时的元素引用异常。我在SeleniumWeb驱动程序中尝试了
隐式等待
显式等待
,以及
流畅等待

我的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驱动程序获取的引用不再可用。您必须在刷新后重新获取它们。