Паттерн проектирования, который инкапсулирует работу с элементами веб-страницы в отдельный класс.
public class LoginPage {
private WebDriver driver;
// Локаторы элементов
By usernameField = By.id("username");
By passwordField = By.id("password");
By submitButton = By.id("login-btn");
By errorMessage = By.cssSelector(".error");
public LoginPage(WebDriver driver) {
this.driver = driver;
}
// Методы для взаимодействия со страницей
public void enterUsername(String username) {
driver.findElement(usernameField).sendKeys(username);
}
public void enterPassword(String password) {
driver.findElement(passwordField).sendKeys(password);
}
public void clickSubmit() {
driver.findElement(submitButton).click();
}
public boolean isErrorDisplayed() {
return driver.findElement(errorMessage).isDisplayed();
}
// Комбинированный метод
public HomePage loginAs(String username, String password) {
enterUsername(username);
enterPassword(password);
clickSubmit();
return new HomePage(driver);
}
}
Расширение Page Object, предоставляемое Selenium WebDriver для упрощения инициализации элементов страницы.
initElements()
public class LoginPage {
@FindBy(id = "username")
private WebElement usernameField;
@FindBy(id = "password")
private WebElement passwordField;
@FindBy(id = "login-btn")
private WebElement submitButton;
@FindBy(css = ".error")
private WebElement errorMessage;
public LoginPage(WebDriver driver) {
PageFactory.initElements(driver, this);
}
public void login(String username, String password) {
usernameField.sendKeys(username);
passwordField.sendKeys(password);
submitButton.click();
}
}
Критерий | Классический Page Object | Page Factory |
---|---|---|
Инициализация | Ручная в конструкторе | Автоматическая через аннотации |
Синтаксис | Явный поиск элементов | Аннотации + делегирование |
Гибкость | Больше контроля | Меньше кода |
Производительность | Быстрее (элементы инициализируются сразу) | Медленнее (ленивая загрузка) |
PageFactory.initElements(new AjaxElementLocatorFactory(driver, 10), this);
@FindBy(id = "username")
@CacheLookup // Кэшировать найденный элемент
private WebElement usernameField;
private Component usernameField = driver -> driver.findElement(By.id("username"));
public class Button {
private By locator;
public Button(By locator) { this.locator = locator; }
public void click(WebDriver driver) {
driver.findElement(locator).click();
}
}
Page Object - это:
Page Factory - это:
Что выбрать:
Правильно реализованный Page Object/Factory: