Cuprite の driven_by と register_driver の違い

※この記事はClaudeCodeを利用して実装した際にハマったことを、ClaudeCodeにブログ記事を書いてもらっています。

問題

spec/support/capybara.rbCapybara.register_driver を使って Cuprite の設定を行っても、実際のテスト実行時に設定が反映されないこ とがありました。

# spec/support/capybara.rb
Capybara.register_driver(:cuprite) do |app|
  Capybara::Cuprite::Driver.new(
    app,
    browser_path: '/usr/bin/chromium',
    process_timeout: 120,
    timeout: 120
  )
end

しかし、テストを実行すると ProcessTimeoutError: Browser did not produce websocket url within 10 seconds というエラーが発生しました 。設定した 120 秒ではなく、デフォルトの 10 秒でタイムアウトしていたのです。

原因

rails_helper.rbdriven_by(:cuprite) を呼び出すと、Capybara.register_driver で定義したドライバーの設定が無視され、デフォルト 設定が使用されることがあります。

解決方法

driven_by メソッドに直接オプションを渡すことで、確実に設定を反映させることができます。

# spec/rails_helper.rb
RSpec.configure do |config|
  config.before(:each, type: :system) do
    driven_by(:cuprite, options: {
      browser_path: '/usr/bin/chromium',
      headless: true,
      browser_options: {
        'no-sandbox': nil,
        'disable-gpu': nil,
        'disable-dev-shm-usage': nil
      },
      process_timeout: 120,
      timeout: 120
    })
  end
end

教訓

  • Capybara.register_driverdriven_by は独立した設定メカニズム
  • driven_by に直接オプションを渡す方が確実
  • タイムアウト値がデフォルトのままの場合は、設定が反映されていない可能性を疑う