访问列表中WebElement时出现Stale Element Reference Exception如何解决?
问题解决思路
异常触发原因
你第一次调用driver.get()跳转链接后,初始站点地图页面的DOM已经被销毁,你提前存储的allURLs列表里的所有WebElement都是绑定原始页面DOM的引用,此时已经全部失效,第二次循环读取元素时就会抛出Stale Element Reference Exception。
最优解决方案
不要边提取链接边跳转,先一次性把所有链接的href属性提取为字符串存储,完全脱离对原始WebElement的依赖后,再逐个打开链接即可。
修复后代码
// 从站点地图容器提取所有链接的方法 public void GetAllLinks() { WebElement pointer = LinksContainer; List <WebElement> allLinkElements = pointer.findElements(By.tagName("a")); System.out.println("页面总链接数:"+ allLinkElements.size()); // 先提取所有href存为字符串列表 List<String> linkUrlList = new ArrayList<>(); for (WebElement link : allLinkElements) { String url = link.getAttribute("href"); // 可选:过滤无效空链接 if (url != null && !url.isBlank()) { linkUrlList.add(url); } } // 遍历字符串列表打开链接 for (String url : linkUrlList) { OpenAllLinks(url); } } // 打开链接的方法 public void OpenAllLinks(String linkURL) { driver.get(linkURL); }
其他可选方案(不推荐)
如果你的业务需要跳转后返回原页面继续操作,也可以每次打开链接后调用driver.navigate().back()返回站点地图页,再重新查找所有锚点元素。但该方案需要额外处理页面加载等待,每次返回都要重新查询元素,效率低且稳定性差,远不如先全量提取链接的方案稳妥。
内容的提问来源于stack exchange,提问作者Arun Gupta
相关产品推荐
相关产品推荐

