Обработка динамической таблицы с помощью selenium webdriver

#java #list #selenium #set

#java #Список #selenium #установить

Вопрос:

Я пытаюсь извлечь все строки из динамической таблицы с возможностью прокрутки, где одновременно отображается только около 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());
  

Изображение структуры таблицы

Комментарии:

1. Вместо хранения набора веб-элементов, не могли бы вы сохранить набор какого-нибудь уникального идентификатора (например, тега id), на который позже можно ссылаться?

2. Привет ~ @Azfar вы можете вставить полную трассировку стека вашего журнала ошибок.

Ответ №1:

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