【问题标题】:StaleElementReferenceException while iterating over embedded links迭代嵌入式链接时出现 StaleElementReferenceException
【发布时间】:2018-05-29 19:09:39
【问题描述】:

在我的网页上,我有一个部分链接列表,每个部分都有指向详细信息的链接。我正在尝试转到每个部分,然后验证所有链接都没有损坏。

List<WebElement> sections = driver.findElements(By.xpath("//*[@id='sections']/li/a"));
        System.out.println("sections: " + sections.size());
        sections.forEach(selement -> { 
            selement.click();
            List<WebElement> details = driver.findElements(By.xpath("//*[@id='details']/div/table/tbody/tr/td/table[1]/tbody/tr/td[2]/strong/a"));
            System.out.println("details: " + details.size());
            details.forEach(delement -> {
                url = delement.getAttribute("href");
                try {
                    huc = (HttpURLConnection) new URL(url).openConnection();
                    huc.setRequestMethod("HEAD");
                    huc.connect();
                    respCode = huc.getResponseCode();
                    if(respCode == 404) {
                        System.out.println(url + " link is broken");
                    } else if (respCode == 200) {
                        System.out.println(url + " link is ok");
                    } else {
                        System.out.println(url + " returned code " + respCode);
                    }
                    huc.disconnect();
                } catch (MalformedURLException e) {
                    e.printStackTrace();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            });
            driver.navigate().back();
        });

问题是在检查第一部分的详细信息后,我收到了StaleElementReferenceException。我猜这是因为在迭代细节并返回后 Selenium 不会将其余部分列表视为当前?

我可能会为部分创建一个所有 href 的列表,然后遍历该列表导航到特定部分链接,然后检查详细信息的链接。但也许还有其他/更简单的解决方案?

【问题讨论】:

    标签: java selenium staleelementreferenceexception


    【解决方案1】:

    是的,你是对的,回到主页后。列表元素正在发生变化,即使它相同,它也不会引用相同的元素。 您不能将 for each 用于第一次/外部迭代。您可以按如下方式进行更改。还。返回后应重新识别/搜索列表元素。

    List<WebElement> sections = driver.findElements(By.xpath("//*[@id='sections']/li/a"));
            System.out.println("sections: " + sections.size());
            for(int i=0;i<sections.size();i++){ 
                WebElement selement = sections.get(i);
                selement.click();
                List<WebElement> details = driver.findElements(By.xpath("//*[@id='details']/div/table/tbody/tr/td/table[1]/tbody/tr/td[2]/strong/a"));
                System.out.println("details: " + details.size());
                details.forEach(delement -> {
                    url = delement.getAttribute("href");
                    try {
                        huc = (HttpURLConnection) new URL(url).openConnection();
                        huc.setRequestMethod("HEAD");
                        huc.connect();
                        respCode = huc.getResponseCode();
                        if(respCode == 404) {
                            System.out.println(url + " link is broken");
                        } else if (respCode == 200) {
                            System.out.println(url + " link is ok");
                        } else {
                            System.out.println(url + " returned code " + respCode);
                        }
                        huc.disconnect();
                    } catch (MalformedURLException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                });
                driver.navigate().back();
                sections = driver.findElements(By.xpath("//*[@id='sections']/li/a"));
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-23
      • 2017-11-16
      • 1970-01-01
      • 2020-12-14
      相关资源
      最近更新 更多