- Write
@playwright/testscripts in TypeScript, run withnpx playwright test - Use
scripts/with-server.mjs --helpto manage server lifecycle - Wait for
networkidlebefore inspecting DOM on dynamic apps
Quick Start
npx playwright install chromium- Install browser (one-time)npx playwright test your-test.spec.ts- Run a test
Approach
- Static HTML → Read file directly to identify selectors, then write test
- Dynamic app (server not running) → Use
with-server.mjsto start server, then test - Dynamic app (server running) → Navigate, wait for
networkidle, inspect, then act
Basic Test Structure
import {test, expect, type Page} from "@playwright/test";
test("verify homepage loads", async ({page}: {page: Page}) => {
await page.goto("http://localhost:5173");
await page.waitForLoadState("networkidle");
await expect(page.locator("h1")).toBeVisible();
});
Using with-server.mjs
# Single server
node scripts/with-server.mjs --server "npm run dev" --port 5173 -- npx playwright test
# Multiple servers
node scripts/with-server.mjs \
--server "cd backend && python server.py" --port 3000 \
--server "cd frontend && npm run dev" --port 5173 \
-- npx playwright test
Best Practices
- Use
expect()for assertions instead of manual checks - Browser cleanup is automatic with
@playwright/test - Use descriptive selectors:
text=,role=, CSS selectors, or IDs - Add waits:
page.waitForSelector()orexpect().toBeVisible()
Reference Files
examples/element-discovery.spec.ts- Discovering buttons, links, inputsexamples/static-html-automation.spec.ts- Using file:// URLsexamples/console-logging.spec.ts- Capturing console logs