Page Object — это шаблон проектирования, позволяющий создавать абстракции для веб-страниц или их частей в тестах. Основная цель Page Object — разделение логики взаимодействия с UI и самих тестов, что повышает поддерживаемость и читаемость кода. Фабрики Page Objects представляют собой расширение этой идеи: они позволяют создавать объекты страниц динамически, параметризованно и централизованно.
Изоляция селекторов и действий Page Object инкапсулирует все селекторы элементов страницы и методы взаимодействия с ними. Фабрика Page Objects создаёт экземпляр этой страницы на основе заданных параметров: URL, состояния приложения, пользовательских ролей. Это позволяет использовать один и тот же шаблон страницы для разных контекстов.
Параметризация объектов Фабрики дают возможность передавать аргументы при создании 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');Централизованное управление страницами Создание всех Page Objects через фабрики позволяет иметь единое место для конфигурации и управления селекторами. Это особенно важно для крупных проектов, где структура страниц часто меняется. Любые изменения в DOM требуют исправления только в фабрике, а не во всех тестах.
Поддержка динамических страниц В современных приложениях элементы часто создаются динамически, а состояние страницы зависит от данных. Фабрика 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);Интеграция с вспомогательными библиотеками
Фабрики хорошо сочетаются с вспомогательными модулями для генерации
данных, ожиданий (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.Фабрики Page Objects являются неотъемлемой частью крупных Protractor-проектов, где требуется гибкость, повторное использование и структурированность кода. Они позволяют создавать модульные, легко расширяемые и понятные тестовые сценарии, повышая качество автоматизации.