Laravel Duskが動かん(on Docker) (失敗編)

Laravelロゴ

Laravelでテストコードを書いてますが、通常のUnitTestはHTTPレスポンスの中身のテキストしかテストできません。jQueryとかVueとかフロントでレンダリングしているものに関してはブラウザ経由でアクセスする必要があります。
これを実現してるのがLaravel Duskというやつです。
試してみたのですがいろいろハマったのでその時のメモ。

うまくいかなかったので特に読む必要はありません。
試行錯誤をみたい方だけ続きをどうぞ・・・

環境
Mac(M1チップ)
DockerDesktop
Dockerイメージ php:7.4-apache

こんな感じでインストール

composer require --dev laravel/dusk
php artisan dusk:install

これで実行できる。。。はずでしたが

php artisan dusk
1) Tests\Browser\ExampleTest::testBasicExample
Facebook\WebDriver\Exception\WebDriverCurlException: Curl error thrown for http POST to /session with params: {"capabilities":{"firstMatch":[{"browserName":"chrome","goog:chromeOptions":{"args":["--window-size=1920,1080","--disable-gpu","--headless"]}}]},"desiredCapabilities":{"browserName":"chrome","platform":"ANY","chromeOptions":{"args":["--window-size=1920,1080","--disable-gpu","--headless"]}}}

Failed to connect to localhost port 9515: Connection refused

うごかん。

色々調べてみたところ、

./vendor/laravel/dusk/bin/chromedriver-linux

で、コンソールからchromeを起動して操作しているらしく、試しに実行してみたら、

./vendor/laravel/dusk/bin/chromedriver-linux -v
qemu-x86_64: Could not open '/lib64/ld-linux-x86-64.so.2': No such file or directory

なるほどなるほど、共有ライブラリが存在しないとな?
こちらも調べてみたところ、AppleシリコンのMacではプラットフォーム指定が必要らしい。
DockerFileのイメージ指定で –platform=linux/amd64 を追加する必要がある様です。
私の場合はこの様にしました

FROM --platform=linux/amd64 php:7.4-apache

ビルドし直して再度試してみたところ、今度はlibnss3がないと言われました

./vendor/laravel/dusk/bin/chromedriver-linux -v
./vendor/laravel/dusk/bin/chromedriver-linux: error while loading shared libraries: libnss3.so: cannot open shared object file: No such file or directory

試しに、

apt-get install libnss3
./vendor/laravel/dusk/bin/chromedriver-linux -v
ChromeDriver 107.0.5304.62 (1eec40d3a5764881c92085aaee66d25075c159aa-refs/branch-heads/5304@{#942})

とやったら大丈夫そうだったので、こちらもDockerファイルに追加してduskを実行してみた

php artisan dusk
---省略---
1) Tests\Browser\ExampleTest::testBasicExample
Facebook\WebDriver\Exception\UnknownErrorException: unknown error: cannot find Chrome binary

うーん。これだけだとダメらしい。どうも、Chrome本体を入れる必要があり
ディストリビューションがわからないとどうやって入れるのかよくわからない。
こちらを参考にディストリビューションを調査したところ、Debianらしいことが判明

cat /etc/debian_version
11.5

標準パッケージにはないらしいので以下の様にしてインストール(表記はDockerFile)

RUN wget -q https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb \
&& apt install -y ./google-chrome-stable_current_amd64.deb \
&& rm google-chrome-stable_current_amd64.deb

というわけで、再度実行

php artisan dusk
PHPUnit 9.5.26 by Sebastian Bergmann and contributors.

E 1 / 1 (100%)

Time: 00:10.014, Memory: 24.00 MB

There was 1 error:

1) Tests\Browser\ExampleTest::testBasicExample
Facebook\WebDriver\Exception\UnknownErrorException: unknown error: Chrome failed to start: exited abnormally.
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/bin/google-chrome is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

ダメです!
chromeが起動してないらしい。

/usr/bin/google-chrome -v
[1101/075412.598091:WARNING:crashpad_client_linux.cc(362)] prctl: Invalid argument (22)
[482:482:1101/075412.659291:ERROR:zygote_host_impl_linux.cc(90)] Running as root without --no-sandbox is not supported. See https://crbug.com/638180.

オプションつけて起動する必要があるっぽい。が、そいういう問題ではなかった。
そもそも、Appleシリコン版のDockerではChrome動かないらしい。

どうも、いつも使ってる例の Chrome じゃなくて chromium というのを入れるらしい。

chromeのインストールの件は消してchromiumを追加

apt install -y chromium

もう一回実行してみたところ

php artisan dusk
PHPUnit 9.5.26 by Sebastian Bergmann and contributors.

E 1 / 1 (100%)

Time: 00:06.511, Memory: 24.00 MB

There was 1 error:

1) Tests\Browser\ExampleTest::testBasicExample
Facebook\WebDriver\Exception\UnknownErrorException: unknown error: Chrome failed to start: exited abnormally.
(unknown error: DevToolsActivePort file doesn't exist)
(The process started from chrome location /usr/bin/chromium is no longer running, so ChromeDriver is assuming that Chrome has crashed.)

同じやw
chromiumを実行してみたら。

/usr/bin/chromium
Error: Can’t open display:

そりゃそうだ。だってDockerだもの。

で、色々見てみたのだが、別にアプリケーションサーバーにブラウザを入れる必要はない様だった。
ということで、次回は別々に入れてなんとかする方法と、Sailを使って動かす方法を試してみます。

タイトルとURLをコピーしました