Skip to main content
skill Claude Code Claude.ai official · Anthropic

webapp-testing — Claude Code skill: testing and setup

This skill tests local web apps with Playwright, helping agents debug UI behavior, capture screenshots, and inspect browser logs.

Install into Claude Code · Plugin marketplace All methods and platforms ↓
/plugin marketplace add anthropics/skills
/plugin install example-skills@anthropic-agent-skills
Open on GitHub

What webapp-testing does

webapp-testing uses native Python Playwright scripts to interact with local web applications. An agent can open a page, wait for JavaScript to finish, inspect the rendered DOM, find selectors, and perform actions. The workflow covers UI checks, screenshots, and browser log inspection.

The skill includes scripts/with_server.py, which manages one or more application servers while an automation script runs. Start the helper with --help before using it. For dynamic apps, the workflow waits for networkidle, inspects the DOM or a screenshot, then acts on selectors found in the rendered page. Python and Playwright are required.

Install it when an agent needs to check a local frontend through a browser. It is more than you need for a static page that requires no browser interaction.

What it helps with

  • test a local web application
  • inspect selectors in a rendered UI
  • capture a screenshot after page load
  • trace browser logs during a UI failure
  • start frontend and backend servers for a test

Example prompts for the agent

  • Test the local app with Playwright, wait for `networkidle`, and find why the login flow fails.
  • Run `python scripts/with_server.py --server "npm run dev" --port 5173 -- python your_automation.py`, then capture a page screenshot.
  • Inspect the rendered DOM, find the right button selector, and verify the click with a Python script.

How to install webapp-testing

1Plugin marketplace

/plugin marketplace add anthropics/skills
/plugin install example-skills@anthropic-agent-skills

This installs the whole example-skills plugin with all its skills

2Skills CLI (Vercel)

npx skills add anthropics/skills --skill webapp-testing -a claude-code

3Manually: put the files in place

~/.claude/skills/webapp-testing/SKILL.md

Copy the whole skill folder; for one project use .claude/skills/webapp-testing/

From the same set23

The whole set →
frontend-design official anthropics This skill guides intentional visual design for new interfaces and redesigns. Use it when a generic generated UI is not enough. Claude Code Claude.ai 1,025,790installs skill-creator official anthropics Creates and refines skills, then tests them with prompts, evaluations, and performance checks. Claude Code Claude.ai 414,180installs pptx official anthropics This skill helps create, read, and edit .pptx files and .potx templates. Use it when building a deck or extracting slide text. Claude Code Claude.ai 241,433installs pdf official anthropics This skill lets an agent read, create, and edit PDF files, including forms and scanned documents. Use it when PDF work is part of the task. Claude Code Claude.ai 216,041installs docx official anthropics This skill creates, reads, and edits Word documents and templates. Use it for reports, letters, and files that need headings, tables, or page numbers. Claude Code Claude.ai 206,304installs xlsx official anthropics Creates, reads, edits, and converts spreadsheet files. Use it when the requested deliverable is an Excel workbook or another tabular file. Claude Code Claude.ai 187,223installs mcp-builder official anthropics This skill walks through building an MCP server in TypeScript or Python, from reading the protocol spec to writing tests and evaluation questions. Claude Code Claude.ai 130,949installs canvas-design official anthropics Builds posters and visual art in .png and .pdf by first writing a design philosophy, then expressing it on the canvas. Claude Code Claude.ai 121,543installs

Similar

prototype Matt Pocock Creates throwaway prototypes for checking state logic or exploring UI before committing the decision to the main codebase. Claude Code 986,201installs hyperframes heygen-com Instructs coding agents on creating, validating, and rendering HTML-based videos using the HyperFrames framework and CLI. Claude Code CX Codex Cursor +1 1,200,000installs hyperframes-cli heygen-com Controls HyperFrames video workflows from the CLI: audits layouts and contrast, edits timeline clips, captures snapshots, and renders locally or in cloud runtimes. Claude Code CX Codex Cursor +1 1,200,000installs hyperframes-registry heygen-com Finds and installs about 450 ready-made HyperFrames blocks and components as editable source code. Useful when adding video effects and titles without building markup from scratch. Claude Code CX Codex Cursor +1 1,000,000installs ui-ux-pro-max nextlevelbuilder Equips coding agents with a local catalog of 119 UX guidelines, 74 font pairings, and 192 product palettes. Useful when designing components or tuning accessibility. Claude Code CX Codex Cursor +1 413,800installs impeccable pbakaus A skill for your coding agent that designs and reworks interfaces: landing pages, dashboards, forms, iOS and Android screens. Useful when the UI needs real design decisions, not guesswork. Claude Code CX Codex Cursor +1 359,200installs design-taste-frontend Leonxlnx This skill directs the design of public pages and work screens, then checks the result in a browser through screenshots. Use it when an interface feels generic or unfinished. Claude Code CX Codex Cursor +1 673,100installs

Questions about webapp-testing

How do I install webapp-testing in Claude Code?

Run npx skills add anthropics/skills --skill webapp-testing -a claude-code. Claude Code also supports the skill through its marketplace commands.

What does webapp-testing do?

It helps agents test local web applications with Playwright. The skill checks UI behavior, captures screenshots, inspects the DOM, and views browser logs.

Why wait for `networkidle` before finding selectors?

Dynamic applications can change the DOM after the page opens. Waiting for networkidle lets the agent inspect the rendered state before acting.

Source text

SKILL.md · Apache-2.0
---
name: webapp-testing
description: 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.
license: Complete terms in LICENSE.txt
---

# 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 selectors
```

## Example: Using with_server.py

To start a server, run `--help` first, then use the helper:

**Single server:**
```bash
python scripts/with_server.py --server "npm run dev" --port 5173 -- python your_automation.py
```

**Multiple servers (e.g., backend + frontend):**
```bash
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):
```python
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

1. **Inspect rendered DOM**:
   ```python
   page.screenshot(path='/tmp/inspect.png', full_page=True)
   content = page.content()
   page.locator('button').all()
   ```

2. **Identify selectors** from inspection results

3. **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 `--help` to see usage, then invoke directly. 
- Use `sync_playwright()` for synchronous scripts
- Always close the browser when done
- Use descriptive selectors: `text=`, `role=`, CSS selectors, or IDs
- Add appropriate waits: `page.wait_for_selector()` or `page.wait_for_timeout()`

## Reference Files

- **examples/** - Examples showing common patterns:
  - `element_discovery.py` - Discovering buttons, links, and inputs on a page
  - `static_html_automation.py` - Using file:// URLs for local HTML
  - `console_logging.py` - Capturing console logs during automation

© anthropics · Apache-2.0 · anthropics/skills

See also

Project sponsors

Companies that keep this analytics open
Gold sponsor

Impressions, clicks and code copies — open statistics. We keep the numbers public for the same reason NeBlask itself is public. Become a sponsor