一键导入
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 职业分类
| 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 |
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.