← Назад к вопросам

Какая проблема привела к появлению 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();
}

Основные проблемы

  1. Дублирование — один селектор повторяется в 10+ тестах
  2. Хрупкость — если разработчик изменит класс кнопки, все тесты упадут
  3. Сложность поддержки — чтобы обновить селектор, нужно изменить его везде
  4. Нечитаемость — тесты полны технических деталей селекторов
  5. Нарушение 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

  1. Селекторы в одном месте — изменил один раз, все работает
  2. Читаемостьpage.login() понятнее селектора
  3. Переиспользование — один метод в 10+ тестах
  4. Легкая поддержка — изменения локализованы
  5. Разделение ответственности — тесты о логике, 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.

Какая проблема привела к появлению Page Object Pattern? | PrepBro