При наличии класса с локаторами, где хранить логику работы с ними?

«При наличии класса с локаторами, где хранить логику работы с ними?» — вопрос из категории Selenium и Selenide, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Логику работы с локаторами я храню в Page Object-классах, следуя паттерну Page Object Model (POM). Это позволяет инкапсулировать структуру страницы и действия с ней.

Пример на Java с Selenium:

public class LoginPage {
    private WebDriver driver;

    // Локаторы
    private By usernameInput = By.id("username");
    private By passwordInput = By.id("password");
    private By submitButton = By.id("submit");

    public LoginPage(WebDriver driver) {
        this.driver = driver;
    }

    public HomePage login(String username, String password) {
        driver.findElement(usernameInput).sendKeys(username);
        driver.findElement(passwordInput).sendKeys(password);
        driver.findElement(submitButton).click();
        return new HomePage(driver);
    }
}

Преимущества такого подхода:

  1. Инкапсуляция: Локаторы и методы их использования находятся в одном месте.
  2. Удобство поддержки: При изменении локатора правка вносится только в один класс.
  3. Читаемость тестов: Тесты используют понятные методы (например, loginPage.login("user", "pass")) вместо низкоуровневых операций с findElement.

Если локатор используется на нескольких страницах (например, хедер или футер), я выношу его в базовый класс (BasePage) или в отдельный класс с общими компонентами.