Fluent Page Object Pattern — это расширение классического паттерна Page Object, в котором методы страниц возвращают сам объект страницы или другой объект, позволяя выстраивать цепочки вызовов. Такой подход повышает читаемость тестов и упрощает их поддержку.
this или другой
объект Каждый метод, который выполняет действие на странице,
должен возвращать объект страницы. Это позволяет строить цепочки:await loginPage
.enterUsername('user')
.enterPassword('password')
.submit();
Разделение логики действий и проверок Методы
действия (enterUsername, clickButton)
отделяются от методов проверок (verifyLoginSuccess). Это
делает код более модульным и удобным для повторного
использования.
Минимизация дублирования селекторов Все селекторы инкапсулируются внутри Page Object. Изменение разметки страницы требует правок только в одном месте.
Типичный Fluent Page Object содержит три блока:
class LoginPage {
constructor(page) {
this.page = page;
this.usernameInput = page.locator('#username');
this.passwordInput = page.locator('#password');
this.submitButton = page.locator('#login');
}
}
this.enterUsername(username) {
this.usernameInput.fill(username);
return this;
}
enterPassword(password) {
this.passwordInput.fill(password);
return this;
}
submit() {
this.submitButton.click();
return this;
}
async verifyLoginSuccess() {
await expect(this.page.locator('#welcome')).toBeVisible();
return this;
}
Читаемость тестов Цепочки методов создают «историю действий», понятную без комментариев.
Уменьшение повторяющегося кода Повторно используемые действия инкапсулируются в методах Page Object.
Гибкость и расширяемость Методы легко комбинируются, добавляются новые действия без изменения тестов.
import { test, expect } from '@playwright/test';
import { LoginPage } from './pages/LoginPage';
test('Авторизация пользователя', async ({ page }) => {
const loginPage = new LoginPage(page);
await loginPage
.enterUsername('user1')
.enterPassword('securePass')
.submit()
.verifyLoginSuccess();
});
В этом примере видно, как методы страницы создают цепочку действий, превращая тест в понятный сценарий.
submit() {
this.submitButton.click();
return new DashboardPage(this.page);
}
await внутри Все
действия Playwright асинхронные, поэтому методы часто должны
использовать async/await:async enterUsername(username) {
await this.usernameInput.fill(username);
return this;
}
async loginAs(user, password) {
return this
.enterUsername(user)
.enterPassword(password)
.submit();
}
this применим только для методов действия;
методы проверки могут возвращать объекты результатов.Fluent Page Object Pattern в Playwright позволяет писать короткие, читаемые и поддерживаемые тесты, где каждый шаг описан как часть единого сценария, а структура кода остается модульной и расширяемой.