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(), что они могу возвращать разные значения?
Разница между @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
Get help from others!
Recent Questions
Recent Answers
© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP