M1とdockerでPlaywrightを動かす
目次
M1だとLinuxで動くブラウザと相性が悪いらしく、M1とdockerを使う際に注意が必要のようです。 実際に試したのでメモとして残しておきます。
下記を参考にしてDcokerとdocker-composeを作りました。
Playwright on Dockerをセットアップする(2022)
ただしこのままですと、M1 Macで動きませんでした。
Dockerfileを下記に変更する用意する
FROM ubuntu:bionic
WORKDIR /home/pwuser/app/
COPY ./package.json /home/pwuser/app/
# Install node17
RUN apt-get update && apt-get install -y curl && \
curl -sL https://deb.nodesource.com/setup_17.x | bash - && \
apt-get install -y nodejs
# Install
RUN apt update && apt install -y chromium-browser fonts-takao
RUN npm init -y\
&& PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1 npm i -D playwright @playwright/test dotenv
念の為e2eテストで使いそうな日本語のフォントをインストールしておきます。fonts-takao
M1 MacでPlaywrightをDockerで動かす - Qiita 上記参考にさせていただきました。
ただ自分の環境ですと下記のエラーが出てしまいました。
「Error: ERROR: Playwright does not support firefox」の対策
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD=1
をつけないとブラウザをダウンロードしようとして下記のようなエラーが出てしまうため気をつけましょう。
Error: ERROR: Playwright does not support firefox
Unable to compile on bionic ARM64 · Issue #6587 · vercel/hyper
「npm ERR! Tracker "idealTree" already exists」の対策
npm ERR! Tracker "idealTree" already exists
下記を入れることで対応しました。
WORKDIR /home/pwuser/app/
COPY ./package.json /home/pwuser/app/
/.npm/_logs周りの権限エラー
Log files were not written due to an error writing to the directory: /.npm/_logs npm ERR! You can rerun the command with `--loglevel=verbose` to see the logs in your terminal
エラーをメモしてなかったのですが、バージョン16系のエラーのようだったので17に上げることでエラーが改善されました。
https://deb.nodesource.com/setup_17.x
【Vue.js 2.9】DockerでVue.jsをインストールしたらエラー発生 | オスースBlog
パスはdocker-compose
側の設定と合わせました。
docker-compose.ymlを用意する
version: "3"
services:
pw:
container_name: pw
image: pw:1.0
build:
context: .
dockerfile: ./Dockerfile
# tty: true
user: 1000:1000
dns:
- 1.1.1.1
- 8.8.8.8
extra_hosts:
- "host.docker.internal:host-gateway"
volumes:
- ./:/home/pwuser/app/
working_dir: /home/pwuser/app
entrypoint: npx playwright test
Dockerで動かす場合のtest側の実装
executablePath を使ってchromiumのパスを指定してあげます。
下記参考
M1 MacでPlaywrightをDockerで動かす - Qiita
import { chromium } from "playwright";
chromium
.launch({
executablePath: "/usr/bin/chromium-browser",
})
.then((browser) => { /* Code Here */ })
Dockerコンテナ内からホストのポートにアクセスする
今回少し特殊なケースがですが、Dockerから自分の環境に立てたアプリを見る必要があったので docker-compose.ymlに下記を追加しました。
extra_hosts:
- "host.docker.internal:host-gateway"
Docker コンテナ内からホストのポートにアクセスする方法まとめ | gotohayato.com
こうすることで実際のテストコードから下記のような形で自分の環境にアクセスすることができます。
http://host.docker.internal:3000/
動画が撮れない問題
動画を撮ろうとした場合に下記のようなエラーが出てしまいました。
browserContext.newPage: Executable doesn't exist at /.cache/ms-playwright/ffmpeg-1008/ffmpeg-linux
エラーの原因特定がなかなか難しいのですが、 chromium-browser
を通してのffmpegでの録画がうまくいっていないようです。
似たようなエラーとして下記が引っかかったので残しておきます。 [BUG] ffmpeg-linux executable doesn't exist · Issue #15265 · microsoft/playwright
参考
contextを作るとPlaywrightTestConfigで設定したvideoの値が効かなくなる
m1関係ないですがcontextを自前で作った時にPlaywrightTestConfigのvideo設定が効かなくなるので注意のようです。
use: {
video: 'off',
},
[Question] - is PlaywrightTestConfig -> use -> video -> <videoMode> working? · Issue #13107 · microsoft/playwright
ただcontextを作った場合にvideoのモードをon-first-retry
にする方法が調べられませんでした。。
contextでビデオを下記を設定していた場合configの設定を無視してとりあえず動画が撮られてしまう状態になっている気がします。
{ recordVideo: { dir: 'videos/' } }
https://playwright.dev/docs/videos
contextを作った場合にエラー処理を入れないと動画が取られない
contextとbrowserをcloseしないとエラーになった時に動画がキャプチャされないようです。
test('テスト', async () => {
const [ browser, context, page ] = await utils.settingBrowser()
try{
await context.close()
await browser.close()
} catch (e) {
await context.close()
await browser.close()
}
})
他のe2eテスト周りの比較については下記より
ブラウザ拡張のE2Eテストを検討してみた(Playwright、Puppeteer、Cypress) - Techtouch Developers Blog
Cypressも同様にM1 Macで動かない
現状ガッツリと調べたわけではないのですが、 調べてみたところによるとDockerを立てて起動しようとすると手間がかかるようです。 https://scrapbox.io/miyamonz/M1_Macでcypressのdocker動かん
まとめ
dockerを経由せずであれば問題はなさそうでしたが、 M1 Macでのdockerを経由してのブラウザがあまり出揃ってない印象でした。 e2e + docker + M1 Macでやる場合には少し癖があるようです。
上の環境の場合はdockerを使うのは諦めて、 ローカル環境で行うようにしてもよいかもしれません。