java - 使用 selenium webdriver 处理动态表

标签 java list selenium set

我正在尝试从动态可滚动表中提取所有行,该表一次仅显示大约 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());

Picture of the table structure

最佳答案

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/

相关文章:

python - 循环并附加到列表

python - 如何比较两个列表并找出 `added` `deleted` `unchanged ` 部分

java - 使用 Selenium 生成随机电子邮件

JavaFX 9/10 不再可能覆盖 TableView.resizeColumnToFitContent

java - DefaultCookieSerializer.setJvmRoute 不工作

java - 按列迭代二维数据,在 Java 中处理和存储列标题

ruby - 无法使用 Selenium WebDriver 在 Safari 中单击按钮

java - Hyperic Java API

java - 在java中处理大数据列表

java - org.openqa.selenium.InvalidElementStateException :Cannot perform native interaction: Could not load native events component