java - 使用 selenium webdriver 处理动态表
问题描述
我正在尝试从动态可滚动表中提取所有行,该表一次仅显示约 30 行。我的想法是通过 while 循环运行它,直到最后一行的“数据索引”属性匹配并使用 JavascriptExecutor 类滚动,但继续获取 StaleElementReferenceException。
Set<WebElement> songsTr = new HashSet<WebElement>();
List<WebElement> dynamicSongTable = driver.findElements(By.xpath("//tbody[@data-count='273']/tr"));
while (!dynamicSongTable.get(dynamicSongTable.size()-2).getAttribute("data-index").equalsIgnoreCase("272")) {
for (int i = 0; i < dynamicSongTable.size()-1; i++) {
songsTr.add(dynamicSongTable.get(i));
}
WebElement element = dynamicSongTable.get(dynamicSongTable.size()-1);
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("arguments[0].scrollIntoView();", element);
}
System.out.println(songsTr.size());
解决方案
StaleElementReferenceException
当您正在操作的元素不再存在于 dom 中或变得陈旧时,就会出现。因此,为了更正它,您需要在对其进行操作之前再次获取元素。
在你的情况下,它会像:
Set<WebElement> songsTr = new HashSet<WebElement>();
List<WebElement> dynamicSongTable = driver.findElements(By.xpath("//tbody[@data-count='273']/tr"));
while (!dynamicSongTable.get(dynamicSongTable.size()-2).getAttribute("data-index").equalsIgnoreCase("272")) {
for (int i = 0; i < dynamicSongTable.size()-1; i++) {
songsTr.add(dynamicSongTable.get(i));
}
WebElement element = dynamicSongTable.get(dynamicSongTable.size()-1);
JavascriptExecutor jse = (JavascriptExecutor) driver;
jse.executeScript("arguments[0].scrollIntoView();", element);
dynamicSongTable = driver.findElements(By.xpath("//tbody[@data-count='273']/tr"));
}
System.out.println(songsTr.size());
推荐阅读
- c# - 为什么不创建 ClientWebSocket 的新实例就不能重新打开关闭的 ClientWebSocket?
- javascript - Angular 7弹出框加载
- python-3.x - 检查元素是否在python列表中第一次出现
- mysql - 如何在 MYSQL 上向用户授予所有权限
- javascript - 为什么 .save() 不使用我告诉它的数据
- javascript - 禁用不是使用 jQuery 的功能
- webpack - 使用 webpack 加载器时如何在本地 sass 文件中设置变量以覆盖一般 sass 中的设置
- wordpress - 如何在 get_field_objects() 中对日期选择器进行排序
- git - 由于文件名中的空格导致“模棱两可的论点”?
- c# - 为什么删除后表头不为空?