Prompt

How do I set up a playwright assistant for regression detection in our CI pipeline?

Latest observation

Jul 19, 2026 · OpenAI APIWeb search: off

Here’s a practical way to set up a Playwright-based assistant for regression detection in CI.

1) Decide what “regression detection” means for you

Usually it’s one or more of:

  • UI breakage: selectors fail, pages don’t load, flows break
  • Visual regressions: screenshots differ
  • Performance regressions: pages get slower
  • Accessibility regressions: missing labels, contrast issues
  • Behavior changes: form submits fail, navigation changes, API responses differ

A good baseline is:

  • Smoke tests on every PR
  • Full regression suite on merge to main/nightly
  • Optional visual snapshot checks on key pages

2) Install Playwright in your repo

If you haven’t already:

npm init playwright@latest

Or add it to an existing project:

npm install -D @playwright/test
npx playwright install --with-deps

3) Create a regression-focused test structure

Organize tests by risk and runtime.

Example:

tests/
  smoke/
    login.spec.ts
    checkout.spec.ts
  regression/
    navigation.spec.ts
    forms.spec.ts
  visual/
    dashboard.spec.ts

Good practice:

  • Keep smoke tests short
  • Put longer, cross-page flows in regression
  • Avoid brittle selectors; use getByRole, getByLabel, getByTestId

Example:

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('secret');
  await page.getByRole('button', { name: 'Sign in' }).click();

  await expect(page).toHaveURL(/dashboard/);
});

4) Add assertions that detect regressions early

Use assertions that fail when the app behavior changes unexpectedly:

  • URL checks
  • Visible text checks
  • Element state checks
  • API response checks
  • Network error checks
  • Screenshot comparisons

Examples:

await expect(page.getByText('Welcome back')).toBeVisible();
await expect(page).toHaveURL(/\/dashboard/);
await expect(page.getByRole('button', { name: 'Save' })).toBeEnabled();

5) Add visual regression snapshots

Playwright supports screenshot testing.

Example:

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

test('dashboard looks correct', async ({ page }) => {
  await page.goto('/dashboard');
  await expect(page).toHaveScreenshot('dashboard.png');
});

Tips:

  • Only snapshot stable pages
  • Mock dynamic data where possible
  • Set consistent viewport, locale, timezone, fonts
  • Use mask for volatile regions if needed

6) Configure Playwright for CI stability

In playwright.config.ts:

import { defineConfig, devices } from '@playwright/test';

export default defineConfig({
  testDir: './tests',
  fullyParallel: true,
  retries: process.env.CI ? 2 : 0,
  workers: process.env.CI ? 2 : undefined,
  reporter: [
    ['html'],
    ['junit', { outputFile: 'test-results/junit.xml' }],
    ['github'],
  ],
  use: {
    baseURL: process.env.BASE_URL || 'http://localhost:3000',
    trace: 'on-first-retry',
    screenshot: 'only-on-failure',
    video: 'retain-on-failure',
  },
  projects: [
    {
      name: 'chromium',
      use: { ...devices['Desktop Chrome'] },
    },
  ],
});

Key CI settings:

  • retries: reduce flakiness
  • trace: helps debug failures
  • screenshot/video: capture evidence
  • junit: integrate with CI test reporting

7) Run tests in CI

GitHub Actions example

Create .github/workflows/playwright.yml:

name: Playwright Tests

on:
  pull_request:
  push:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - name: Use Node.js
        uses: actions/setup-node@v4
        with:
          node-version: 20
          cache: npm

      - name: Install dependencies
        run: npm ci

      - name: Install Playwright browsers
        run: npx playwright install --with-deps

      - name: Run Playwright tests
        run: npx playwright test
        env:
          BASE_URL: http://localhost:3000

      - name: Upload Playwright report
        if: always()
        uses: actions/upload-artifact@v4
        with:
          name: playwright-report
          path: playwright-report/

If your app needs to be started in CI, add a step before tests:

      - name: Build app
        run: npm run build

      - name: Start app
        run: npm run start &

For reliability, consider using a tool like wait-on or Playwright’s built-in web server config.


8) Use Playwright’s webServer for local/CI consistency

This is often the cleanest setup.

webServer: {
  command: 'npm run start',
  url: 'http://localhost:3000',
  reuseExistingServer: !process.env.CI,
  timeout: 120 * 1000,
},

Then Playwright will start your app automatically before tests.


9) Add a regression “assistant” layer

If by “assistant” you mean an automated helper that:

  • runs tests,
  • summarizes failures,
  • clusters flaky vs real failures,
  • and posts results to Slack/PRs,

then implement a small reporting service around Playwright output.

Common pattern:

  1. Playwright runs in CI
  2. Generate JSON/JUnit/HTML report
  3. Parse failures
  4. Send concise summary to Slack/GitHub PR comment
  5. Attach trace links/screenshots

For example, use:

  • junit report for CI status
  • playwright-report artifact for debugging
  • a custom Node script to summarize failures

Pseudo-flow:

npx playwright test --reporter=junit
node scripts/notify-regressions.js

Your script can:

  • read JUnit/XML
  • extract failed tests
  • map them to owners
  • flag likely flaky tests if retry passed
  • post a message to Slack or GitHub

10) Handle flaky tests aggressively

Flakiness is the biggest enemy of regression detection.

Best practices:

  • Prefer role-based locators
  • Avoid arbitrary waits like waitForTimeout
  • Wait for visible UI states or network responses
  • Mock unstable third-party services
  • Freeze time if needed
  • Isolate test data per run
  • Use retries only as a safety net, not a fix

Bad:

await page.waitForTimeout(5000);

Better:

await expect(page.getByText('Order confirmed')).toBeVisible();

11) Add test data management

Regression tests are much more stable when data is controlled.

Options:

  • Seed the DB before CI
  • Use API calls to create test users/orders
  • Reset data between test runs
  • Mock backend responses for UI-only tests

Example via API:

test.beforeEach(async ({ request }) => {
  await request.post('/api/test-data/reset');
});

12) Decide on gating rules

Typical CI gating:

  • PR: block merge on any smoke failure
  • main/nightly: run full suite and visual tests
  • If visual diffs occur, require approval

You can also set:

  • “hard fail” for critical smoke tests
  • “soft fail” for non-critical exploratory checks
  • separate flaky test quarantine job

13) Recommended minimal setup

If you want the simplest effective setup:

  • Playwright test suite
  • playwright.config.ts with retries + trace
  • GitHub Actions running on PRs
  • smoke tests for critical flows
  • one or two screenshot tests
  • JUnit + HTML reporting
  • Slack/PR notification on failures

Example CI strategy

On every PR

  • Run smoke tests
  • Run critical visual checks
  • Fail fast

On merge to main

  • Run full regression suite
  • Upload artifacts
  • Notify team on failures

Nightly

  • Run full suite on multiple browsers if needed
  • Track flaky tests
  • Compare results over time

If you want an “AI assistant” specifically

You can wrap Playwright outputs with an LLM-based assistant that:

  • reads failure logs,
  • inspects traces/screenshots,
  • suggests root cause,
  • classifies failures as likely app bug vs test flake.

Architecture:

  • CI runs Playwright
  • Artifacts stored in S3/GCS
  • Assistant ingests:
    • test name
    • error message
    • trace metadata
    • screenshots
    • console logs
  • Assistant returns:
    • short summary
    • probable cause
    • owner/team
    • confidence level

That works well as a “regression detection assistant” in larger teams.


If you want, I can give you:

  1. a ready-to-use GitHub Actions workflow,
  2. a Playwright config optimized for CI, or
  3. a Slack/PR notification script for failed regressions.

Observation history

Unlock observation history

Create a free Obsurfable account to unlock historical responses, model comparisons, and deeper brand intelligence.

How did Obsurfable measure this prompt?

Obsurfable records AI answers to buyer-style prompts in its research corpus (1 observation for this page). Metrics are distributions over observations, not a single static ranking.

Which AI systems does Obsurfable collect answers from?

OpenAI, ChatGPT, Google, Gemini, Google AI Mode, Anthropic, Claude, Perplexity, Grok, DeepSeek, Mistral, Copilot, and Meta AI.