Разница между @FindBy и findElements

В тесте использовала pageObject, однако

@FindBy("//...")
List<WebElement> options();
...
options().stram()...

возвращал пустой спискок. Тот же самый xpath

List<WebElement> options = findElements(By.xpath("//..."));

возвращает три элемента. Пыталась искать, почему так, однако нашла только объяснение, что по сути это одно и тоже; было одно упоминание, что @FindBy - динамический, а findElements() - статический, однако страница, на которой идёт работа, никак не меняется в процессе выполнения метода. В чём кардинальное различие в работе @FindBy и findElements(), что они могу возвращать разные значения?


Ответы (1 шт):

Автор решения: Alexey R.

Разница между @FindBy и findElements в том, что первый используется для разметки полей, которые связываются с элементами на странице после того как Вы воспользуетесь методом PageFactory.init(...). В этот момент они инициализируются прокси-объектами и лукап элемента происходит только после фактического обращения к полю. В этом процессе замешаны механизмы рефлексии языка Java.

Всё это используется при реализации паттерна проектирования, называемого page object. Чуть подробнее можно почитать здесь.

Метод findElements это просто инструкция для вебдрайвера найти на странице элемент по локатору. Этот поиск происходит в момент исполнения инструкции (она, кстати используется "под капотом", когда Вы обращаетесь к полю аннотированному @FindBy).

Разницы, по идее, быть не должно, если страница статическая. Может иметь значение контекст поиска (SearchContext) потому как, Вы можете искать как начиная от корня, так и начиная от уже обнаруженного элемента, но в Вашем случае это не должно влиять, потому как Вы используете xpath, начинающийся с //, который игнорирует контекст поиска.

Может также иметь значение стратегия кеширования (но она по умолчанию отключена). Если кеширование включено (при варианте с @FindBy), то последующие обращения к полю, не будут приводить к попытке нового поиска. Они будут вовзращать то, что было найдено при первом обращении к полю. В то время как findElements всегда будет искать элементы заново.

P.S. - Аннотация @FindBy должна использоваться в таком виде:

@FindBy(xpath="//...")
List<WebElement> name;

У Вас в примере написано что-то странное. Наверное по памяти писали, потому что так оно и не скомпилируется.

→ Ссылка