Edited at

Capybara で起動する chromedriver の Headless モードを環境変数で切り替える


はじめに

Rails で Web アプリケーションを開発していると、Capybara で E2E テストをする事があると思います。

その中で、通常は Headless モードの Chrome を使い、デバッグなどをするときはフォアグラウンドでブラウザを起動して挙動を確認できるように、というふうに切り替えて使えたらいいなと思っており、調べたことをまとめます。


動作確認環境


  • rails 6.0.0

  • Capybara 3.29.0

  • selenium-webdriver 3.142.4

  • rspec-core 3.8.2

  • ruby 2.5.5

  • Rails アプリケーション作成済み

  • RSpec 設定済み


tl;dr

このような Capybara Driver Setting にしました。以下にサンプルを載せます。

Capybara.register_driver :chrome do |app|

args = %w(disable-gpu mute-audio window-size=1280,800 lang=ja)
args << 'headless' unless ENV['NO_HEADLESS']

Capybara::Selenium::Driver.new(
app,
browser: :chrome,
desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome(
chrome_options: {
args: args,
w3c: false
}
)
)
end

Capybara.default_driver = :chrome

環境変数 NO_HEADLESS の有無で、chromedriver に付与するオプションのうち、Headless モードを制御する headless オプションを付け替える形にしました。

なお、chrome 75 からw3c: false を追加しないと、付与したオプションが有効にならないようです。(参考


使い方


ファイル読み込み設定修正

まず spec/rails_helper.rb の、以下記述のコメントアウトを解除します。

これで、spec/support/xx.rb のファイルも rails_helper の処理の中で読み込んでくれます。


spec/rails_helper.rb

# コメントアウトを解除

Dir[Rails.root.join('spec', 'support', '**', '*.rb')].each { |f| require f }


ファイル作成

spec/support/capybara.rb というようなファイルを作成し、上記の Capybara 設定を記述します。


コマンド実行

利用するときは、以下のような形で利用します。

# Headless モードで実行する

$ bundle exec rspec spec/features/xx_spec.rb

# ブラウザを起動して実行する
$ NO_HEADLESS=1 bundle exec rspec spec/features/xx_spec.rb


おわりに

何気なく Capybara を使っていたのですが、設定ファイルを読み込むのは勉強になりました。Capybara に限らずドキュメントやソースコードを読んでいこうと思います。


参考