webapp-testing

webapp-testing is a skill for Claude Code, Codex from floomhq/moto. It costs 35 tokens per session (830 once invoked), scanned A, original, MIT.

A Playwright-based toolkit for testing local web applications in a real browser. Playwright is software that automates browser actions, screenshots, and checks of the rendered page.

In plain words
What is it for?
Use it to start a local app, inspect its page, find reliable selectors, automate interactions, test behavior, capture screenshots, and review browser logs.
Why use it?
It helps verify what users actually see and do, especially when a page changes after loading. It also supports investigating interface problems through screenshots and browser logs.

Skill for Claude CodeCodex

Install

Getting it into your agent

One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.

agentmods
npx agentmods add skills/floomhq/moto/webapp-testing
Any agent
npx skills add floomhq/moto --skill webapp-testing
Clone the repo
git clone --depth 1 https://github.com/floomhq/moto

Made for: Claude Code, Codex.

Wrote this? Show the measurements

A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.

agentmods badge for webapp-testing

README.md
[![agentmods](https://agentmods.dev/badge/skills/floomhq/moto/webapp-testing.svg)](https://agentmods.dev/skills/floomhq/moto/webapp-testing)
Your own site
<a href="https://agentmods.dev/skills/floomhq/moto/webapp-testing"><img src="https://agentmods.dev/badge/skills/floomhq/moto/webapp-testing.svg" alt="Measured on agentmods" height="20"></a>
Per session 35 Skills are progressive disclosure: only the name and description are preloaded; the body loads when the skill is used.
When invoked 830 The whole file, excluding the scripts and references it only reads on demand.
Security scan A 1 finding. Scan, not verified.
Origin original No closer match found in the catalogue.
Token cost

What it costs to keep this loaded

Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.

ModelPer sessionOnce invoked
Fable 5 $0.00035 $0.00830
Opus 5 $0.00017 $0.00415
Sonnet 5 $0.00007 $0.00166
Haiku 4.5 $0.00003 $0.00083

Measured 4d ago against content hash 140d1bbf0780, method: parsed. Prices are Anthropic first-party input rates as of 2026-08-30, from the pricing page.

Security

Grade A, and why

webapp-testing scanned grade A with 1 finding against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 4d ago.

A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.

Runs shell commandslowCapability

Expected in a hook, worth knowing in a rule or an instructions file.

server = subprocess.Popen(["npm", "run", "dev"])
claude/skills/webapp-testing/SKILL.md · 132 lines

How it starts

The opening of the file, as written. The whole thing — 132 lines — stays where its author put it; the contents beside it link to each section on GitHub.

Web Application Testing

To test local web applications, write native Python Playwright scripts.

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 → Start the server first, then write 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

Starting a Server for Testing

# Start server in background, wait for it to be ready, then run automation
npm run dev &
sleep 3
python automation.py

Or manage the server lifecycle in the script itself:

import subprocess
import time

server = subprocess.Popen(["npm", "run", "dev"])
time.sleep(3)  # Wait for server to start

try:
    # Run automation
    pass
finally:
    server.terminate()

Basic Playwright Script

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    browser = p.chromium.launch(headless=True)
    page = browser.new_page()
    page.goto('http://localhost:5173')
    page.wait_for_load_state('networkidle')  # CRITICAL: Wait for JS to execute

    # Take screenshot for inspection
    page.screenshot(path='/tmp/inspect.png', full_page=True)

    # Inspect DOM
    content = page.content()

    # Execute actions
    page.click('button:has-text("Submit")')
    page.fill('input[name="email"]', '[email protected]')

    # Assert results
    assert page.locator('.success-message').is_visible()

    browser.close()

Reconnaissance-Then-Action Pattern

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

Read the full file on GitHub · 132 lines

Changes

What this file has done since we first saw it

Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.

  1. 4d ago First seen · 132 lines · 35 tokens per session scan A 140d1bbf0780

Subscribe to this mod's changes

webapp-testing is a skill published in the GitHub repository floomhq/moto (32 stars, last pushed 2mo ago), licensed MIT. It adds 35 tokens to every session and 830 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 1 finding (runs shell commands). No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-30.

Related

Other skills, from other repositories

issue-triage

Issue triage: audit open issues, categorize, detect duplicates, cross-ref PRs, risk assessment, post comments. Args: "all" for deep analysis of all, issue numbers to focus (e.g. "42 57"), "en"/"fr" for language, no arg = audit only in French.

rtk-ai/rtk · 70 tokens

build-teaql-app

Build or change a TeaQL application in Java, Rust, Go, Swift, Python, C#/.NET, or TypeScript, including Kotlin/JVM applications that consume Java-generated libraries. Mandatory order: first draft and save a complete KSML model, then verify the client and evaluate that saved model, repair it through repeated evaluation…

teaql/teaql-agent-kit · 112 tokens

moai-kanban-foreman

One unattended kanban foreman iteration: watch the backlog queue, dispatch the next operator-picked card to an isolated worker, collect completion evidence on read (not on claims), and report. This is the body the project's loop.md driver invokes each iteration of a bare /loop; it can also be invoked directly to test…

modu-ai/moai-adk · 76 tokens

orchestrator-lanes

Claude Code dev-orchestrator only. File-based multi-lane PM playbook (score, DAG, run-controller, L0/L1/L2, ship). Use when this session IS that agent, or user says info / справка / lane-stack:orchestrator-lanes info. SKIP: Grok, Codex, Kimi, Qwen, AGY, Cursor writer CLIs and any default coding agent — do not load, do…

VKirill/claude-lane-stack · 104 tokens

source-command-ccguide-daily

Daily update check — official Anthropic docs diff + guide/CC releases digest.

FlorianBruniaux/claude-code-ultimate-guide · 23 tokens

docs-maintain

Keep living docs/ honest after code changes. Use when: info, справка, lane-stack:docs-maintain info, nightly docs, docs-maintain, обновить документацию, актуализировать ARCHITECTURE.

VKirill/claude-lane-stack · 49 tokens