У меня такая ситуация: есть несколько страниц, они все разные, но имеют какой-то одинаковый функционал. Скажем, логин.
Есть ли возможность построить иерархию классов в этом случае? Я хочу указывать локаторы в каждом конерктном классе, а методы, использующие эти элементы, описать в базовом.
Конкретного примера в Java у меня нет, но я такую штуку делал в C#. Тут все очень зависит от того, как реализована PageFactory внутри. На C# используется Castle DynamicProxy, и эта библиотека позволяет осуществить подход, описанный выше.
Для начала, и для удобства можно вынести веб браузер в отдельный статический класс.
У меня экземпляр текущего вебдрайвера можно получить через:
WebBrowser.Driver
В этом случае, я поместил инициализацию в конструктор базового класса(AbstractPageBase), который в C# выполняется автоматически при создании любого дочернего класса.
И есть страница LoginPage, которая содержит лишь декларации элементов. При создании экземпляра LoginPage – конструктор базового класса и инициализация пейджобжекта будет выполнена автоматически.
Согласно правилам Java, в дочерних классах Вы таким образом декларируете новые поля, "перегрузки полей" не существует.
Зато по прежнему доступна перегрузка методов, поэтому можно сделать так:
public abstract class BasePage {
abstract public WebElement getLoginField();
abstract public WebElement getPasswordField();
abstract public WebElement getLoginButton();
public void login() {
getLoginField().sendKeys(login);
getPasswordField().sendKeys(password);
getLoginButton().click();
}