Our offices

  • Exceev Consulting
    61 Rue de Lyon
    75012, Paris, France
  • Exceev Technology
    332 Bd Brahim Roudani
    20330, Casablanca, Morocco

Follow us

5 min read - How Playwright is Revolutionizing QA Automation

QA Automation & Testing

Manual testing cannot keep up with modern release cycles. Automated testing has existed for years, but legacy tools like Selenium are brittle, slow, and expensive to maintain. Playwright, developed by Microsoft, solves the problems that made teams distrust their test suites — and it does so with a developer experience that actually encourages writing tests.

What you'll learn

  • What makes Playwright different from Selenium and Cypress
  • How auto-waits and browser contexts eliminate test flakiness
  • Setting up Playwright with CI/CD (GitHub Actions, GitLab CI)
  • Network interception patterns for mocking APIs and simulating errors
  • Parallel execution strategies for large test suites
  • When to use Playwright vs Cypress vs Selenium

TL;DR

Playwright drives Chromium, Firefox, and WebKit with a single API. Its auto-wait mechanism eliminates flaky tests by intelligently waiting for elements before interaction. Built-in features include codegen for recording tests, trace viewer for debugging, network interception for API mocking, and parallel execution for fast feedback. It runs in CI with no browser installation headaches.

What Makes Playwright Different

Playwright is an open-source browser automation library that drives all major browser engines — Chromium (Chrome, Edge), Firefox, and WebKit (Safari) — with a single API. This is a meaningful advantage: you write one test and run it across all browsers your users actually use.

Unlike Selenium, Playwright was built for modern web applications. Unlike Cypress, it is not limited to Chromium. Unlike both, it ships with tooling that makes the testing workflow genuinely productive.

Auto-Waits: The End of Flaky Tests

The single biggest improvement Playwright brings is its auto-wait mechanism. Before every action (click, fill, assert), Playwright automatically waits for the element to be:

  • Attached to the DOM
  • Visible
  • Stable (not animating)
  • Enabled
  • Ready to receive events

No more sleep(2000) or waitForSelector calls scattered through your test code. This alone eliminates the majority of flaky tests that plague Selenium and older frameworks.

// Playwright auto-waits for the button to be clickable
await page.getByRole('button', { name: 'Submit' }).click()

// No need for explicit waits — Playwright handles it
await expect(page.getByText('Order confirmed')).toBeVisible()

Browser Contexts: Isolation Without Overhead

Playwright introduces browser contexts — lightweight, isolated browser sessions that share a single browser process. Each context has its own cookies, storage, and cache:

// Create isolated contexts for parallel testing
const context1 = await browser.newContext()
const context2 = await browser.newContext()

// Each context is completely isolated
const adminPage = await context1.newPage()
const userPage = await context2.newPage()

This enables testing multi-user scenarios (admin vs regular user) and parallel test execution without the overhead of launching separate browser instances.

Getting Started

Installation and First Test

npm init playwright@latest

This scaffolds a project with config, example tests, and CI workflow files. A minimal test:

import { test, expect } from '@playwright/test'

test('user can log in', async ({ page }) => {
  await page.goto('/login')
  await page.getByLabel('Email').fill('user@example.com')
  await page.getByLabel('Password').fill('password123')
  await page.getByRole('button', { name: 'Sign in' }).click()

  await expect(page.getByText('Welcome back')).toBeVisible()
})

Codegen: Record Tests Visually

Playwright's codegen tool records browser interactions and generates test code:

npx playwright codegen https://your-app.com

This opens a browser with a recording toolbar. Click through your application, and Playwright generates the corresponding test code with proper locators and assertions.

Trace Viewer: Debug Failures Visually

When a test fails, the trace viewer provides a step-by-step replay with screenshots, DOM snapshots, network logs, and console output:

npx playwright show-trace trace.zip

Each action is recorded with before/after screenshots, making it trivial to identify where a test diverged from expected behavior.

Network Interception

Playwright can intercept and modify HTTP requests, enabling powerful testing patterns:

// Mock an API response
await page.route('**/api/users', async (route) => {
  await route.fulfill({
    status: 200,
    body: JSON.stringify([{ id: 1, name: 'Test User' }]),
  })
})

// Simulate an error
await page.route('**/api/orders', async (route) => {
  await route.fulfill({ status: 500, body: 'Internal Server Error' })
})

// Simulate slow network
await page.route('**/*', async (route) => {
  await new Promise((resolve) => setTimeout(resolve, 3000))
  await route.continue()
})

This eliminates the need for a running backend during frontend tests and lets you test error states, loading states, and edge cases deterministically.

CI/CD Integration

GitHub Actions

name: E2E Tests
on: [push, pull_request]
jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
      - run: npm ci
      - run: npx playwright install --with-deps
      - run: npx playwright test
      - uses: actions/upload-artifact@v4
        if: failure()
        with:
          name: playwright-report
          path: playwright-report/

Parallel Execution

Playwright runs tests in parallel by default, using worker processes. Configure the level of parallelism based on your CI hardware:

// playwright.config.ts
export default defineConfig({
  workers: process.env.CI ? 4 : undefined,
  retries: process.env.CI ? 2 : 0,
  reporter: process.env.CI ? 'html' : 'list',
})

On a standard CI runner (4 CPU), a suite of 200 tests completes in 2-3 minutes instead of 20+ minutes with sequential execution.

Playwright vs Cypress vs Selenium

FeaturePlaywrightCypressSelenium
Browser supportChromium, Firefox, WebKitChromium (Firefox experimental)All browsers
Auto-waitsBuilt-in, reliableBuilt-inManual
Parallel executionBuilt-in workersRequires Cypress CloudRequires Selenium Grid
Network interceptionNativeNativeLimited
Multi-tab/windowSupportedNot supportedSupported
Language supportJS/TS, Python, Java, C#JS/TS onlyAll major languages
Mobile emulationBuilt-inLimitedVia Appium

Choose Playwright when you need true cross-browser testing, multi-tab scenarios, or non-JavaScript language support.

Choose Cypress when your team is JavaScript-only, your users are primarily on Chromium, and you value the Cypress Cloud dashboard.

Choose Selenium only when you have existing Selenium infrastructure or need to support legacy browser configurations.

Reliable, maintainable end-to-end tests

Playwright removes the friction that has historically made teams underinvest in automated testing. Auto-waits eliminate flakiness, codegen lowers the barrier to writing tests, and parallel execution keeps feedback fast. For teams shipping modern web applications, Playwright is the testing framework that finally delivers on the promise of reliable, maintainable end-to-end tests. Need help setting up your QA automation strategy? Let's talk.

We should talk.

Exceev works with startups and SMEs on consulting, open-source tooling, and production-ready software.

More articles

Running a Consultancy on Open-Source Business Tools: Our Operations Playbook

How Exceev runs its business operations on Twenty CRM, ZeroMail, n8n automation, Ghost publishing, Cal.com scheduling, and Postiz social publishing. An operations playbook for consultancies that want control over their business stack.

Read more

Self-Hosting Our Infrastructure: The Observability, Security, and Deployment Stack

How Exceev self-hosts its infrastructure with Grafana, Prometheus, Loki, k6, Coolify, Infisical, Docker, Tailscale, Cloudflared, Beszel, and Duplicati. An operational deep dive into observability, deployment, security, and resilience.

Read more

Tell us about your project

Our offices

  • Exceev Consulting
    61 Rue de Lyon
    75012, Paris, France
  • Exceev Technology
    332 Bd Brahim Roudani
    20330, Casablanca, Morocco