Обработка динамической таблицы с помощью селена Webdriver - PullRequest
0 голосов
/ 06 марта 2019

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

1 голос
/ 06 марта 2019

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);
    dynamicSongTable = driver.findElements(By.xpath("//tbody[@data-count='273']/tr"));
}

System.out.println(songsTr.size());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...