我正在尝试从动态可滚动表中提取所有行,该表一次仅显示大约 30 行。我的想法是通过 while 循环运行它,直到最后一行的“data-index”属性匹配并使用 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());
关于java - 使用 selenium webdriver 处理动态表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55013805/