webapp-testing
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.
When & Why to Use This Skill
The Webapp-Testing Claude skill is a comprehensive toolkit designed for automated web application testing using Playwright. It empowers developers and QA engineers to verify frontend functionality, debug complex UI behaviors, and ensure high-quality user experiences. By providing tools for automated navigation, form interaction, visual assertions, and network interception, this skill streamlines the end-to-end testing process and accelerates the software development lifecycle.
Use Cases
- Automated Regression Testing: Execute automated test suites to ensure that new code deployments do not break existing features or user flows.
- UI/UX Verification: Capture browser screenshots and use visual assertions to maintain design consistency and verify UI elements across different states.
- Frontend Debugging: Monitor browser console logs and analyze page errors in real-time to identify and resolve client-side issues quickly.
- API and Network Integration Testing: Intercept and mock network requests to test how the frontend handles various API responses and edge cases.
- User Flow Validation: Simulate complex user interactions, such as multi-step form submissions and navigation, to guarantee critical business paths work as intended.
| 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. |
| source | anthropics/skills |
| license | Apache-2.0 |
Web App Testing with Playwright
Setup
npm init playwright@latest
Basic Test Structure
import { test, expect } from '@playwright/test';
test('homepage has title', async ({ page }) => {
await page.goto('http://localhost:3000');
await expect(page).toHaveTitle(/My App/);
});
test('can navigate to about page', async ({ page }) => {
await page.goto('http://localhost:3000');
await page.click('text=About');
await expect(page).toHaveURL(/.*about/);
});
Common Actions
Navigation
await page.goto('http://localhost:3000');
await page.goBack();
await page.reload();
Clicking
await page.click('button');
await page.click('text=Submit');
await page.click('#submit-btn');
await page.click('[data-testid="submit"]');
Form Input
await page.fill('input[name="email"]', 'test@example.com');
await page.fill('#password', 'secret123');
await page.selectOption('select#country', 'USA');
await page.check('input[type="checkbox"]');
Waiting
await page.waitForSelector('.loaded');
await page.waitForURL('**/dashboard');
await page.waitForResponse('**/api/data');
await page.waitForTimeout(1000); // Avoid if possible
Assertions
await expect(page.locator('h1')).toHaveText('Welcome');
await expect(page.locator('.items')).toHaveCount(5);
await expect(page.locator('button')).toBeEnabled();
await expect(page.locator('.modal')).toBeVisible();
await expect(page.locator('input')).toHaveValue('test');
Screenshots
// Full page
await page.screenshot({ path: 'screenshot.png', fullPage: true });
// Element only
await page.locator('.chart').screenshot({ path: 'chart.png' });
Console Logs
page.on('console', msg => console.log(msg.text()));
page.on('pageerror', err => console.error(err.message));
Network Interception
await page.route('**/api/data', route => {
route.fulfill({
status: 200,
body: JSON.stringify({ items: [] })
});
});
Running Tests
# Run all tests
npx playwright test
# Run specific file
npx playwright test tests/login.spec.ts
# Run in headed mode
npx playwright test --headed
# Run with UI
npx playwright test --ui