playwright-skill — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited playwright-skill (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
!`ls e2e/*.spec.ts 2>/dev/null || echo 'No e2e test files found'`This project uses @playwright/test with TypeScript. The conventions below take precedence over the generic skill patterns.
e2e/*.spec.tspnpm test:e2e (headless) or pnpm test:e2e:ui (interactive)playwright.config.ts - baseURL is http://localhost:5173, webServer auto-starts via pnpm devpage.goto("/") not page.goto("http://localhost:5173/").spec.ts files, named exports, no raw .js scripts in the projectNew test template:
// e2e/my-feature.spec.ts
import { expect, test } from "@playwright/test";
test("description of what it checks", async ({ page }) => {
await page.goto("/route");
await expect(page.locator("h1")).toBeVisible();
});Existing example: e2e/home.spec.ts
For rapid one-off checks where you don't need a persistent test, the generic /tmp script approach below still works. Use pnpm test:e2e:ui first - it's usually faster.
IMPORTANT - Path Resolution: This skill can be installed in different locations (plugin system, manual installation, global, or project-specific). Before executing any commands, determine the skill directory based on where you loaded this SKILL.md file, and use that path in all commands below. Replace $SKILL_DIR with the actual discovered path.
Common installation paths:
~/.claude/plugins/marketplaces/playwright-skill/skills/playwright-skill~/.claude/skills/playwright-skill<project>/.claude/skills/playwright-skillGeneral-purpose browser automation skill. I'll write custom Playwright code for any automation task you request and execute it via the universal executor.
CRITICAL WORKFLOW - Follow these steps in order:
cd $SKILL_DIR && node -e "require('./lib/helpers').detectDevServers().then(servers => console.log(JSON.stringify(servers)))"/tmp/playwright-test-*.jsheadless: false unless user specifically requests headless mode/tmp/playwright-test-*.js (won't clutter your project)cd $SKILL_DIR && node run.js /tmp/playwright-test-*.jscd $SKILL_DIR
npm run setupThis installs Playwright and Chromium browser. Only needed once.
See examples/execution-patterns.md for the 3-step execution workflow (detect dev servers, write test script to /tmp, execute from skill directory).
See examples/common-patterns.md for 6 ready-to-use patterns: responsive testing, login flow, form submission, broken link checking, screenshot with error handling, and responsive design testing.
For quick one-off tasks, you can execute code inline without creating files:
# Take a quick screenshot
cd $SKILL_DIR && node run.js "
const browser = await chromium.launch({ headless: false });
const page = await browser.newPage();
await page.goto('http://localhost:3001');
await page.screenshot({ path: '/tmp/quick-screenshot.png', fullPage: true });
console.log('Screenshot saved');
await browser.close();
"When to use inline vs files:
See reference/helpers-headers-guide.md for helper function reference (detectDevServers, safeClick, safeType, takeScreenshot, handleCookieBanner, extractTableData) and custom HTTP header configuration.
For comprehensive Playwright API documentation, see API_REFERENCE.md:
detectDevServers() before writing test code for localhost testingPW_HEADER_NAME/PW_HEADER_VALUE env vars to identify automated traffic to your backend/tmp/playwright-test-*.js, never to skill directory or user's projectTARGET_URL constant at the top of every scriptheadless: false unless user explicitly asks for headless modeheadless: true when user specifically requests "headless" or "background" executionslowMo: 100 to make actions visible and easier to followwaitForURL, waitForSelector, waitForLoadState instead of fixed timeoutsconsole.log() to track progress and show what's happeningPlaywright not installed:
cd $SKILL_DIR && npm run setupModule not found: Ensure running from skill directory via run.js wrapper
Browser doesn't open: Check headless: false and ensure display available
Element not found: Add wait: await page.waitForSelector('.element', { timeout: 10000 })
User: "Test if the marketing page looks good"
Claude: I'll test the marketing page across multiple viewports. Let me first detect running servers...
[Runs: detectDevServers()]
[Output: Found server on port 3001]
I found your dev server running on http://localhost:3001
[Writes custom automation script to /tmp/playwright-test-marketing.js with URL parameterized]
[Runs: cd $SKILL_DIR && node run.js /tmp/playwright-test-marketing.js]
[Shows results with screenshots from /tmp/]User: "Check if login redirects correctly"
Claude: I'll test the login flow. First, let me check for running servers...
[Runs: detectDevServers()]
[Output: Found servers on ports 3000 and 3001]
I found 2 dev servers. Which one should I test?
- http://localhost:3000
- http://localhost:3001
User: "Use 3001"
[Writes login automation to /tmp/playwright-test-login.js]
[Runs: cd $SKILL_DIR && node run.js /tmp/playwright-test-login.js]
[Reports: ✅ Login successful, redirected to /dashboard]/tmp for automatic cleanup (no clutter)run.js~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.