Skip to content
Node library to automate Chromium, Firefox and WebKit with a single API
JavaScript TypeScript C++ Shell Objective-C HTML Other
Branch: master
Clone or download

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.circleci devops: add package-lock.json (#1859) (#1889) Apr 20, 2020
.github devops: enable core dumps in the subshell (#2555) Jun 12, 2020
browser_patches browser(webkit): configure video scale (#2553) Jun 12, 2020
docs docs: make environment vars snippets cross-platform (#2564) Jun 13, 2020
packages docs(playwright-electron/README.md): fix comment mistake (#2568) Jun 14, 2020
src chore(debug): various debug mode improvements (#2561) Jun 13, 2020
test test: disable flaky cookie test on Chromium Win (#2562) Jun 12, 2020
utils chore: form the debug script for authoring hints / helpers (#2551) Jun 12, 2020
.appveyor.yml devops: add package-lock.json (#1859) (#1889) Apr 20, 2020
.cirrus.yml chore: windows bots via github actions (#678) Jan 29, 2020
.editorconfig Initial commit Nov 19, 2019
.eslintignore types: better types (#1166) Mar 20, 2020
.eslintrc.js chore(lint): add @typescript-eslint/no-unnecessary-type-assertion rule ( Feb 7, 2020
.gitattributes chore: windows bots via github actions (#678) Jan 29, 2020
.gitignore chore: drop dependency on playwright-core in all our packages (#2318) May 21, 2020
.npmignore chore: drop dependency on playwright-core in all our packages (#2318) May 21, 2020
.travis.yml devops: remove custom caching on travis (#2215) May 12, 2020
CODE_OF_CONDUCT.md Initial CODE_OF_CONDUCT.md commit Nov 15, 2019
CONTRIBUTING.md docs(CONTRIBUTING.md): fix typo in doc (#2169) May 10, 2020
LICENSE chore(license): use Apache 2.0 (#389) Jan 7, 2020
NOTICE chore(license): add NOTICE (#309) Dec 19, 2019
README.md feat(browser): roll Firefox to r1108 (#2532) Jun 11, 2020
SECURITY.md Initial SECURITY.md commit Nov 15, 2019
browsers.json Bump to 1280 (#2544) Jun 12, 2020
index.d.ts types: better types (#1166) Mar 20, 2020
index.js chore: rename root `index-for-dev.js` into `index.js` (#2337) May 23, 2020
install-from-github.js chore: drop dependency on playwright-core in all our packages (#2318) May 21, 2020
package-lock.json feat(downloads): accept downloads in persistent, allow specifying the… Jun 9, 2020
package.json chore: cut v1.1.0-post version (#2491) Jun 6, 2020
tsconfig.json fix(css selector): support comma-separated selector lists (#2120) May 7, 2020

README.md

🎭 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.4165.0
WebKit 13.2
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,
    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

You can’t perform that action at this time.