Selenium: аннотация @FindBy и метод initElemets () - PullRequest
0 голосов
/ 23 марта 2020

Я новичок в Selenium и StackOverflow.

Заранее извиняюсь, если есть какая-либо ошибка.

Мой вопрос:

Как работает внутренняя аннотация @FindBy() и зачем нужен метод initElemets()

1 Ответ

0 голосов
/ 24 марта 2020

Метод initElements() инициализирует все поля WebElement и List<WebElement> с помощью Java Reflection API. Он в основном изменяет значения по умолчанию null на реализации интерфейса с использованием Proxy. Он также обеспечивает своего рода Ленивое создание экземпляра WebElement, что означает - WebElements обнаруживаются (ищутся?) Только при необходимости - когда вы вызываете операции над ними.

Более подробно: initElements принимает Object или Class<?> в качестве аргумента и создает из него объект. Имея это, PageFactory получает все поля в классе, проверяет, является ли какое-либо из них типом WebElement или List, и инициализирует их.

Если WebElement НЕ аннотировано @FindBy, тогда PageFactory пытается создать селектор по имени переменной. Примерно так WebElement username может работать без аннотаций.

Если WebElement помечен @FindBy, тогда объект By создается и подключается к WebElement для последующего использования. Эта часть является лишь предположением.

Затем создается экземпляр WebElement. Поскольку это интерфейс, его нельзя создать напрямую с помощью Reflection API. Прокси используется для обработки WebElement. PageFactory инициализирует элементы в предоставленном объекте страницы с вновь созданными экземплярами WebElements, используя Reflection.

Оба, WebDriver и WebElement реализуют интерфейс SearchContext, который также сообщает WebDriver, как искать элемент. Является ли это во всей странице источника или область видимости сводится к конкретному WebElement. Вот почему мы можем искать элементы через другие элементы, например: element.findElement(By.id("username")).

Надеюсь, я немного это объяснил!

...