← Назад к вопросам
Какая проблема привела к появлению Page Object Pattern?
1.8 Middle🔥 71 комментариев
#Тестирование
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
# Page Object Pattern: проблема и решение
Page Object Pattern появился как решение проблем при автоматизированном тестировании UI через Selenium.
Проблема без Pattern
Без паттерна селекторы разбросаны по всему коду тестов:
@Test
public void testLogin() {
driver.findElement(By.id("email")).sendKeys("test@example.com");
driver.findElement(By.id("password")).sendKeys("pass123");
driver.findElement(By.className("btn-login")).click();
}
@Test
public void testRegister() {
driver.findElement(By.id("email")).sendKeys("new@example.com");
driver.findElement(By.id("password")).sendKeys("pass123");
driver.findElement(By.className("btn-register")).click();
}
Основные проблемы
- Дублирование — один селектор повторяется в 10+ тестах
- Хрупкость — если разработчик изменит класс кнопки, все тесты упадут
- Сложность поддержки — чтобы обновить селектор, нужно изменить его везде
- Нечитаемость — тесты полны технических деталей селекторов
- Нарушение DRY — одинаковый код повторяется
Пример:
// Селектор .btn-login используется в 15 тестах!
// Если изменить на .primary-button, все 15 тестов упадут
driver.findElement(By.className("btn-login")).click();
Решение: Page Object Pattern
Выносим страницу в отдельный класс:
public class LoginPage {
private WebDriver driver;
private By emailInput = By.id("email");
private By passwordInput = By.id("password");
private By loginButton = By.className("btn-login");
private By errorMsg = By.css(".error-message");
public LoginPage(WebDriver driver) {
this.driver = driver;
}
public void login(String email, String password) {
driver.findElement(emailInput).sendKeys(email);
driver.findElement(passwordInput).sendKeys(password);
driver.findElement(loginButton).click();
}
public boolean isErrorShown() {
return driver.findElement(errorMsg).isDisplayed();
}
}
Тесты становятся чистыми
@Test
public void testValidLogin() {
LoginPage page = new LoginPage(driver);
page.login("user@example.com", "password123");
// проверка успешности
}
@Test
public void testInvalidPassword() {
LoginPage page = new LoginPage(driver);
page.login("user@example.com", "wrong");
assertTrue(page.isErrorShown());
}
Преимущества Pattern
- Селекторы в одном месте — изменил один раз, все работает
- Читаемость —
page.login()понятнее селектора - Переиспользование — один метод в 10+ тестах
- Легкая поддержка — изменения локализованы
- Разделение ответственности — тесты о логике, Page Object о структуре
Сложный Page Object
public class ProductPage {
private WebDriver driver;
private By title = By.css(".product-title");
private By price = By.css(".price");
private By addToCart = By.id("add-cart-btn");
private By reviews = By.css(".review-item");
public ProductPage(WebDriver driver) {
this.driver = driver;
}
public String getProductTitle() {
return driver.findElement(title).getText();
}
public double getPrice() {
String text = driver.findElement(price).getText();
return Double.parseDouble(text.replaceAll("[$,]", ""));
}
public void addProductToCart() {
driver.findElement(addToCart).click();
}
public int getReviewCount() {
return driver.findElements(reviews).size();
}
}
@Test
public void testProductPage() {
ProductPage page = new ProductPage(driver);
assertEquals("Laptop", page.getProductTitle());
assertTrue(page.getPrice() > 0);
page.addProductToCart();
assertTrue(page.getReviewCount() > 0);
}
Проблема которую решает Pattern
Без Pattern:
- Селекторы разбросаны по коду
- Дублирование селекторов
- Хрупкие тесты
- Сложная поддержка
С Pattern:
- Селекторы в одном месте (Page Object)
- Нет дублирования
- Устойчивые тесты
- Легко менять селекторы
Это паттерн, который делает автоматизированные тесты maintainable и scalable.