RailsのSystem Specで利用するChromeをバージョン管理する方法


はじめに

RailsのSystem Specではデフォルトではローカル環境にインストール済みのChromeが利用されます。
その場合、設定不要でChromeを使ったテストを簡単に実行出来るというメリットがあるのですが、複数人での開発やCIといった各環境間でのバージョン不一致が発生しやすいというデメリットがあります。
バージョン不一致が発生すると、特定環境でだけ何故かテストが失敗するみたいな原因を特定しにくい問題が起こる可能性があります。
また、コードを何も変更していないのに、いつの間にかChromeのバージョンが上がっていてテストが壊れるみたいな問題が発生する可能性もあります。(そして忙しいタイミングに限ってそういった問題は起こりやすい気がします、、)

そこで今回はDockerを使わずにお手軽にSystem Specで利用するChromeのバージョンをコードで管理する方法を紹介します。

設定方法

puppeteerを依存パッケージに追加。

yarn add -D puppeteer

spec/rails_helper.rbに設定追加

rails_helper.rb
RSpec.configure do
  # ...

  module_path = Rails.root.join('node_modules/puppeteer')
  chromium_revision = `node -e "process.stdout.write(require('#{module_path}/lib/cjs/puppeteer/revisions').PUPPETEER_REVISIONS.chromium)"`
  chromium_path = `node -e "process.stdout.write(require('puppeteer').createBrowserFetcher().revisionInfo('#{chromium_revision}').executablePath)"`
  chromium_major_version = Webdrivers::ChromeFinder.version.split('.').first
  Webdrivers::Chromedriver.required_version = Webdrivers::Network.get("https://chromedriver.storage.googleapis.com/LATEST_RELEASE_#{chromium_major_version}")
end

解説

上記の設定をすることで、System Specではpuppeteerに含まれるChromiumが使用されるようになります。
puppeteerではバージョン毎にインストールされるChromiumのバージョンが固定されています。
それによって、puppeteerのバージョンを更新しない限りChromiumのバージョンが変わるということも起こり得なくなります。

gemの紹介

プロジェクト毎にこの設定を追加していくのは面倒ですし、puppeteerのAPI変更時の手間も増えるので以下のようなgemも用意してあります。
gemを利用する場合は、gemをインストールしてspec_helper.rbにrequireを1行足すだけで設定完了です。

良かったら使ってみてください。