
RSpec 実行時に以下のエラーが発生しました:
Rails + Selenium + Capybara を使用して system spec を実行中に、以下の2つのエラーに遭遇しました
-
ChromeDriver のバージョン不一致による
SessionNotCreatedError
-
net::ERR_NAME_NOT_RESOLVED
による DNS 解決エラー
今回はこの2つの事象における対処法について記載していきます。
1. ChromeDriver のバージョン不一致エラー
先に結論を述べると以下の対応を行うことで解決しました。
-
Chrome のバージョンに合った ChromeDriver を使う
-
/etc/hosts
にカスタムドメインをマッピングする
それぞれを対応について順を追って見ていきましょう。
ChromeDriver バージョン不一致エラー
systemSpecを実行した際に最初に遭遇したエラーは以下です。
Selenium::WebDriver::Error::SessionNotCreatedError:
session not created: This version of ChromeDriver only supports Chrome version 134
Current browser version is 136.0.7103.114
エラーメッセージに記載されている通りなのですが、Google Chrome のバージョンが 136 であるのに対し、インストールされていた ChromeDriver のバージョンが 134 だったため、バージョンの不一致が原因でセッションの作成に失敗していました。
解決方法
まずはChrome のバージョンに対応した ChromeDriver を以下の公式ページからダウンロードします。
Chrome for Testing - Google
ダウンロードした chromedriver を適切なパスに配置します。
# whichコマンドでchromedriverのインストールパスを確認
$ which chromedriver
# 必要に応じて現在のバージョンのバックアップを取っておく
$ /opt/homebrew/bin/chromedriver-134
# ダウンロードしたファイルをchromvedriverのインストールパスに上書き
$ mv ~/Downloads/chromedriver-mac-arm64/chromedriver /opt/homebrew/bin/chromedriver
バージョンを確認して、正しく更新されたことを確認しましょう。
$ chromedriver --version
期待通り ChromeDriver 136.x.x.x が表示されれば OK です。
参考までにcapybaraの設定例を以下に記載しておきますので、必要に応じて参照してください。
Capybara設定例
Capybara.asset_host = 'http://myapp.test'
Capybara.default_host = 'http://myapp.test'
Capybara.app_host = 'http://myapp.test'
Capybara.always_include_port = true
Capybara.register_driver :selenium_chrome_headless do |app|
browser_options = Selenium::WebDriver::Chrome::Options.new
browser_options.add_argument('--headless')
browser_options.add_argument('--disable-site-isolation-trials')
browser_options.add_argument('--window-size=1680,1050')
browser_options.add_argument('--lang=ja')
browser_options.add_preference(:download, {
prompt_for_download: false,
default_directory: CapybaraDownloadsHelper.path
})
Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)
end
Capybara.javascript_driver = :selenium_chrome_headless
net::ERR_NAME_NOT_RESOLVED エラー
続いて遭遇したエラーは以下になります。
unknown error: net::ERR_NAME_NOT_RESOLVED
(Session info: chrome=136.0.7103.114)
このエラーの原因としては、Capybara の app_host に設定していたカスタムドメイン(例:http://myapp.test)が、ローカル環境で解決できなかったため、DNS 解決エラーが発生していたことによるものです。
解決方法
macOS の
/etc/hosts に以下のエントリを追加することで解決しました。
127.0.0.1 myapp.test
この変更を行なったのち、再度systemSpecを実行するとエラーは解消されていました。
場合によっては同じエラーが出続けることがあるかもしれません。その場合は以下のDNSキャッシュクリアも合わせて実行してみましょう。
$ sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
ブラウザの DNS キャッシュもクリアします。
Chrome の場合、アドレスバーに chrome://net-internals/#dns を入力し、「Clear host cache」をクリックしましょう。
おわりに
Capybara を使用したテスト環境でカスタムドメインを利用する際は、ChromeDriver のバージョン管理とDNS 解決の設定が重要です。同様のエラーに直面した際の参考になれば幸いです。