Playwright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.
Go to file
Ross Wollman e97badcca8
docs(CONTRIBUTING.md): Add build step (#2869)
* docs(CONTRIBUTING.md): Add build step

Without the build step, a fresh install without any previous
builds would get:

```
$ npm test

> playwright-internal@1.2.0-post test /Users/pw/code/playwright
> cross-env BROWSER=all node --unhandled-rejections=strict test/test.js

internal/modules/cjs/loader.js:1033
  throw err;
  ^

Error: Cannot find module '../lib/rpc/server/dispatcher'
Require stack:
- /Users/pw/code/playwright/test/environments.js
- /Users/pw/code/playwright/test/test.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:1030:15)
    at Function.Module._load (internal/modules/cjs/loader.js:899:27)
    at Module.require (internal/modules/cjs/loader.js:1090:19)
    at require (internal/modules/cjs/helpers.js:75:18)
    at Object.<anonymous> (/Users/pw/code/playwright/test/environments.js:23:34)
    at Module._compile (internal/modules/cjs/loader.js:1201:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1221:10)
    at Module.load (internal/modules/cjs/loader.js:1050:32)
    at Function.Module._load (internal/modules/cjs/loader.js:938:14)
    at Module.require (internal/modules/cjs/loader.js:1090:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/Users/pw/code/playwright/test/environments.js',
    '/Users/pw/code/playwright/test/test.js'
  ]
}
npm ERR! Test failed.  See above for more details.
```

Fixes #2868.

Co-authored-by: Andrey Lushnikov <aslushnikov@gmail.com>
2020-07-07 22:38:59 -07:00
.circleci chore: generate protocol during browser roll (#2719) 2020-07-01 15:22:29 -07:00
.github chore: generate protocol during browser roll (#2719) 2020-07-01 15:22:29 -07:00
browser_patches browser(firefox): resize window when changing viewport (#2861) 2020-07-07 14:04:07 -07:00
docs docs(api/input): fix typo (#2837) 2020-07-07 10:46:13 -07:00
packages fix(playwright-core): bring back index.js in playwright-core (#2691) 2020-06-24 13:54:19 -07:00
src feat(rpc): plumb CDPSession (#2862) 2020-07-07 18:47:00 -07:00
test feat(rpc): plumb CDPSession (#2862) 2020-07-07 18:47:00 -07:00
utils testrunner: fix default environment name (#2870) 2020-07-07 22:14:04 -07:00
.appveyor.yml chore: generate protocol during browser roll (#2719) 2020-07-01 15:22:29 -07:00
.editorconfig Initial commit 2019-11-19 10:58:15 -08:00
.eslintignore types: better types (#1166) 2020-03-20 01:30:35 -07:00
.eslintrc.js chore(eslint): lint for copyrights on files (#2858) 2020-07-07 11:12:45 -07:00
.gitattributes chore: windows bots via github actions (#678) 2020-01-28 18:04:51 -08:00
.gitignore chore: generate protocol during browser roll (#2719) 2020-07-01 15:22:29 -07:00
.npmignore chore: drop dependency on playwright-core in all our packages (#2318) 2020-05-21 13:18:15 -07:00
.travis.yml chore: generate protocol during browser roll (#2719) 2020-07-01 15:22:29 -07:00
browsers.json feat(webkit): bump to 1302 (#2852) 2020-07-07 09:31:02 -07:00
CODE_OF_CONDUCT.md Initial CODE_OF_CONDUCT.md commit 2019-11-15 10:32:47 -08:00
CONTRIBUTING.md docs(CONTRIBUTING.md): Add build step (#2869) 2020-07-07 22:38:59 -07:00
index.d.ts types: better types (#1166) 2020-03-20 01:30:35 -07:00
index.js chore: rename root index-for-dev.js into index.js (#2337) 2020-05-23 00:03:57 -07:00
install-from-github.js chore: generate protocol during browser roll (#2719) 2020-07-01 15:22:29 -07:00
LICENSE chore(license): use Apache 2.0 (#389) 2020-01-06 18:22:35 -08:00
NOTICE chore(license): add NOTICE (#309) 2019-12-19 12:19:54 -08:00
package-lock.json chore(eslint): lint for copyrights on files (#2858) 2020-07-07 11:12:45 -07:00
package.json chore(eslint): lint for copyrights on files (#2858) 2020-07-07 11:12:45 -07:00
README.md chore: update webkit version (#2804) 2020-07-06 15:13:53 -07:00
SECURITY.md Initial SECURITY.md commit 2019-11-15 10:32:49 -08:00
tsconfig.json fix(css selector): support comma-separated selector lists (#2120) 2020-05-07 13:36:54 -07:00

🎭 Playwright

npm version Join Slack Chromium version Firefox version WebKit version

Docs | API reference | Changelog

Playwright is a Node library to automate 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 85.0.4182.0
WebKit 14.0
Firefox 78.0b5

Headless execution is supported for all the browsers on all platforms.

Usage

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.

Capabilities

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

Examples

Page screenshot

This code snippet navigates to whatsmyuseragent.org in Chromium, Firefox and WebKit, and saves 3 screenshots.

const playwright = require('playwright');

(async () => {
  for (const browserType of ['chromium', 'firefox', 'webkit']) {
    const browser = await playwright[browserType].launch();
    const context = await browser.newContext();
    const page = await context.newPage();
    await page.goto('http://whatsmyuseragent.org/');
    await page.screenshot({ path: `example-${browserType}.png` });
    await browser.close();
  }
})();

Mobile and geolocation

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

const { webkit, devices } = require('playwright');
const iPhone11 = devices['iPhone 11 Pro'];

(async () => {
  const browser = await webkit.launch();
  const context = await browser.newContext({
    ...iPhone11,
    locale: 'en-US',
    geolocation: { longitude: 12.492507, latitude: 41.889938 },
    permissions: ['geolocation']
  });
  const page = await context.newPage();
  await page.goto('https://maps.google.com');
  await page.click('text="Your location"');
  await page.waitForRequest(/.*preview\/pwa/);
  await page.screenshot({ path: 'colosseum-iphone.png' });
  await browser.close();
})();

Evaluate in browser context

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

const { firefox } = require('playwright');

(async () => {
  const browser = await firefox.launch();
  const context = await browser.newContext();
  const page = await context.newPage();
  await page.goto('https://www.example.com/');
  const dimensions = await page.evaluate(() => {
    return {
      width: document.documentElement.clientWidth,
      height: document.documentElement.clientHeight,
      deviceScaleFactor: window.devicePixelRatio
    }
  });
  console.log(dimensions);

  await browser.close();
})();

Intercept network requests

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

const { webkit } = require('playwright');

(async () => {
  const browser = await webkit.launch();
  const context = await browser.newContext();
  const page = await context.newPage();

  // Log and continue all network requests
  page.route('**', route => {
    console.log(route.request().url());
    route.continue();
  });

  await page.goto('http://todomvc.com');
  await browser.close();
})();

Resources