j-kbt 備忘録

日々のお勉強や思ったことを残しておくもの

Playwright を使ってみた

はじめに

最近, 会社でテスト自動化のさらなる推進が行われていて, 色々なツールを調べています. そんな中でPlaywright の話を聞き, 試してみることにしました.

Playwright とは

ブラウザ を動かす Node.js のライブラリで, Webdriver や Puppeteer みたいなものだと思ってもらえば良いかなと思います. もともと, Puppeteer のチームの人が関わって作っているものとなります. 対応しているブラウザは, Chromium, Firefox, Webkit です. Microsoft のチームなんだから, Trident も頼む!とか思いますけど, もう使うなが正しいような気もします.

Node.js のインストール

Windows の人はまずは, node.js をインストールするところから始めましょう. 私の環境はMac なので, 以下の作業で Node.js をインストールしていきます. まずは nodebrew を入れます.

$ brew install nodebrew

パスを通さないと動かないため, nodebrew のインストールパスを .zprofile などに追記します.

export PATH=$HOME/.nodebrew/current/bin:$PATH

次に, nodebrew を使用して Node.js をインストールします. バージョン指定したい場合は, 予め ls-remote で調べて指定してください. コマンドを打って, Installed successfully がでたら成功です.

$ nodebrew install-binary latest
Fetching: https://nodejs.org/dist/v13.13.0/node-v13.13.0-darwin-x64.tar.gz
################################################################################################################################################################## 100.0%
Installed successfully

現在インストールしているバージョンを調べて,

$ nodebrew ls                   
v12.13.1
v13.3.0
v13.13.0

使用するバージョンを指定します.

$ nodebrew use v13.13.0
use v13.13.0

node と npm のバージョンを確認します. うまく出力されてたら大丈夫ですね.

$ node -v              
v13.13.0

$ npm -v                     
6.14.4

使用するディレクトリで初期化します. コマンドを打ったときのディレクトリに package.json が作られます. 色々聞かれますが, 後で編集できるので, Enter連打で問題ないです.

$ npm init

package.json の中身はこんな感じ.

{
  "name": "playwrightTest",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC"
}

Playwright のインストール

今回は Playwright と Jest を組み合わせて使用します. 以下のコマンドを打つと完了!

npm install -D jest jest-playwright-preset playwrightls

Playwright でテストを書く

早速, グーグル検索をしてみましょう. ちなみにディレクトリの構造はこんな感じです.

playwrightTest
├── node_modules
├── package-lock.json
├── package.json
├── jest.config.js
└── test
    └── google.test.js

今回は以下の動作確認をします.

  1. google.com にアクセス
  2. 検索フォームを埋めて検索ボタンをクリックする
  3. 検索結果ページ の要素を確認する
const playwright = require('playwright')
const browserTypes = ['chromium',  'webkit']

for (const browserType of browserTypes){
    describe('Google Test', () =>{
        beforeAll(async () =>{
            browser = await playwright[browserType].launch()
            const context = await browser.newContext()
            page = await context.newPage()

            await page.goto('https://www.google.com')
            await page.screenshot({path: `example-${browserType}.png`})
        })

        test(`checkURL and searchform ${browserType}`, async () =>{
            await page.fill('.gLFyf.gsfi','playwright puppeteer')
            await page.screenshot({path: `example-start-${browserType}.png`})
            await page.click('input[value="Google 検索"]')

            await page.screenshot({path: `example-end-${browserType}.png`})
            searchForm = await page.$$('css=.gLFyf.gsfi')
            expect(searchForm.length).toBe(1)
            result = await page.$$('css=.g')
            expect(result.length).toBe(10)
        })

        afterAll(async () => {
            browser.close()
        })
    })
}

重要な部分は殆ど, 公式ページのコピペです.

テスト全体の前処理として, beforeAll, 後処理として afterAll に処理を記述しています. test の中身での要素取得はCSSセレクタを使っている場合が多いですが, 多分もっといい方法があるはず. これはAPI をもう少し調べる必要がありますね. もっと詳しくなれたら, 解説記事書いていこうかなと思います.

次に, jest.config.js の記述です. 記述の内容は, npmの説明ページを参考にしています. 今回は, playwright を動かすだけなので, 以下の記述でOK.

module.exports = {
    preset: 'jest-playwright-preset'
}

テストを動かすために, package.json を少し書き換えます. scriptsのところを以下の通りに変更.

{
  "name": "playwrighttest",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "jest"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "jest": "^25.3.0",
    "jest-playwright-preset": "^0.1.2",
    "playwright": "^0.13.0"
  }
}

Jest からPlaywright を実行

以下のコマンドをプロジェクトルートで実行すると, 次の出力が出てきます.

$ npm test

Test Suites: 1 failed, 1 total
Tests:       1 failed, 2 passed, 3 total
Snapshots:   0 total
Time:        23.411s
Ran all test suites.

スクリーンショットも取れています.

f:id:j-kbt:20200418152228p:plain
google にアクセス

f:id:j-kbt:20200418152303p:plain
検索ワードを入力

f:id:j-kbt:20200418152337p:plain
検索結果

わりとイメージ通りに動くかなと思います. ただ, firefox がうまく動かない……。なぜだろう……。

感想

  • 日本語のドキュメントが皆無であるので, 実際に動くまでに苦労する
  • 公式ドキュメントも微妙に分かりづらい
  • webdriver に比べたらwait とか書かなくてよいし, 早い
  • プロキシ設定が効かない. 全くわからなかった

そういえば, まだ バージョン 0なので上のコードも正式版のときには動かなくなっているかもですね.