Prompt
How do I set up a playwright assistant for regression detection in our CI pipeline?
Latest observation
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
maskfor 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 flakinesstrace: helps debug failuresscreenshot/video: capture evidencejunit: 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:
- Playwright runs in CI
- Generate JSON/JUnit/HTML report
- Parse failures
- Send concise summary to Slack/GitHub PR comment
- Attach trace links/screenshots
For example, use:
junitreport for CI statusplaywright-reportartifact 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.tswith 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:
- a ready-to-use GitHub Actions workflow,
- a Playwright config optimized for CI, or
- 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.