Webapp Testing
AnthropicOfficialPublished by Anthropic
- Skill
- Tool integration
- Software development
- Apache-2.0
- Low risk
- Has scripts
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured approach to testing local web applications using Python and Playwright. It emphasizes a reconnaissance-then-action pattern for dynamic web apps and includes helper scripts to manage server lifecycles, ensuring that automation scripts remain clean and focused on testing logic rather than infrastructure management.
What it does
- Manages local server lifecycles for single or multi-service web applications
- Provides patterns for inspecting rendered DOM and identifying UI selectors
- Supports automated interaction with web elements using Playwright
- Enables capturing screenshots and browser logs for debugging purposes
- Offers a decision tree for choosing between static and dynamic testing approaches
When to use it
- When you need to automate functional testing for a local web application
- When you need to verify UI behavior or state in a browser environment
- When managing complex local development environments during automated test runs
- When you need to debug frontend issues by inspecting rendered DOM or console logs
Advantages
- Reduces context window pollution by treating complex server management as a black box
- Ensures reliable testing of dynamic apps through explicit network state waiting
- Provides a consistent workflow for both static and dynamic web content
- Includes ready-to-use examples for common tasks like element discovery and logging
Usage examples
- “Start my local frontend server on port 5173 and run my test script.”
- The agent uses the helper script to launch the server and execute the specified automation script, ensuring the server is ready before the test begins.
- “How do I inspect the buttons on my local web page?”
- The agent provides a snippet using page.locator('button').all() after ensuring the page has reached a networkidle state.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/anthropics/webapp-testing/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip webapp-testing.zip -d .agents/skills
Documentation by Anthropic
Web Application Testing
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.
Decision Tree: Choosing Your Approach
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 selectorsExample: Using with_server.py
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.pyMultiple 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.pyTo 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()Reconnaissance-Then-Action Pattern
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
Common Pitfall
❌ Don't inspect the DOM before waiting for networkidle on dynamic apps
✅ Do wait for page.wait_for_load_state('networkidle') before inspection
Best Practices
Use bundled scripts as black boxes - To accomplish a task, consider whether one of the scripts available in
scripts/can help. These scripts handle common, complex workflows reliably without cluttering the context window. Use--helpto see usage, then invoke directly.Use
sync_playwright()for synchronous scriptsAlways close the browser when done
Use descriptive selectors:
text=,role=, CSS selectors, or IDsAdd appropriate waits:
page.wait_for_selector()orpage.wait_for_timeout()
Reference Files
examples/ - Examples showing common patterns:
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 automation
Files
- ATTRIBUTION.mdAdded by AutoGineer877 B
- LICENSE.txt11.1 KiB
- SKILL.md3.8 KiB
- examples/console_logging.pyScript1.0 KiB
- examples/element_discovery.pyScript1.4 KiB
- examples/static_html_automation.pyScript953 B
- scripts/with_server.pyScript3.6 KiB
examples/static_html_automation.py
from playwright.sync_api import sync_playwright
import os
# Example: Automating interaction with static HTML files using file:// URLs
html_file_path = os.path.abspath('path/to/your/file.html')
file_url = f'file://{html_file_path}'
with sync_playwright() as p:
browser = p.chromium.launch(headless=True)
page = browser.new_page(viewport={'width': 1920, 'height': 1080})
# Navigate to local HTML file
page.goto(file_url)
# Take screenshot
page.screenshot(path='/mnt/user-data/outputs/static_page.png', full_page=True)
# Interact with elements
page.click('text=Click Me')
page.fill('#name', 'John Doe')
page.fill('#email', '[email protected]')
# Submit form
page.click('button[type="submit"]')
page.wait_for_timeout(500)
# Take final screenshot
page.screenshot(path='/mnt/user-data/outputs/after_submit.png', full_page=True)
browser.close()
print("Static HTML automation completed!")Requirements and compatibility
Written for: Claude Code, Claude apps
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs Python, Needs Node.js
Security
What our scanner noticed· Low risk
- Scripts that your agent may run
This skill includes scripts that your agent may run. Read them before you use it.
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Anthropic
- Publisher
- Anthropic (Official)
- Source
- anthropics/skills · skills/webapp-testing · commit 2c5958e
- Licence
- Apache License 2.0 (redistribution allowed)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Anthropic or Anthropic.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download webapp-testing.zip