microsoft /playwright

Playwright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.

★ 99,731⑂ 6,833👁 616⑃ 21,853● 18,489▤ 169◈ 0
TypeScriptApache-2.0Created 2019-11-15playwright.dev
99,731
stars
+82
6,833
forks
616
watchers
21,853
prs
18,489
issues
169
releases
0
discussions

README

🎭 Playwright

    

 Documentation | API reference

Playwright is a framework for web automation and testing. It drives Chromium, Firefox, and WebKit with a single API — in your tests, in your scripts, and as a tool for AI agents.

 Get Started

Choose the path that fits your workflow:

| | Best for | Install |
|---|---|---|
| Playwright Test | End-to-end testing | npm init playwright@latest |
| Playwright CLI | Coding agents (Claude Code, Copilot) | npm i -g @playwright/cli@latest |
| Playwright MCP | AI agents and LLM-driven automation | npx @playwright/mcp@latest |
| Playwright Library | Browser automation scripts | npm i playwright |
| VS Code Extension | Test authoring and debugging in VS Code | Install from Marketplace |

---

 Playwright Test

Playwright Test is a full-featured test runner built for end-to-end testing. It runs tests across Chromium, Firefox, and WebKit with full browser isolation, auto-waiting, and web-first assertions.

 Install

bash
npm init playwright@latest


Or add manually:

bash
npm i -D @playwright/test
npx playwright install


 Write a test

TypeScript
import { test, expect } from '@playwright/test';

test('has title', async ({ page }) = {
  await page.goto('https://playwright.dev/');
  await expect(page).toHaveTitle(/Playwright/);
});

test('get started link', async ({ page }) = {
  await page.goto('https://playwright.dev/');
  await page.getByRole('link', { name: 'Get started' }).click();
  await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
});


 Run tests

bash
npx playwright test


Tests run in parallel across all configured browsers, in headless mode by default. Each test gets a fresh browser context — full isolation with near-zero overhead.

 Key capabilities

Auto-wait and web-first assertions. No artificial timeouts. Playwright waits for elements to be actionable, and assertions automatically retry until conditions are met.

Locators. Find elements with resilient locators that mirror how users see the page:

TypeScript
page.getByRole('button', { name: 'Submit' })
page.getByLabel('Email')
page.getByPlaceholder('Search...')
page.getByTestId('login-form')


Test isolation. Each test runs in its own browser context — equivalent to a fresh browser profile. Save authentication state once and reuse it across tests:

TypeScript
// Save state after login
await page.context().storageState({ path: 'auth.json' });

// Reuse in other tests
test.use({ storageState: 'auth.json' });


Tracing. Capture execution traces, screenshots, and videos on failure. Inspect every action, DOM snapshot, network request, and console message in the Trace Viewer:

TypeScript
// playwright.config.ts
export default defineConfig({
  use: {
    trace: 'on-first-retry',
  },
});


bash
npx playwright show-trace trace.zip




Parallelism. Tests run in parallel by default across all configured browsers.

Full testing documentation

---

 Playwright CLI

Playwright CLI is a command-line interface for browser automa

Top issues

Latest release

v1.65.0 v1.65.0 2026-11-05
🥟 Run tests with Bun

The test runner now runs under Bun. Bun transpiles your TypeScript test files itself, so Playwright does not use Babel or its compilation cache. Pass the --bun flag, because without it bunx playwright test runs on Node.js:

bash
bunx --bun playwright test


Our CI runs the test runner tests under Bun 1.4.3 on Linux. Some features work differently under Bun:

- There is no watch mode. UI mode does not run tests again when files change, and --only-changed does not follow imports.
- Bun loads modules itself, so --tsconfig and the JSX options in tsconfig.json have 

Snapshot: 2026-11-10T09:35:25Z · Data license Apache-2.0 · JSON