Метод 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"))
.
Надеюсь, я немного это объяснил!