Playwright Page Object Model including page classes, fixtures, helpers, and test organization. Use when structuring Playwright E2E tests or organizing test code.
Installation
Details
Usage
After installing, this skill will be available to your AI coding assistant.
Verify installation:
npx agent-skills-cli listSkill Instructions
name: playwright-page-objects description: Playwright Page Object Model including page classes, fixtures, helpers, and test organization. Use when structuring Playwright E2E tests or organizing test code.
Playwright Page Objects
Expert guidance for organizing Playwright tests with Page Object Model.
Quick Reference
| Concept | Pattern | Location |
|---|---|---|
| Page Object | Class with Locators | pages/*.page.ts |
| Fixture | Extended test context | fixtures/*.ts |
| Helper | Utility functions | helpers/*.ts |
| Test Spec | Test logic using pages | e2e/*.spec.ts |
| Test Data | Data generators | fixtures/test-data.ts |
What Do You Need?
- Page objects - Classes representing pages/components
- Fixtures - Auth, database, test setup
- Test data - Generators, factories
- Helpers - Navigation, assertions
- Organization - File structure, naming
Specify a number or describe your test organization need.
Routing
| Response | Reference to Read |
|---|---|
| 1, "page object", "class", "locator" | page-objects.md |
| 2, "fixture", "extend", "setup" | fixtures.md |
| 3, "test data", "factory", "generator" | test-data.md |
| 4, "helper", "utility", "navigation" | helpers.md |
| 5, "structure", "organization", "folder" | structure.md |
Essential Principles
Page Object Model: Separate page structure (Locators) from test logic (assertions). Makes tests resilient to UI changes.
Fixtures for setup: Extend test context with authenticated pages, database seeders, or other test utilities.
Helpers for reuse: Extract common operations (navigation, waits) into helper functions.
Test data factories: Generate test data programmatically, not hardcoded values.
File Structure
tests/
βββ fixtures/
β βββ auth.ts # Authentication helpers
β βββ database.ts # Database seeding
β βββ test-data.ts # Data generators
βββ pages/
β βββ login.page.ts # Page objects
β βββ dashboard.page.ts
β βββ ...
βββ helpers/
β βββ navigation.ts # Navigation helpers
β βββ assertions.ts # Custom assertions
βββ e2e/
β βββ auth.spec.ts # Test specs
β βββ ...
βββ playwright.config.ts
Code Patterns
Page Object
// pages/login.page.ts
import { Page, Locator } from '@playwright/test'
export class LoginPage {
readonly page: Page
readonly emailInput: Locator
readonly passwordInput: Locator
readonly submitButton: Locator
constructor(page: Page) {
this.page = page
this.emailInput = page.getByTestId('email-input')
this.passwordInput = page.getByTestId('password-input')
this.submitButton = page.getByTestId('submit-button')
}
async goto() {
await this.page.goto('/login')
}
async login(email: string, password: string) {
await this.emailInput.fill(email)
await this.passwordInput.fill(password)
await this.submitButton.click()
}
}
Auth Fixture
// fixtures/auth.ts
import { test as base } from '@playwright/test'
type AuthFixtures = {
authenticatedPage: Page
}
export const test = base.extend<AuthFixtures>({
authenticatedPage: async ({ page }, use) => {
const user = await createTestUser()
await page.goto('/login')
await page.getByTestId('email-input').fill(user.email)
await page.getByTestId('password-input').fill(user.password)
await page.getByTestId('submit-button').click()
await page.waitForURL('/dashboard')
await use(page)
await deleteTestUser(user.id)
},
})
export const expect = test.expect
Using in Tests
// e2e/auth.spec.ts
import { test, expect } from '../fixtures/auth'
import { LoginPage } from '../pages/login.page'
test.describe('Authentication', () => {
test('successful login', async ({ page }) => {
const loginPage = new LoginPage(page)
await loginPage.goto()
await loginPage.login('user@example.com', 'password123')
await expect(page).toHaveURL('/dashboard')
})
})
Reference Index
| File | Topics |
|---|---|
| page-objects.md | Class structure, Locators, methods |
| fixtures.md | Extend test, cleanup, setup |
| test-data.md | Factories, generators, random data |
| helpers.md | Navigation, custom assertions |
| structure.md | Folder layout, naming conventions |
Success Criteria
Tests are well-organized when:
- Page objects separate Locators from test logic
- Fixtures handle setup/teardown automatically
- Test data generated, not hardcoded
- Helpers extract reusable operations
- Test specs read like documentation
More by jovermier
View allGo testing best practices including table-driven tests, race detection, test coverage, and mocking strategies. Use when writing or reviewing Go tests.
Next.js performance optimizations including next/image, next/font, dynamic imports, caching strategies, and bundle optimization. Use when optimizing Next.js apps for speed or Core Web Vitals.
Automatically discover and install relevant skills from SkillsMP and other sources
GraphQL schema design including types, fields, pagination, nullability, naming conventions, and descriptions. Use when designing or modifying GraphQL schemas.
