Selenium: найти элемент «рядом» с другим элементом

#java #testing #selenium

#java #тестирование #selenium

Вопрос:

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

 final WebElement dateElement = web.findElement(By.id(elementId));
  

И это работает нормально.
Теперь у меня есть другое требование. Это на моей сгенерированной странице:

 <input type="text" id="dateElement" name="dateElement" value="bunch of monkeys" tabindex="101" placeholder="yyyy-mm-dd">
<span class="error">dateElement is an invalid date</span>
  

Как я могу получить сообщение об ошибке?
Я хотел бы что-то, что позволяет мне запрашивать элемент span с классом «ошибка», который находится сразу после dateElement.

(Это сообщение об ошибке было создано Spring MVC, поэтому его нелегко изменить напрямую. Я думаю, возможно, но я бы предпочел этого не делать).

Любая альтернативная идея приветствуется.

Ответ №1:

Хорошо, я уже нашел решение, используя Xpath и following-sibling, это было не слишком сложно.

 final WebElement errorElement = web.findElement(By.xpath("//*[@id='"   elementId   "']/following-sibling::span[@class='error']"));
  

Это дает мне то, что я хотел, и выдает NoSuchElementException , когда его здесь нет, а это именно то, что я хочу.

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

1. отлично, мне тоже нужен был ответ

2. Это можно даже упростить, используя, final WebElement errorElement = dateElement.findElement(By.xpath("following-sibling::span[@class='error']")); если у вас есть фактический WebElement dateElement доступный. Вы должны использовать этот элемент в качестве корня поиска, но обратите внимание, что выражение xpath не должно начинаться с // (или / ) в этом случае, иначе он все равно будет искать из корня документа.

3. спасибо neXus, это именно тот метод, который я ищу!

Ответ №2:

 elementSelector = "input   span[class='error']";

final WebElement dateElement = web.findElement(By.cssSelector(elementSelector));
  

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

1. Почему не errorElement вместо dateElement ? А что, если это ошибка, не связанная с dateElement?

2. @tishma, потому что это было то, что использовалось для OP