ぺのめも

Web開発を勉強中。学んだことや思ったことなど

Docker + Rails 7 + RSpec で Webdrivers::BrowserNotFound のエラー

TL;DR

  • Railsアプリケーション作成時にデフォルトで入っている gem 'webdrivers'をGemfile から削除することで解決した
  • webrdrivers が読み込まれると、Docker環境ではなくローカル(=ホスト)側にブラウザを探しにいってしまうらしい

関連記事

peno022.hatenablog.com

状況

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

参考

github.com