首页 > 解决方案 > 使用 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());

表结构图片

标签: javalistseleniumset

解决方案


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());

推荐阅读