Playwright is a framework for Web Testing and Automation. It allows testing Chromium, Firefox and WebKit with a single API.
Go to file
2020-01-17 20:12:22 -08:00
.ci Initial commit 2019-11-19 10:58:15 -08:00
.github/workflows devops(ci): drop the pw_run.sh from dbg output 2020-01-17 20:09:28 -08:00
browser_patches devops: support webkit-gtk-wpe in the check_cdn.sh 2020-01-17 19:07:58 -08:00
docs feat(network): ignore favicon requests - these are too unpredictable (#533) 2020-01-17 17:14:39 -08:00
src fix(webkit): clear workers on navigation (#535) 2020-01-17 18:46:45 -08:00
test test(firefox): enable some passing tests (#536) 2020-01-17 17:51:48 -08:00
utils chore(webkit): simplify session init logic (#523) 2020-01-17 14:02:57 -08:00
.appveyor.yml Initial commit 2019-11-19 10:58:15 -08:00
.cirrus.yml Initial commit 2019-11-19 10:58:15 -08:00
.editorconfig Initial commit 2019-11-19 10:58:15 -08:00
.eslintignore feat: basic d.ts file (#161) 2019-12-06 11:28:23 -08:00
.eslintrc.js lint: fixes (#85) 2019-11-26 08:19:02 -08:00
.gitignore chore: update top-level api (#479) 2020-01-13 17:36:46 -08:00
.npmignore chore: update top-level api (#479) 2020-01-13 17:36:46 -08:00
.travis.yml chore(ci): use bionic for travis 2019-12-05 15:18:55 -08:00
CODE_OF_CONDUCT.md Initial CODE_OF_CONDUCT.md commit 2019-11-15 10:32:47 -08:00
CONTRIBUTING.md docs: preparing readme for public release (#433) 2020-01-08 16:53:57 -08:00
index.d.ts chore: update top-level api (#479) 2020-01-13 17:36:46 -08:00
index.js fix(devices): restore devices entry point 2020-01-17 19:42:20 -08:00
install.js fix(install): follow-up to 5b1aef4c20 2020-01-14 15:44:46 -08: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.json chore: bump version to 0.9.16-post 2020-01-17 19:43:46 -08:00
README.md Update README.md 2020-01-17 20:12:22 -08:00
SECURITY.md Initial SECURITY.md commit 2019-11-15 10:32:49 -08:00
tsconfig.json chore: finish strict type checks across src (#482) 2020-01-13 22:08:35 -08:00

Playwright

npm version

API | FAQ | Contributing

Playwright is a Node library to automate the Chromium, WebKit and Firefox browsers. Playwright is focused on enabling cross-browser and cross-operating-system web automation platform that is ever-green, capable, reliable and fast. Our primary goal with Playwright is to improve automated UI testing by eliminating flakiness, improving the speed of execution and offering insights into the browser operation. Playwright runs headless versions of these browsers by default, but can be configured to run the full versions.

Installation

npm i playwright

This installs Playwright along with its dependencies and the browser binaries. Browser binaries are about 50-100MB each, so expect the installation network traffic to be substantial.

Usage

Playwright can be used to create a browser instance, open pages, and then manipulate them. See API docs for a comprehensive list.

Examples

Page screenshot

This code snippet navigates to example.com in WebKit, and saves a screenshot.

const pw = require('playwright');

(async () => {
  const browser = await pw.webkit.launch(); // or 'chromium', 'firefox'
  const context = await browser.newContext();
  const page = await context.newPage();

  await page.goto('https://www.example.com/');
  await page.screenshot({ path: 'example.png' });

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

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

const pw = require('playwright');
const iPhone11 = pw.devices['iPhone 11 Pro'];

(async () => {
  const browser = await pw.webkit.launch();
  const context = await browser.newContext({
    viewport: iPhone11.viewport,
    userAgent: iPhone11.userAgent,
    geolocation: { longitude: 12.492507, latitude: 41.889938 },
    permissions: { 'https://www.google.com': ['geolocation'] }
  });

  const page = await context.newPage('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();
})();

And here is the same script for Chrome on Android.

const pw = require('playwright');
const pixel2 = pw.devices['Pixel 2'];

(async () => {
  const browser = await pw.chromium.launch();
  const context = await browser.newContext({
    viewport: pixel2.viewport,
    userAgent: pixel2.userAgent,
    geolocation: { longitude: 12.492507, latitude: 41.889938 },
    permissions: { 'https://www.google.com': ['geolocation'] }
  });

  const page = await context.newPage('https://maps.google.com');
  await page.click('text="Your location"');
  await page.waitForRequest(/.*pwa\/net.js.*/);
  await page.screenshot({ path: 'colosseum-android.png' });
  await browser.close();
})();

Evaluate script

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

const pw = require('playwright');

(async () => {
  const browser = await pw.firefox.launch(); // or 'chromium', 'webkit'
  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();
})();

Contributing

Check out our contributing guide.

FAQ

Q: How does Playwright relate to Puppeteer?

We are the same team that built Puppeteer. Puppeteer proved that there is a lot of interest in the new generation of ever-green, capable and reliable automation drivers. With Playwright, we'd like to take it one step further and offer the same functionality for all the popular rendering engines. We'd like to see Playwright vendor-neutral and shared goverened.

With Playwright, we are making the APIs more testing friendly as well. We are taking the lessons learned from Puppeteer and incorporate them into the API, for example, user agent / device emulation is set up consistently on the BrowserContext level to enable multi-page scenarios, click now waits for the element to be available and visible by default, etc.

Playwright also aims at being even more cloud-friendly. Rather than a single page, BrowserContext abstraction is now central to the library operation. BrowserContexts are isolated, they can be either created locally or provided by the server-side factories.

All the changes and improvements above would require breaking changes to the Puppeteer API, so we chose to start with a clean slate instead. Due to the similarity of the concepts and the APIs, migration between the two is still a mechanical task.

Q: What about the WebDriver?

WIP

Q: Is Playwright ready?

Playwright is ready for your feedback. It respects semver, so please expect some API breakages as we release 1.0. All we can promise is that those breakages are going to be based on your feedback with the sole purpose of making our APIs better.

Playwright is being actively developed as we get to the feature parity across Chromium, Firefox and WebKit. Progress on each browser can be tracked on the Is Playwright Ready? page, which shows currently failing tests per browser.

Resources