TransWikia.com

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

Stack Overflow на русском Asked on November 22, 2021

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

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

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

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

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

One Answer

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

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

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

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

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

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

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

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

Answered by Alexey R. on November 22, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP