実行するコマンド
# headless chrome のインストール
curl https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo dpkg -i google-chrome-stable_current_amd64.deb # エラーが出るけどそのまま進む
sudo apt install -fy
テストコードの変更
require "test_helper"
class ApplicationSystemTestCase < ActionDispatch::SystemTestCase
# driven_by :selenium, using: :chrome, screen_size: [1400, 1400]
driven_by :selenium, using: :headless_chrome
end
解説
前提: system testの仕組み
- Railsアプリとブラウザを実際に動作させて、テストプログラムからブラウザを操作してテストを行う
- なので、ブラウザが必要である
- ブラウザをテストで操作するためのプログラムも必要である、これをドライバと呼ぶ
- どのブラウザ(ドライバ)を使うかは指定する(する必要がある)
ドライバは自動で用意される
ぐぐると様々な情報が出てきますが、Rails6.1においては、特別に何かの設定をする必要はありません。
Rails6.1のGemfileには最初からwebdriversというgemが入っていて、このgemがsystem testの実行時に(なければ)自動的に必要なドライバをインストールしてくれます。
WSL2環境においては、ブラウザはheadless chromeが楽
webdrivers gemのREADMEに書いてあるとおりです。windows上のchromeを利用するためには特殊な設定が必要になるので、特別な理由がなければheadless chromeが良いでしょう。
ちなみにheadというのは画面のことで、画面無しで(コマンドラインで)動くからheadlessと呼びます。
chromeはaptから直接はインストールできない
apt search chrome
とかで探すとわかりますが、aptのパッケージにはなっていないようです。
googleのサイトからダウンロードする方法が3年前の先人による記事で見つかったのでその方法を採用して、うまく行きましたが、ブラウザからchromeのダウンロード用サイトを見てもcurlなどでダウンロードする場合のURLは見つけられませんでした。なので、いつまでこの方法でできるかはわかりません。
dpkg
はaptのより基本的な部分のインストール処理を行うコマンドですが、実行しても依存関係を解決できませんでした(理由は未確認)。なので続く sudo apt install -fy
で依存関係の解決を後出しで行って、chromeを動くようにしています。
chromeはheadlessかどうかで使うドライバ(の設定)が異なる
デフォルトでもsystem testはchromeを使う設定になっていますが、これは画面があるchromeを使う設定なので、画面があるchromeを起動できない環境(WSL2はこれに該当します)ではテスト実行が失敗します。
headless chromeを使うには、冒頭に記載したようにテストコードの設定変更を行えば良いです。このこと自体はRailsガイドに記載があります。