next-js/skills/skills/webapp-testing/SKILL.md
Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.
npx skillsauth add spuneiartur/claude-agent-specs webapp-testingInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
To test local web applications, write native Python Playwright scripts.
Helper Scripts Available:
scripts/with_server.py - Manages server lifecycle (supports multiple servers)Always run scripts with --help first to see usage. DO NOT read the source until you try running the script first and find that a customized solution is abslutely necessary. These scripts can be very large and thus pollute your context window. They exist to be called directly as black-box scripts rather than ingested into your context window.
User task → Is it static HTML?
├─ Yes → Read HTML file directly to identify selectors
│ ├─ Success → Write Playwright script using selectors
│ └─ Fails/Incomplete → Treat as dynamic (below)
│
└─ No (dynamic webapp) → Is the server already running?
├─ No → Run: python scripts/with_server.py --help
│ Then use the helper + write simplified Playwright script
│
└─ Yes → Reconnaissance-then-action:
1. Navigate and wait for networkidle
2. Take screenshot or inspect DOM
3. Identify selectors from rendered state
4. Execute actions with discovered selectors
To start a server, run --help first, then use the helper:
Single server:
python scripts/with_server.py --server "npm run dev" --port 5173 -- python your_automation.py
Multiple servers (e.g., backend + frontend):
python scripts/with_server.py \
--server "cd backend && python server.py" --port 3000 \
--server "cd frontend && npm run dev" --port 5173 \
-- python your_automation.py
To create an automation script, include only Playwright logic (servers are managed automatically):
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch(headless=True) # Always launch chromium in headless mode
page = browser.new_page()
page.goto('http://localhost:5173') # Server already running and ready
page.wait_for_load_state('networkidle') # CRITICAL: Wait for JS to execute
# ... your automation logic
browser.close()
Inspect rendered DOM:
page.screenshot(path='/tmp/inspect.png', full_page=True)
content = page.content()
page.locator('button').all()
Identify selectors from inspection results
Execute actions using discovered selectors
❌ Don't inspect the DOM before waiting for networkidle on dynamic apps
✅ Do wait for page.wait_for_load_state('networkidle') before inspection
scripts/ can help. These scripts handle common, complex workflows reliably without cluttering the context window. Use --help to see usage, then invoke directly.sync_playwright() for synchronous scriptstext=, role=, CSS selectors, or IDspage.wait_for_selector() or page.wait_for_timeout()element_discovery.py - Discovering buttons, links, and inputs on a pagestatic_html_automation.py - Using file:// URLs for local HTMLconsole_logging.py - Capturing console logs during automationWhen testing a Next.js Pages Router application, use these additional patterns.
python scripts/with_server.py --server "npm run dev" --port 3000 -- python your_test.py
Admin pages use getServerSideProps with checkAuth — they redirect to /login without valid auth:
# Test that admin pages redirect to login when unauthenticated
page.goto('http://localhost:3000/admin/articles')
page.wait_for_load_state('networkidle')
assert '/login' in page.url, f"Expected redirect to /login, got {page.url}"
Pages like /produse/[slug] and /admin/articles/edit/[id]:
# Test a dynamic product page
page.goto('http://localhost:3000/produse/some-product-slug')
page.wait_for_load_state('networkidle')
# Verify product content loaded
assert page.locator('h1').count() > 0
# Test 404 for non-existent slug
response = page.goto('http://localhost:3000/produse/nonexistent-slug-xyz')
assert response.status == 404
The project uses middleware for www→non-www redirects and maintenance mode:
# Test www redirect (if applicable)
# Test that maintenance mode works when MAINTENANCE=true
# Test that static files bypass middleware
page.goto('http://localhost:3000/images/logo.png')
assert page.locator('img').count() > 0 or response.status == 200
Verify NextSeo renders correct meta tags:
page.goto('http://localhost:3000/about')
page.wait_for_load_state('networkidle')
# Check title
title = page.title()
assert 'About' in title
# Check meta description
meta_desc = page.locator('meta[name="description"]').get_attribute('content')
assert meta_desc and len(meta_desc) > 0
# Check OpenGraph
og_title = page.locator('meta[property="og:title"]').get_attribute('content')
assert og_title and len(og_title) > 0
For React Hook Form-based forms:
# Fill and submit a form
page.goto('http://localhost:3000/contact')
page.wait_for_load_state('networkidle')
page.fill('input[name="name"]', 'Test User')
page.fill('input[name="email"]', '[email protected]')
page.fill('textarea[name="message"]', 'Test message content')
page.click('button[type="submit"]')
# Wait for success state
page.wait_for_selector('.toast-success', timeout=5000)
tools
Replace with description of the skill and when Claude should use it.
tools
Comprehensive website performance audit and optimization skill. Identifies and automatically fixes performance issues including image optimization, video compression, lazy loading, Core Web Vitals, bundle size, and rendering strategy. Uses Lighthouse (via CLI or MCP when available), ffmpeg for media processing, and the project's existing Image component with blur-up lazy loading. Use this skill whenever the user mentions: website speed, page load time, performance audit, Core Web Vitals, Lighthouse, optimize images, compress videos, lazy loading, LCP, CLS, FID, INP, slow website, speed up, performance optimization, image compression, video optimization, blur placeholder, WebP conversion, media audit, bundle size, or wants to improve their website's loading performance. Also trigger when the user says "my site is slow", "optimize for speed", "reduce load time", "improve performance", or asks about image/video optimization in any context.
tools
Suite of tools for creating elaborate, multi-component claude.ai HTML artifacts using modern frontend web technologies (React, Tailwind CSS, shadcn/ui). Use for complex artifacts requiring state management, routing, or shadcn/ui components - not for simple single-file HTML/JSX artifacts.
tools
Toolkit for styling artifacts with a theme. These artifacts can be slides, docs, reportings, HTML landing pages, etc. There are 10 pre-set themes with colors/fonts that you can apply to any artifact that has been creating, or can generate a new theme on-the-fly.