Исключение устаревших элементов при использовании потоков Java с селектором webdriver - PullRequest
0 голосов
/ 22 июня 2019

Я изучаю Selenium и пытаюсь выполнить упражнение, в котором мне нужно выбрать конкретную дату в календаре.Сначала я собираю все веб-элементы, отфильтрованные по имени класса, в списке, а затем пытаюсь перебрать их, используя Streams API, с необходимой мне датой в качестве условия, а затем пытаюсь щелкнуть по ней.Я успешно могу выбрать свою дату, но сразу после этого в консоли я вижу исключение устаревшего элемента.

Я читал некоторые другие потоки, где они предположили, что это могло быть устаревшим, потому что элемент уничтожени затем воссоздал, другой вопрос, который у меня есть, почему кто-то хочет сделать это и какая польза от разрушения и воссоздания?Я попытался сделать driver.navigate (). Refresh (), но это не помогло.

driver.get("https://www.path2usa.com/travel-companions");

driver.findElement(By.name("travel_date")).click();

List<WebElement> elements = driver.findElements(By.className("day"));

System.out.println(elements.size());

elements.stream().forEach(p -> {
        if (p.getText().equalsIgnoreCase("24")) {
            p.click();}
    });

Ожидается: дата должна быть выбрана, и после этого в консоли Eclipse не будет выдано никаких ошибок.

Факт: Исключение в потоке "main" org.openqa.selenium.StaleElementReferenceException: ссылка на устаревший элемент: элемент не прикреплен к документу страницы

1 Ответ

0 голосов
/ 23 июня 2019

Проблема связана с использованием функции forEach.

Вот как это работает сейчас:

driver.findElement(By.name("travel_date")).click();

-> Это открывает палитру даты.

Сейчас

driver.findElements(By.className("day"));

-> Возвращает 42

elements.stream().forEach(p -> {
        if (p.getText().equalsIgnoreCase("24")) {
            p.click();}
    });

-> Как только это находит элемент, где getText (). EqualsIgnoreCase ("24"), если вы заметили в пользовательском интерфейсе, средство выбора даты закрывается, и выбранная дата присутствует вТекстовое окно.Теперь для следующей итерации p.getText () вызовет устаревание, так как средство выбора даты не открыто.

Что вам нужно сделать, это

elements.stream().filter(e -> e.getText().equalsIgnoreCase("24")).findAny().get().click();

-> это отфильтрует единственный элементгде getText (). equalsIgnoreCase ("24") и затем щелкните по нему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...