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

Какие функции реализовывал в Base Page?

2.3 Middle🔥 152 комментариев
#Selenium и UI автоматизация#Фреймворки тестирования

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Функциональность Base Page в паттерне Page Object

В качестве Senior QA Automation Engineer с более чем 10-летним опытом, я рассматриваю Base Page как фундаментальный абстракционный слой в архитектуре фреймворка автоматизации, реализующий DRY (Don't Repeat Yourself) принцип и обеспечивающий единую точку контроля для общих операций и поведения всех страниц приложения.

Ключевые категории функций, реализуемых в Base Page:

1. Инициализация и базовые свойства драйвера:

  • Хранение и предоставление ссылки на экземпляр WebDriver (или другого клиента, например, для мобильной или API-автоматизации).
  • Инициализация драйвера через конструктор и его корректное завершение (хотя часто это ответственность уровня тестов).
  • Предоставление свойства для быстрого доступа к драйверу из классов-наследников.
# Python + Selenium пример
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

class BasePage:
    def __init__(self, driver):
        self.driver = driver
        self.wait = WebDriverWait(driver, 10)
        self.base_url = "https://example.com"

    # Свойство для удобного доступа
    @property
    def webdriver(self):
        return self.driver

2. Обертки (Wrappers) для взаимодействия с элементами: Это наиболее критичная часть. Мы создаем стабильные, самовосстанавливающиеся и логируемые методы для замены прямых вызовов API фреймворка (например, Selenium).

  • Поиск элемента (find_element, find_elements): Добавление явных ожиданий, кастомных локаторов, логирования.
  • Клики (click, js_click): Ожидание кликабельности, обработка исключений (например, ElementClickInterceptedException), резервные клики через JavaScript.
  • Ввод текста (type, set_value): Очистка поля, посимвольный ввод с паузами для сложных полей, логирование вводимого значения.
  • Получение атрибутов и текста (get_text, get_attribute): Ожидание видимости элемента, обрезка пробелов, приведение к нужному типу.
// Java + Selenium пример
public abstract class BasePage {
    protected WebDriver driver;
    protected WebDriverWait wait;

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

    // Обертка для клика с ожиданием
    public void click(WebElement element) {
        wait.until(ExpectedConditions.elementToBeClickable(element));
        log.debug("Clicking on element: " + element);
        element.click();
    }

    // Обертка для ввода текста
    public void type(WebElement element, String text) {
        wait.until(ExpectedConditions.visibilityOf(element));
        element.clear();
        log.debug("Typing text '" + text + "' into element: " + element);
        element.sendKeys(text);
    }
}

3. Навигация и управление окнами:

  • Открытие URL (open(path)), с комбинацией base_url и относительного пути.
  • Переключение между окнами, вкладками и фреймами (switch_to_window, switch_to_frame).
  • Навигация вперед/назад, обновление страницы.
  • Управление куками и localStorage.

4. Ожидания (Waits):

  • Кастомные ожидания для специфичных условий приложения (например, исчезновение лоадера, появление определенного текста).
  • Явные ожидания для готовности страницы (не только document.readyState, но и кастомные JS-флаги).
// JavaScript + WebdriverIO пример
class BasePage {
    // Ожидание кастомного условия загрузки страницы
    async waitForPageLoaded() {
        await browser.waitUntil(
            async () => {
                const state = await browser.execute(() => document.readyState);
                const customFlag = await browser.execute(() => window.appIsReady);
                return state === 'complete' && customFlag === true;
            },
            {
                timeout: 30000,
                timeoutMsg: 'Page failed to load within 30 seconds'
            }
        );
    }
}

5. Логирование и отчетность:

  • Инициализация логгера, общего для всех страниц.
  • Автоматическое логирование ключевых действий (открытие страницы, клики, ввод данных).
  • Прикрепление скриншотов к отчету при неудачных действиях (часто через listeners, но базовый метод может быть здесь).

6. Вспомогательные утилиты:

  • Генерация тестовых данных (рандомные строки, emails).
  • Работа с датами и временем в формате приложения.
  • Методы для скроллинга (scroll_to_element).
  • Методы для JavaScript-исполнения (execute_script).

7. Проверки (Assertions):

  • Базовые проверки присутствия/видимости элемента на странице.
  • Проверка, что текущий URL соответствует ожидаемому (is_page_opened).

Эволюционный взгляд:

В современных сложных SPA (Single Page Application) или микросервисных архитектурах роль Base Page расширяется. Она может содержать:

  • API-клиент для выполнения фоновых запросов, необходимых для подготовки состояния приложения.
  • Методы для работы с WebSocket уведомлениями.
  • Адаптеры для переключения контекста (например, веб-версия ↔ мобильная версия).

Итоговая цель — создать надежный, поддерживаемый и расширяемый фундамент, который скрывает нюансы низкоуровневого API от Page Objects, делая их код чистым, сфокусированным на бизнес-логике и устойчивым к мелким изменениям в UI. Правильно реализованный Base Page сокращает объем кода в тестах на 30-40% и значительно упрощает его поддержку.