Puppeteerより便利なテスト自動化ツールPlaywrightの使い方

Playwrightとは

Playwrightとは2020年1月31日にリリースされた、テスト自動化ツール。

以前はPuppeteerというテスト自動化ツールが人気だったが、Playwrightの登場以降はこちらを使用する人が増えてきています。

ちなみにPlaywrightとは「脚本家」という意味です。

Puppeteerとの違い

Puppeteerとの違いは以下の通りです。

Playwrightは後発ということもあり、Puppeteerより高機能です。

特徴 Playwright Puppeteer
ブラウザ Chromium, Firefox, WebKit ChromiumとChrome(Firefox版もある)
API設計 ブラウザ、コンテキスト、ページの3つの階層を持つ ブラウザとページの2つの階層を持つ
セレクタエンジン CSS, XPath, およびテキストセレクタをサポート CSS および XPathセレクタをサポート
使用言語 JavaScript, TypeScript, Python JavaScript および TypeScript
サポート Microsoft Google

Playwrightの使い方

まず以下のコマンドでフォルダを作成して移動します。

mkdir my-test; cd my-test

次に以下のコマンドでPlaywrightをインストールします。

npm init playwright@latest

インストールコマンドを実行すると色々聞かれますので、すべてEnterキーを押してデフォルト設定でインストールしてください。

Initializing project in '.'
✔ Do you want to use TypeScript or JavaScript? · TypeScript
✔ Where to put your end-to-end tests? · tests
✔ Add a GitHub Actions workflow? (y/N) · false
✔ Install Playwright browsers (can be done manually via 'npx playwright install')? (Y/n) · true

インストール完了後は以下のコマンドでend-to-endテストを実行できます。

npx playwright test

実行結果のレポートを見るには「show-report」を実行します。

npx playwright show-report

インストール完了後、testsディレクトリにexample.spec.jsが入っているので、実行例をすぐに確認できます。

Playwright テスト結果

すでにあるプロジェクトフォルダ内にインストールする場合は以下のコマンドを実行します。

npm i -D playwright

Node.jsで実行するJavaScriptの書き方

Node.jsで実行するJavaScriptのコードを作成する場合は、以下のように書きます。

import { chromium, devices } from 'playwright'
import assert from 'node:assert'

;(async () => {
  const browser = await chromium.launch()
  const context = await browser.newContext(devices['iPhone 11'])
  const page = await context.newPage()

  await context.route('**.jpg', (route) => route.abort())
  await page.goto('https://example.com/')

  // 「Example Domain」が表示されます
  console.log(await page.title())

  // trueなので何も発生しない
  assert((await page.title()) === 'Example Domain')

  // スクリーンショットを取得
  await page.screenshot({ path: 'screenshot.png' })

  await context.close()
  await browser.close()
})()

sample.mjsのようなファイル名で保存したら、以下のコマンドで実行できます。

node sample.mjs

iPhone 11で起動してWebページのタイトルのチェックとスクリーンショットの保存をしています。

iPhone 11以外のデバイスはdeviceDescriptorsSource.jsonに記載されています。

iPhone 5などの古すぎるデバイスはPuppeteerと違って存在しません。

Puppeteerのコードに似ていますが、Puppeteerと互換性はありません。

ブラウザの切り替え方法

前述のコードはChromiumを使用していますが、FirefoxやWebKit (Safari) も以下のようにインポートすれば使用可能です。

import { firefox } from 'playwright'
 
;(async () => {
  const browser = await firefox.launch()
  // 中略
  await browser.close()
})()
import { webkit } from 'playwright'
 
;(async () => {
  const browser = await webkit.launch()
  // 中略
  await browser.close()
})()

3ブラウザで実行する場合は以下のようになります。

import { chromium, firefox, webkit } from 'playwright'

;(async () => {
  const browsers = [chromium, firefox, webkit]
  await Promise.all(
    browsers.map(async (browser) => {
      const launchBrowser = await browser.launch()
      const context = await launchBrowser.newContext()
      const page = await context.newPage()
      await page.goto('https://example.com/')
      console.log(await page.title())
      await launchBrowser.close()
    })
  )
})()

ちなみにChromiumはChrome or Microsoft Edgeですが、明確に分ける場合はchannelオプションを使って「chrome」または「msedge」を指定して下さい。

※ Chrome および Microsoft Edge のブラウザがインストールされている必要があります。

const browser = await chromium.launch({
  channel: 'chrome'
})
const browser = await chromium.launch({
  channel: 'msedge'
})