職場でE2EツールとしてPlaywrightを使用しており、ソースコードをPythonで書いています。そのときのPlaywrightの環境構築手順はこちら。
ただ、Playwright単体はどの言語で書かれても問題ないものの、どうしてもテストライブラリ等のエコシステムは言語により得意不得意があります。フロントエンドはNode.jsで書かれることが多いのか、Playwrightの公式に記載されているテストの書き方はNode.jsが一番充足しています。
作りこめばどの言語でも同じことはできるとは分かっているものの、環境構築に勉強のコストを掛けたくないので、Node.jsで学ぶことにしました。
今回の記事では、Node.jsが動くPlaywrightのDocker環境を用意します。
環境
- Node.js
- v14.17.6
- Playwright
- 1.14.1
- GitHub Codespaces
- 2021/09/20時点
ゴール
- Playwrightの実行環境をDockerで用意する
- Node.jsで作成したシナリオを実行する
- VS Codeの
.devcontainer
が動くようにする
書かないこと
- GitHub Codespacesの使い方
手順
VS Codeのdevcontainerで動かす下準備をする
.devcontainer
ディレクトリを作成します。
.devcontainer
ディレクトリの配下に、devcontainer.json
を作成します。
devcontainer.json
に次の記述を追加して、指定のDockerfileを使用するようにします。
{ "build": { "dockerfile": "Dockerfile" }, }
Dockerfileを準備する
.devcontainer
ディレクトリの配下にDockerfile
を作成します。
WebDriver等が入っているDockerイメージをMicrosoftから提供されているので利用します。Node.jsで動く状態ではありません。
ですので、Dockerfile内でNode.jsを環境構築する必要があります。
ベースにMicrosoftから提供されているPlaywrightのDockerイメージのFROM mcr.microsoft.com/playwright:focal
を使用します。次に、ベースにnpmをインストールします。現状のLTSは12, 14ですので、14に合わせています。環境構築時の最新のバージョンを指定するようにしてください。
なお、ホームディレクトリの修正やマウント設定等が面倒なため、DockerfileではPlaywrightをNode.jsで動かすためのパッケージはインストールしません。
FROM mcr.microsoft.com/playwright:focal RUN apt-get -y update RUN apt-get install -y \ curl \ gnupg # 最新のLTSを確認すること RUN curl -sL https://deb.nodesource.com/setup_14.x | bash - RUN apt-get install -y nodejs RUN npm install npm@latest -g
DevContainerを再起動する
GitHub Codepacesで上の作業をしていない場合はスキップしてください。
DevContainerで使用するDockerfileを変更しているため、コンテナをリビルドする必要があります。
Ctrl + Shift + P(または、Shift + Command + P)
でヘッダに入力欄が表示されるので、Codespaces: Rebuild Container
を実行します。
Node.jsでPlaywrightを動かすパッケージをインストールする
次のコマンドを実行することで、Node.jsでPlaywrightを動かすパッケージをインストールします。
コマンドを実行したディレクトリでしか実行できませんので注意してください。
npm install -D @playwright/test npx playwright install
シナリオを準備する
あとは、Playwrightの標準的な使い方になります。
test
ディレクトリを作成し、sample.spec.ts
ファイルを作成します。中身はチュートリアルと同じです。
import { test, expect } from '@playwright/test'; test('basic test', async ({ page }) => { await page.goto('https://playwright.dev/'); const title = page.locator('.navbar__inner .navbar__title'); await expect(title).toHaveText('Playwright'); });
実行する
npx playwright test
を実行すると、tests
ディレクトリのテストコードが実行されます。
ここで動作しない場合は何か問題が発生していますので、再度やり直してください。
ソースコード
- https://github.com/hirotoKirimaru/playwright-practice/blob/1c6d10b166be5818a741535ead46c692b49559de/.devcontainer/Dockerfile
- playwright-practice/devcontainer.json at 1c6d10b166be5818a741535ead46c692b49559de · hirotoKirimaru/playwright-practice · GitHub
終わりに
Pythonで作りこんでいましたが、スナップショットテスト等が面倒で結局Node.jsで作りこむことにしました。
正直、Pythonの場合はpip
するだけで簡単に構築できたのですが、Node.jsがベースではないイメージでNode.jsを動かそうとすると面倒でした。ほかにも、Dockerfileでnpm install
をしようとするとTracker "idealTree" already exists
が発生してしまうので、回避したらセットアップが余計に面倒になったのでやめました。
本来であればすべての環境構築をDockerfileに詰め込んで、起動時にマウント設定等を行った方がいいですが、DevContainer
の仕様がよく分からなかったので現状はこのように運用しています。
ぜひ、こちらで使ってみてください。
参考情報
- Dockerでphpコンテナとかにnpmをインストールするときのメモ - tsyama記
- dockerfile - npm ERR! Tracker "idealTree" already exists while creating the Docker image for Node project - Stack Overflow
- https://docs.github.com/ja/codespaces/customizing-your-codespace/configuring-codespaces-for-your-project