TL;DR
- Railsアプリケーション作成時にデフォルトで入っている
gem 'webdrivers'
をGemfile から削除することで解決した - webrdrivers が読み込まれると、Docker環境ではなくローカル(=ホスト)側にブラウザを探しにいってしまうらしい
関連記事
状況
VSCode Remote Containerを利用し、Docker環境でRailsのWebアプリケーションを開発しています。
RSpecのSystem Specをchromeのヘッドレスブラウザで実行しようとした際に、下記のエラーが発生しました。
spec/sample_spec.rb
:
# frozen_string_literal: true require 'rails_helper' RSpec.describe 'Welcome pages' do it 'LPのリンクから利用規約へ遷移する' do visit root_path click_link '利用規約' expect(page).to have_selector 'h1', text: '利用規約' end end
spec/support/capybara.rb
:
# frozen_string_literal: true RSpec.configure do |config| config.before(:each, type: :system) do driven_by :selenium, using: :headless_chrome, options: { browser: :remote, url: ENV.fetch('SELENIUM_DRIVER_URL') } Capybara.server_host = 'app' end end
bundle exec rspec
の実行結果:
Failure/Error: driven_by :selenium, using: :headless_chrome, options: { browser: :remote, url: ENV.fetch('SELENIUM_DRIVER_URL'), } Webdrivers::BrowserNotFound: Failed to determine Chrome binary location.
Gemfile.lock
のバージョン情報:
docker-compose.yml
:
version: '3' services: app: build: context: .. dockerfile: .devcontainer/Dockerfile volumes: - ../..:/workspaces:cached networks: ktg-net: environment: - SELENIUM_DRIVER_URL=http://selenium_chrome:4444/wd/hub selenium_chrome: image: selenium/standalone-chrome-debug networks: ktg-net: db: image: postgres:15.1 # restart: unless-stopped volumes: - postgres-data:/var/lib/postgresql/data - ./create-db-user.sql:/docker-entrypoint-initdb.d/create-db-user.sql environment: POSTGRES_USER: postgres POSTGRES_DB: postgres POSTGRES_PASSWORD: postgres networks: ktg-net: networks: ktg-net: volumes: postgres-data:
解決方法
rails new
でアプリを作成した段階のデフォルトで入っている gem 'webdrivers'
をGemfile から削除することで解決しました。
webrdrivers が読み込まれると、Docker環境ではなくローカル(=ホスト)側にドライバーを探しにいってしまうらしく、ローカル側ではドライバーが見つからないため、Webdrivers::BrowserNotFound
が発生していたようです。
Gemfile
:
# test以前は省略 group :test do gem 'capybara' gem 'launchy' gem 'selenium-webdriver' # gem 'webdrivers' ← これを削除する end