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
相关产品推荐
相关产品推荐

