You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails 6.1中使用Selenium与Capybara测试Active Admin页面报错求助

问题解决:Active Admin页面测试的Selenium驱动初始化错误

环境信息

Gemfile

gem 'webdrivers'
gem 'capybara'
gem 'selenium-webdriver'

rails_helper配置

require 'capybara/rspec'
require 'webdrivers'

Capybara.register_driver :selenium_chrome_headless do |app|
  options = ::Selenium::WebDriver::Options.new
  options.add_argument('--headless')
  options.add_argument('--disable-gpu')
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-dev-shm-usage')
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

Capybara.default_driver = :selenium_chrome_headless
RSpec.configure do |config|  
  config.include Devise::Test::IntegrationHelpers, type: :request
end

测试代码

require 'rails_helper'

RSpec.describe 'Admin TermsAndConditions Management', type: :feature do
  let!(:admin_user) { create(:admin_user) }
  let!(:terms_and_condition) { create(:terms_and_condition, description: 'Initial Terms and Conditions') }

  before do
    login_as(admin_user, scope: :admin_user)
  end

  describe 'Index page' do
    it 'displays the list of terms and conditions' do
      visit admin_terms_and_conditions_path
      expect(page).to have_content('Initial Terms and Conditions')
    end
  end

  describe 'Creating a new TermsAndCondition' do
    it 'creates a new terms and condition' do
      visit new_admin_terms_and_condition_path

      fill_in 'Description', with: 'New Terms and Conditions'
      click_button 'Create Terms and conditions'

      expect(page).to have_content('Terms and condition was successfully created.')
      expect(page).to have_content('New Terms and Conditions')
    end
  end

  describe 'Editing a TermsAndCondition' do
    it 'edits an existing terms and condition' do
      visit edit_admin_terms_and_condition_path(terms_and_condition)

      fill_in 'Description', with: 'Updated Terms and Conditions'
      click_button 'Update Terms and conditions'

      expect(page).to have_content('Terms and condition was successfully updated.')
      expect(page).to have_content('Updated Terms and Conditions')
    end
  end

  describe 'Deleting a TermsAndCondition' do
    it 'deletes an existing terms and condition' do
      visit admin_terms_and_conditions_path

      within("tr", text: terms_and_condition.description) do
        click_link 'Delete'
      end

      expect(page).to have_content('Terms and condition was successfully destroyed.')
      expect(page).not_to have_content(terms_and_condition.description)
    end
  end
end

报错信息

1) Admin TermsAndConditions Management Index page displays the list of terms and conditions
     Failure/Error: options = ::Selenium::WebDriver::Options.new
     
     ArgumentError:
       wrong number of arguments (given 0, expected 1)
     # ./spec/rails_helper.rb:19:in `new'
     # ./spec/rails_helper.rb:19:in `block in <top (required)>'
     # ./spec/features/admin/terms_and_conditions_spec.rb:13:in `block (3 levels) in <top (required)>'

  2) Admin TermsAndConditions Management Creating a new TermsAndCondition creates a new terms and condition
     Failure/Error: options = ::Selenium::WebDriver::Options.new
     
     ArgumentError:
       wrong number of arguments (given 0, expected 1)
     # ./spec/rails_helper.rb:19:in `new'
     # ./spec/rails_helper.rb:19:in `block in <top (required)>'
     # ./spec/features/admin/terms_and_conditions_spec.rb:20:in `block (3 levels) in <top (required)>'

  3) Admin TermsAndConditions Management Editing a TermsAndCondition edits an existing terms and condition
     Failure/Error: options = ::Selenium::WebDriver::Options.new
     
     ArgumentError:
       wrong number of arguments (given 0, expected 1)
     # ./spec/rails_helper.rb:19:in `new'
     # ./spec/rails_helper.rb:19:in `block in <top (required)>'
     # ./spec/features/admin/terms_and_conditions_spec.rb:32:in `block (3 levels) in <top (required)>'

  4) Admin TermsAndConditions Management Deleting a TermsAndCondition deletes an existing terms and condition
     Failure/Error: options = ::Selenium::WebDriver::Options.new
     
     ArgumentError:
       wrong number of arguments (given 0, expected 1)
     # ./spec/rails_helper.rb:19:in `new'
     # ./spec/rails_helper.rb:19:in `block in <top (required)>'
     # ./spec/features/admin/terms_and_conditions_spec.rb:44:in `block (3 levels) in <top (required)>'

解决方案

1. 修正Selenium Options初始化代码

报错根源是适配Ruby2.6的旧版selenium-webdriver中,Selenium::WebDriver::Options.new必须传入浏览器类型参数,或直接使用对应浏览器的Options子类。将rails_helper中的驱动注册代码修改为以下两种方式之一:

方式一:使用Chrome专属Options类

Capybara.register_driver :selenium_chrome_headless do |app|
  options = ::Selenium::WebDriver::Chrome::Options.new
  options.add_argument('--headless')
  options.add_argument('--disable-gpu')
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-dev-shm-usage')
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

方式二:给Options.new传入浏览器参数

Capybara.register_driver :selenium_chrome_headless do |app|
  options = ::Selenium::WebDriver::Options.new(:chrome)
  options.add_argument('--headless')
  options.add_argument('--disable-gpu')
  options.add_argument('--no-sandbox')
  options.add_argument('--disable-dev-shm-usage')
  Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
end

2. 修正Devise测试助手的作用范围

当前测试类型为:feature,但配置中把Devise::Test::IntegrationHelpers关联到了:request类型,会导致login_as方法无法在feature测试中正常生效。修改RSpec配置:

RSpec.configure do |config|  
  config.include Devise::Test::IntegrationHelpers, type: :feature
end

3. 可选:锁定selenium-webdriver版本(避免兼容问题)

在Gemfile中锁定适配Ruby2.6和Rails6.1的selenium版本:

gem 'selenium-webdriver', '~> 3.142.7'

执行bundle install更新依赖。

测试验证

修改完成后运行测试命令:

bundle exec rspec spec/features/admin/terms_and_conditions_spec.rb

即可正常启动Chrome无头浏览器,执行Active Admin页面的测试流程。

内容的提问来源于stack exchange,提问作者Rodrigo Almeida

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 16:23:13