Playwright cli agent loop
Skill PramodDutta/qaskills/seed-skills/playwright-cli-agent-loop
QA Skills Directory QA Skills is a curated directory of testing-specific skills for AI coding agents (Claude Code, Cursor, Copilot, etc.).
npx -y skills add PramodDutta/qaskills --skill playwright-cli-agent-loopAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
What its author says it does
Copied from the file, not written here
Teach AI coding agents to use the Playwright CLI and debug loop efficiently with last-failed runs, locator probing, trace evidence, and safe healing.
The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.
SKILL.md
6.1 KB, as published. Nobody here has run it
Playwright CLI Agent Loop Skill
You are an AI coding agent that uses the Playwright CLI as a tight evidence loop: run the smallest useful test, inspect traces, probe locators, fix code, and rerun only what proves the change.
Core Principles
- Minimize each run: Use file names, grep filters, projects, and last-failed mode before running the full suite.
- Trust evidence over guesses: Use traces, screenshots, console logs, and locator probes before editing tests.
- Prefer user-facing locators: Repair selectors toward role, label, text, and test id conventions.
- Do not hide product bugs: A healing change must not make a failing assertion weaker.
- Keep the transcript small: Summarize failures and paste only the useful lines.
- Use debug modes deliberately: CLI debug is for observation, not endless manual clicking.
- Rerun the exact failure: Prove the fix with the same browser project and same test first.
- Escalate flake separately: Timing uncertainty needs a flake note, not a random timeout.
Setup
Install Playwright and create predictable scripts.
npm install --save-dev @playwright/test
npx playwright install --with-deps
npm pkg set scripts.test:e2e='playwright test'
npm pkg set scripts.test:e2e:debug='PWDEBUG=1 playwright test --debug'
npm pkg set scripts.test:e2e:last='playwright test --last-failed'
npm pkg set scripts.test:e2e:report='playwright show-report'
Use a config that retains failure evidence.
// playwright.config.ts
import { defineConfig, devices } from '@playwright/test';
export default defineConfig({
testDir: './tests/e2e',
retries: process.env.CI ? 2 : 0,
reporter: [['html'], ['list']],
use: {
baseURL: process.env.BASE_URL || 'http://127.0.0.1:3000',
trace: 'retain-on-failure',
screenshot: 'only-on-failure',
video: 'retain-on-failure',
},
projects: [
{ name: 'chromium', use: { ...devices['Desktop Chrome'] } },
{ name: 'firefox', use: { ...devices['Desktop Firefox'] } },
],
});
Agent Workflow
Follow this loop for every Playwright failure.
- Identify the smallest test target.
- Run the exact failing test once.
- Read the error, locator, and call log.
- Open trace or screenshot if available.
- Probe the page state with CLI debug or codegen.
- Edit only the product code or test code justified by evidence.
- Rerun the exact failure.
- Run
--last-failed. - Run the affected file.
- Summarize the root cause and verification.
Token-Efficient Commands
Use commands that keep output readable.
npx playwright test tests/e2e/login.spec.ts --project=chromium --reporter=line
npx playwright test -g 'valid user can sign in' --project=chromium --reporter=line
npx playwright test --last-failed --reporter=line
npx playwright show-trace test-results/login-valid-user-chromium/trace.zip
Locator Probing
Use Playwright locators to understand what the browser can actually see.
// tests/e2e/probe.spec.ts
import { test } from '@playwright/test';
test('probe accessible names', async ({ page }) => {
await page.goto('/login');
const buttons = await page.getByRole('button').evaluateAll((nodes) =>
nodes.map((node) => ({
text: node.textContent?.trim(),
aria: node.getAttribute('aria-label'),
})),
);
console.log(JSON.stringify(buttons, null, 2));
});
Debug CLI Loop
Use debug mode when static logs are not enough.
PWDEBUG=console npx playwright test tests/e2e/checkout.spec.ts -g 'submits order'
npx playwright test tests/e2e/checkout.spec.ts --debug --project=chromium
npx playwright codegen http://127.0.0.1:3000/checkout
When the inspector is open, check these items.
- Is the element visible?
- Is the accessible role correct?
- Is the accessible name correct?
- Is an overlay blocking clicks?
- Did navigation finish?
- Did test data create the expected state?
Healing Rules
When repairing a locator, improve the contract.
// Before
await page.locator('.btn-primary').click();
// Better
await page.getByRole('button', { name: 'Create project' }).click();
// Also acceptable when the design system owns the accessible name
await page.getByTestId('create-project-button').click();
Reference Table
| Problem | First Command | Follow-Up |
|---|---|---|
| One failing test | playwright test path -g name | Open trace |
| Multiple failures | playwright test --last-failed | Group by root cause |
| Locator timeout | --debug | Probe roles and names |
| Mobile-only failure | --project mobile project | Check viewport assumptions |
| Suspected flake | Repeat exact test | Inspect network and timing |
| Unknown page state | Add temporary probe | Remove probe before final |
Common Mistakes
- Running the whole suite after every edit.
- Adding
waitForTimeoutinstead of identifying the wait condition. - Replacing strong role locators with fragile CSS.
- Weakening assertions so a product bug passes.
- Ignoring trace artifacts.
- Keeping temporary probe tests.
- Debugging a different browser project than the failure.
- Forgetting
--last-failedafter a fix. - Treating retry pass as proof.
- Pasting long logs without analysis.
Checklist
- The smallest failing target was run first.
- Trace, screenshot, or call log evidence was inspected.
- Locator repairs prefer role, label, text, or test id.
- No arbitrary sleep was added.
- The original failure was rerun.
-
--last-failedpassed after the fix. - Affected file or project passed.
- Temporary probe code was removed.
- The summary states product bug, test bug, or environment issue.
- Remaining flakes are tracked separately.