Skip to main content

On This Page

Playwright E2E Testing: Complete Guide with Page Object Model

3 min read
Share

These articles are AI-generated summaries. Please check the original sources for full details.

End-to-End Testing with Playwright: Complete Guide with Page Object Model

Playwright has emerged as the industry standard for E2E testing by providing built-in auto-waiting and native cross-browser support. Using 8 parallel workers, developers can reduce the execution time of 100 tests from 5 minutes to just 45 seconds.

Why This Matters

Flaky test suites caused by network timeouts and race conditions are a primary bottleneck in modern CI/CD pipelines, often resulting in expensive development delays. While ideal testing models assume a static environment, Playwright addresses technical reality by providing resilient locators and automatic retries that maintain stability even in resource-constrained CI environments. Implementing the Page Object Model (POM) further mitigates maintenance costs by centralizing locators, preventing the common anti-pattern of scattered, brittle selectors that break during UI iterations.

Key Insights

  • Parallel execution allows for 100 tests to complete in 45 seconds using 8 workers, representing a 6.7x speed increase over sequential runs.
  • The Page Object Model (POM) pattern provides a clean abstraction layer, reducing maintenance debt by centralizing locators in dedicated classes.
  • Built-in auto-waiting eliminates the need for flaky manual timeouts by waiting for elements to be actionable before performing interactions.
  • Multi-browser testing is supported out-of-the-box for Chromium, Firefox, and WebKit, including mobile emulation for devices like the iPhone 12.
  • Advanced reporting via Allure-Playwright enables failure analysis with trends, historical data tracking, and execution timelines.
  • Strategic retry management in CI environments (typically 2-3 retries) helps overcome intermittent network delays and API rate limiting.

Working Examples

Basic Playwright configuration for parallel execution and multi-device testing.

import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
  fullyParallel: true,
  workers: process.env.CI ? 4 : undefined,
  retries: process.env.CI ? 2 : 0,
  reporter: [['html'], ['allure-playwright']],
  use: {
    baseURL: 'https://demo.ecommerce.com',
    trace: 'on-first-retry',
    screenshot: 'only-on-failure',
  },
  projects: [
    { name: 'chromium', use: { ...devices['Desktop Chrome'] } },
    { name: 'mobile-safari', use: { ...devices['iPhone 12'] } },
  ]
});

Implementation of the Page Object Model for a login flow.

import { Page, Locator } from '@playwright/test';
import { BasePage } from '../fixtures/base';
export class LoginPage extends BasePage {
  readonly emailInput: Locator;
  readonly passwordInput: Locator;
  readonly loginButton: Locator;
  constructor(page: Page) {
    super(page);
    this.emailInput = page.locator('input[type="email"]');
    this.passwordInput = page.locator('input[type="password"]');
    this.loginButton = page.locator('button:has-text("Log In")');
  }
  async login(email: string, password: string) {
    await this.emailInput.fill(email);
    await this.passwordInput.fill(password);
    await this.loginButton.click();
    await this.page.waitForNavigation();
  }
}

Practical Applications

  • E-commerce systems use Page Object Model to maintain complex purchase flows across desktop and mobile viewports.
  • Pitfall: Using page.waitForTimeout(2000) causes slow and flaky tests; use auto-waiting or page.waitForLoadState(‘networkidle’) instead.
  • CI/CD pipelines utilize GitHub Actions with matrix strategies to run tests across multiple Node.js versions and browsers simultaneously.
  • Pitfall: Brittle index-based selectors like page.locator(‘button’).nth(2) break easily; use semantic locators like getByRole or getByTestId.

References:

Continue reading

Next article

Automating .NET CI/CD: A Guide to GitHub Actions and Azure Deployment

Related Content