🍣
Cucumberからwebdriversのgemを使ってブラウザテストを実行する
chromedriver-helper が deprecated になって久しいので、いい加減 webdrivers に切り替えてみる。
RSpec の SystemSpec から webdrivers を使う例はよくみるけど、
cucumber から使う例は自分で探した限りあまり無かったので改めて書き留めておくなど。
前提
- CentOS 7 で実験した手順です
- Ruby 2.6.4 を使用します
手順
-
依存ライブラリをインストールしておく
もしインストールされていない場合はgoogle chromeとIPAフォントをインストールします
sudo tee /etc/yum.repos.d/google-chrome.repo <<'EOS' [google-chrome] name=google-chrome baseurl=http://dl.google.com/linux/chrome/rpm/stable/$basearch enabled=1 gpgcheck=1 gpgkey=https://dl-ssl.google.com/linux/linux_signing_key.pub EOS sudo yum install -y google-chrome-stable ipa-*-fonts
-
Gemfileに
webdrivers
を追加しますGemfile# ----- 前略 ----- gem 'webdrivers' gem 'cucumber' # Railsプロジェクトの場合は 'cucumber-rails' を使用する gem 'capybara' # ----- 後略 -----
-
selenium-webdriver
やchromedriver-helper
はもう記述する必要はありません(selenium-webdriver
はwebdrivers
によってインストールされます)
-
-
bundle install
を実行する -
env.rb
に設定を記述するfeatures/support/env.rbrequire 'capybara/cucumber' require 'webdrivers' Capybara.configure do |config| config.default_driver = :selenium_chrome_headless config.javascript_driver = :selenium_chrome_headless # Rails以外のアプリを試験する場合や、環境も含めたE2Eテストを実施する場合、下記の2行指定する必要がある # (直接Railsアプリを試験する場合は下記の2行は不要) config.app = nil config.run_server = false end
-
env.rb
を汚したくない場合はfeatures/support/webdrivers.rb
等のファイル名で作成してください -
:selenium_chrome_headless
は capybara が準備しているドライバの1つ(https://github.com/teamcapybara/capybara/blob/3.29.0/lib/capybara/registrations/drivers.rb#L27-L36 )です。まだ更新される余地がありそうなので、自前でCapybara.register_driver
はせずにこのまま活用します
-
以上でインストールと設定は完了です。
stepやfeatureはこれまで通り使えますが、CapybaraやWebDriverに直接オプションを指定している場合は動かないケースもありますので、その場合はオプションの指定を外してください。
おまけ1:画面サイズの変更
ブラウザの画面サイズを変更する場合、SystemSpecでは driver_for
のオプションでscreen_size
を渡したり、Capybara.register_driver
でオプションを指定して設定する場合もあります。
ただしこの場合、cucumberでは画面サイズ毎にoptionを指定したドライバを Capybara.register_driver
し、step内でcurrent_driver
を差し替えながら試験を進めないといけなくなります。
それよりは下記の方がLGTM(Looks Good to Me)です。
stepファイル
When("ブラウザのウィンドウを {int}px × {int}px にリサイズする") do |width, height|
page.driver.browser.manage.window.resize_to(width, height)
end
featureファイル
シナリオ: WebDrivers経由で画面表示をしスクリーンショットを撮る
もし "https://google.com"を表示する
かつ ブラウザのウィンドウを 1000px × 600px にリサイズする
# 後略
おまけ2:スクリーンショットを撮る
webdrivers経由でChromeを呼び出しても、これまで通りスクリーンショットは撮ることができます
stepファイル
Then("スクリーンショットを撮って{string}に保存する") do |file_path|
page.save_screenshot "tmp/#{file_path}"
end
featureファイル
* スクリーンショットを撮って"screen_shot.png"に保存する
参考
これらのファイルはここで公開しています。参考になれば。
Discussion