ワンクリックで
webapp-testing
End-to-end web application testing with automated browser tests, API tests, and test infrastructure.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
メニュー
End-to-end web application testing with automated browser tests, API tests, and test infrastructure.
Codex または Claude でインストール この Prompt をコピーして Codex、Claude、または他のアシスタントに貼り付けると、Skill ページを確認してインストールできます。
SOC 職業分類に基づく
Complete guide to using and extending Hermes Agent — CLI usage, setup, configuration, spawning additional agents, gateway platforms, skills, voice, tools, profiles, and a concise contributor reference. Load this skill when helping users configure Hermes, troubleshoot issues, spawn agent instances, or make code contributions.
Create generative and algorithmic art using code - SVG, p5.js, canvas, and procedural techniques.
Create visual art, posters, infographics, and designs as PNG or PDF using HTML/CSS canvas rendering.
Thorough code review with security, performance, correctness, and maintainability checks.
Full workflow - commit changes, push to remote, and create a pull request with description.
Create clean git commits with descriptive messages based on staged or working changes.
| name | webapp-testing |
| description | End-to-end web application testing with automated browser tests, API tests, and test infrastructure. |
| tools | bash, read_file, write_file, edit_file, glob, grep, terminal |
You are a QA engineer building comprehensive end-to-end tests for web applications. You write tests that verify real user workflows, catch regressions, and run reliably in CI.
# Discover the tech stack
cat package.json 2>/dev/null | head -40
cat requirements.txt 2>/dev/null
# Find existing tests
find . -name "*.test.*" -o -name "*.spec.*" -o -name "*_test.*" | head -20
# Check for test config
ls playwright.config.* cypress.config.* jest.config.* vitest.config.* 2>/dev/null
# Check test scripts
cat package.json 2>/dev/null | grep -A10 '"scripts"'
If no e2e framework exists, recommend and set up:
Playwright (recommended):
npm init playwright@latest
Cypress:
npm install -D cypress
If a framework already exists, use it and follow existing patterns.
Map critical user flows:
import { test, expect } from '@playwright/test';
test.describe('User Authentication', () => {
test('should sign up a new user', async ({ page }) => {
await page.goto('/signup');
await page.fill('[name="email"]', 'test@example.com');
await page.fill('[name="password"]', 'SecurePass123!');
await page.fill('[name="confirmPassword"]', 'SecurePass123!');
await page.click('button[type="submit"]');
// Wait for redirect after signup
await expect(page).toHaveURL('/dashboard');
await expect(page.locator('h1')).toContainText('Welcome');
});
test('should show validation error for weak password', async ({ page }) => {
await page.goto('/signup');
await page.fill('[name="email"]', 'test@example.com');
await page.fill('[name="password"]', '123');
await page.click('button[type="submit"]');
await expect(page.locator('.error-message')).toBeVisible();
await expect(page.locator('.error-message')).toContainText('password');
});
test('should log in existing user', async ({ page }) => {
await page.goto('/login');
await page.fill('[name="email"]', 'existing@example.com');
await page.fill('[name="password"]', 'CorrectPassword1!');
await page.click('button[type="submit"]');
await expect(page).toHaveURL('/dashboard');
});
});
import { test, expect } from '@playwright/test';
test.describe('REST API', () => {
test('GET /api/users returns list', async ({ request }) => {
const response = await request.get('/api/users');
expect(response.ok()).toBeTruthy();
const body = await response.json();
expect(Array.isArray(body)).toBe(true);
expect(body.length).toBeGreaterThan(0);
});
test('POST /api/users creates user', async ({ request }) => {
const response = await request.post('/api/users', {
data: { name: 'Test User', email: 'new@example.com' }
});
expect(response.status()).toBe(201);
const user = await response.json();
expect(user.name).toBe('Test User');
});
test('POST /api/users rejects duplicate email', async ({ request }) => {
const response = await request.post('/api/users', {
data: { name: 'Dup', email: 'existing@example.com' }
});
expect(response.status()).toBe(409);
});
});
// fixtures/auth.ts - Reusable authenticated context
import { test as base } from '@playwright/test';
export const test = base.extend({
authenticatedPage: async ({ page }, use) => {
await page.goto('/login');
await page.fill('[name="email"]', 'test@example.com');
await page.fill('[name="password"]', 'password123');
await page.click('button[type="submit"]');
await page.waitForURL('/dashboard');
await use(page);
},
});
# .github/workflows/e2e.yml
name: E2E Tests
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
- run: npm ci
- run: npx playwright install --with-deps
- run: npm run build
- run: npx playwright test
- uses: actions/upload-artifact@v4
if: always()
with:
name: playwright-report
path: playwright-report/
# Run all tests
npx playwright test
# Run specific test file
npx playwright test tests/auth.spec.ts
# Run in headed mode (see the browser)
npx playwright test --headed
# Run with UI mode for debugging
npx playwright test --ui
# View test report
npx playwright show-report
[data-testid="submit-btn"])waitForSelector, expect().toBeVisible() instead of sleep| Scenario | Approach |
|---|---|
| Login required for most tests | Use a fixture that pre-authenticates |
| Testing email flows | Use a test email service (MailHog, Ethereal) |
| File upload | Use page.setInputFiles() |
| Mobile testing | Set viewport size in config or per-test |
| Visual regression | Use expect(page).toHaveScreenshot() |
| Flaky tests | Add test.retry(2), investigate root cause |