Приведи пример кейса, где использовал наследование.

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

Ответ

В рамках автоматизации тестирования веб-приложения я активно использовал наследование для построения иерархии Page Object-классов. Это позволило избежать дублирования кода и улучшить поддерживаемость фреймворка.

Пример на Java:

  1. Базовый класс BasePage, содержащий общую логику для всех страниц (инициализацию драйвера, ожидания, общие элементы типа хедера).
public class BasePage {
    protected WebDriver driver;
    protected WebDriverWait wait;

    // Общий элемент хедера, присутствующий на всех страницах
    protected By headerLogo = By.className("header-logo");

    public BasePage(WebDriver driver) {
        this.driver = driver;
        this.wait = new WebDriverWait(driver, Duration.ofSeconds(10));
    }

    // Общий метод для клика с явным ожиданием
    protected void clickElement(By locator) {
        wait.until(ExpectedConditions.elementToBeClickable(locator)).click();
    }

    // Общий метод для проверки заголовка страницы
    protected boolean isPageTitleContains(String titleFragment) {
        return wait.until(ExpectedConditions.titleContains(titleFragment));
    }
}
  1. Конкретный класс страницы LoginPage, который наследует BasePage и добавляет специфичную для страницы логики.
public class LoginPage extends BasePage {

    // Локаторы, специфичные для страницы логина
    private By usernameField = By.id("username");
    private By passwordField = By.id("password");
    private By loginButton = By.id("login-btn");
    private By errorMessage = By.className("error");

    public LoginPage(WebDriver driver) {
        super(driver); // Вызов конструктора родительского класса
    }

    public HomePage loginWithValidCredentials(String user, String pass) {
        driver.findElement(usernameField).sendKeys(user);
        driver.findElement(passwordField).sendKeys(pass);
        clickElement(loginButton); // Используем метод из BasePage
        return new HomePage(driver);
    }

    public String getErrorMessageText() {
        return wait.until(ExpectedConditions.visibilityOfElementLocated(errorMessage)).getText();
    }
}

Преимущества, которые я получил:

  • Устранение дублирования: Общие методы (clickElement, isPageTitleContains) написаны один раз в BasePage.
  • Упрощение поддержки: Изменение логики ожиданий или добавление нового общего элемента требует правки только в BasePage.
  • Четкая структура: Классы страниц становятся чище и отвечают только за свою уникальную логику.