You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Yury Semikhatsky b436fbbbf4
docs(java): route.fulfill with APIResponse (#11711)
12 hours ago
.devcontainer chore: fixed devcontainer Docker usage (#3898) 1 year ago
.github fix(prepare): don't change package files on prepare (#11579) 4 days ago
browser_patches browser(webkit): ctrl+click on windows (#11667) 1 day ago
docs docs(java): route.fulfill with APIResponse (#11711) 12 hours ago
examples examples: add a couple of @playwright/test examples (#10758) 2 months ago
installation-tests fix: default list reporter should dump stderr to stderr (#11351) 2 weeks ago
packages fix(webkit): handle will/didCheckPolicyForNavigation (#11631) 13 hours ago
tests fix(webkit): handle will/didCheckPolicyForNavigation (#11631) 13 hours ago
utils feat(test-runner): wait for a url before starting tests (#10138) 1 day ago
.editorconfig Initial commit 2 years ago
.eslintignore feat(create-playwright): add option to add examples (#8963) 3 months ago
.eslintrc.js chore: enable object-curly-spacing in ESLint (#9168) 4 months ago
.gitattributes chore: lang hint for GitHub 2 months ago
.gitignore docs(python): enable web-first assertions (#10390) 2 months ago Revert "chore: rework the crlf in md fix" 1 year ago devops: migrate from master to main branch (#10303) 2 months ago
LICENSE chore(license): use Apache 2.0 (#389) 2 years ago
NOTICE chore(license): add NOTICE (#309) 2 years ago docs: fix broken link (#11687) 15 hours ago Revert "chore: rework the crlf in md fix" 1 year ago
babel.config.json chore: don't include babel compiled files in webpack bundles (#9491) 4 months ago
package-lock.json docs: commit release notes for 1.18 (#11396) 2 weeks ago
package.json fix(prepare): don't change package files on prepare (#11579) 4 days ago
tsconfig.json fix(test runner): resolve tsconfig for each file (#11662) 1 day ago

🎭 Playwright

npm version Chromium version Firefox version WebKit version

Documentation | API reference

Playwright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API. Playwright is built to enable cross-browser web automation that is ever-green, capable, reliable and fast.

Linux macOS Windows
Chromium 99.0.4837.0
WebKit 15.4
Firefox 96.0.1

Headless execution is supported for all the browsers on all platforms. Check out system requirements for details.


npm i -D playwright

This installs Playwright and browser binaries for Chromium, Firefox and WebKit. Once installed, you can require Playwright in a Node.js script and automate web browser interactions.


Playwright is built to automate the broad and growing set of web browser capabilities used by Single Page Apps and Progressive Web Apps.

  • Scenarios that span multiple page, domains and iframes
  • Auto-wait for elements to be ready before executing actions (like click, fill)
  • Intercept network activity for stubbing and mocking network requests
  • Emulate mobile devices, geolocation, permissions
  • Support for web components via shadow-piercing selectors
  • Native input events for mouse and keyboard
  • Upload and download files


Page screenshot

This code snippet navigates to and saves a screenshot.

import { test } from '@playwright/test';

test('Page Screenshot', async ({ page }) => {
    await page.goto('');
    await page.screenshot({ path: `example.png` });

Mobile and geolocation

This snippet emulates Mobile Safari on a device at a given geolocation, navigates to, performs action and takes a screenshot.

import { test, devices } from '@playwright/test';

  ...devices['iPhone 13 Pro'],
  locale: 'en-US',
  geolocation: { longitude: 12.492507, latitude: 41.889938 },
  permissions: ['geolocation'],

test('Mobile and geolocation', async ({ page }) => {
  await page.goto('');
  await page.locator('text="Your location"').click();
  await page.waitForRequest(/.*preview\/pwa/);
  await page.screenshot({ path: 'colosseum-iphone.png' });

Evaluate in browser context

This code snippet navigates to, and executes a script in the page context.

import { test } from '@playwright/test';

test('Evaluate in browser context', async ({ page }) => {
  await page.goto('');
  const dimensions = await page.evaluate(() => {
    return {
      width: document.documentElement.clientWidth,
      height: document.documentElement.clientHeight,
      deviceScaleFactor: window.devicePixelRatio

Intercept network requests

This code snippet sets up request routing for a page to log all network requests.

import { test } from '@playwright/test';

test('Intercept network requests', async ({ page }) => {
  // Log and continue all network requests
  await page.route('**', route => {
  await page.goto('');