Фабрики Page Objects

Page Object — это шаблон проектирования, позволяющий создавать абстракции для веб-страниц или их частей в тестах. Основная цель Page Object — разделение логики взаимодействия с UI и самих тестов, что повышает поддерживаемость и читаемость кода. Фабрики Page Objects представляют собой расширение этой идеи: они позволяют создавать объекты страниц динамически, параметризованно и централизованно.

Основные принципы работы фабрик Page Objects

  1. Изоляция селекторов и действий Page Object инкапсулирует все селекторы элементов страницы и методы взаимодействия с ними. Фабрика Page Objects создаёт экземпляр этой страницы на основе заданных параметров: URL, состояния приложения, пользовательских ролей. Это позволяет использовать один и тот же шаблон страницы для разных контекстов.

  2. Параметризация объектов Фабрики дают возможность передавать аргументы при создании Page Object. Например, можно создавать объекты для разных пользователей или для страниц с различными вариантами контента:

    // Фабрика Page Object
    function createLoginPage(role) {
        const usernameSelector = element(by.id('username'));
        const passwordSelector = element(by.id('password'));
        const loginButton = element(by.id('login'));
    
        return {
            enterUsername(username) {
                return usernameSelector.sendKeys(username);
            },
            enterPassword(password) {
                return passwordSelector.sendKeys(password);
            },
            clickLogin() {
                return loginButton.click();
            },
            navigate() {
                if (role === 'admin') {
                    browser.get('/admin/login');
                } else {
                    browser.get('/login');
                }
            }
        };
    }
    
    // Использование фабрики
    const adminLoginPage = createLoginPage('admin');
    const userLoginPage = createLoginPage('user');
  3. Централизованное управление страницами Создание всех Page Objects через фабрики позволяет иметь единое место для конфигурации и управления селекторами. Это особенно важно для крупных проектов, где структура страниц часто меняется. Любые изменения в DOM требуют исправления только в фабрике, а не во всех тестах.

  4. Поддержка динамических страниц В современных приложениях элементы часто создаются динамически, а состояние страницы зависит от данных. Фабрика Page Objects может создавать объекты с динамическими селекторами на основе входных параметров:

    function createProductPage(productId) {
        return {
            productTitle: element(by.css(`#product-title-${productId}`)),
            addToCartButton: element(by.css(`#add-to-cart-${productId}`)),
            getTitleText() {
                return this.productTitle.getText();
            },
            addToCart() {
                return this.addToCartButton.click();
            }
        };
    }
    
    const productPage = createProductPage(42);
  5. Интеграция с вспомогательными библиотеками Фабрики хорошо сочетаются с вспомогательными модулями для генерации данных, ожиданий (ExpectedConditions) и логирования. Можно создавать Page Object с встроенными проверками и предустановленными действиями:

    function createDashboardPage() {
        const EC = protractor.ExpectedConditions;
        const welcomeBanner = element(by.id('welcome-banner'));
    
        return {
            waitForBanner() {
                return browser.wait(EC.visibilityOf(welcomeBanner), 5000);
            },
            getBannerText() {
                return welcomeBanner.getText();
            }
        };
    }

Рекомендации по организации фабрик

  • Разделение по типам страниц: для каждой логической группы страниц создаётся отдельная фабрика. Например, authPageFactory.js, dashboardPageFactory.js.
  • Использование конфигурации: параметры страниц (URL, роли, локализация) лучше хранить в отдельном конфигурационном файле.
  • Минимизация дублирования кода: общие методы можно вынести в базовый Page Object, от которого фабрики наследуют функциональность.
  • Чистота API: методы Page Object должны отражать действия пользователя, а не манипуляции с селекторами напрямую.

Преимущества фабрик Page Objects

  • Повышается поддерживаемость тестов: изменение структуры страницы не требует правки всех тестов.
  • Упрощается тестирование различных сценариев: одни и те же страницы могут использоваться для разных ролей и состояний.
  • Облегчается масштабирование проекта: новые страницы добавляются через фабрики, без дублирования логики.
  • Уменьшается время написания тестов: фабрика возвращает готовый объект с методами для взаимодействия.

Фабрики Page Objects являются неотъемлемой частью крупных Protractor-проектов, где требуется гибкость, повторное использование и структурированность кода. Они позволяют создавать модульные, легко расширяемые и понятные тестовые сценарии, повышая качество автоматизации.