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