Rails 5.1(升级自Rails4)应用Capybara+Selenium系统测试搭建问题
刚从Rails4升级到5.1还折腾系统测试的坑我太懂了!结合你说的配置都弄了但page对象出问题,咱们一步步来排查修复:
先揪出系统测试的核心继承问题
Rails 5.1开始系统测试有专门的基类ApplicationSystemTestCase,如果你的测试类没正确继承它,Capybara根本不会自动初始化page对象!举个正确的例子:
# test/system/posts_test.rb(Minitest风格) require "application_system_test_case" class PostsTest < ApplicationSystemTestCase test "visiting the index" do visit posts_url assert_selector "h1", text: "Posts" end end
要是你用RSpec写系统测试,得确保标记了type: :system,并且引入Capybara的DSL:
# spec/system/posts_spec.rb(RSpec风格) require 'rails_helper' RSpec.describe "Posts", type: :system do it "visits the index" do visit posts_url expect(page).to have_selector("h1", text: "Posts") end end
之前如果继承的是旧的ActionDispatch::IntegrationTest或者普通的ActiveSupport::TestCase,那page对象肯定不会凭空出现。
再核对rails_helper.rb的关键配置
虽然你说配置过,但还是要确认这几个容易漏的点:
- 确保Capybara的驱动设置正确,系统测试默认用Selenium,在
rails_helper.rb里加上:
Capybara.default_driver = :selenium_chrome_headless # 本地调试可以换成:selenium Capybara.javascript_driver = :selenium_chrome_headless
- 确认Capybara的Rails和RSpec集成代码已经引入:
require 'capybara/rails' require 'capybara/rspec'
- 用RSpec的话,要在配置块里给系统测试类挂上Capybara的DSL:
RSpec.configure do |config| config.include Capybara::DSL, type: :system config.include Capybara::RSpecMatchers, type: :system end
修复旧功能测试的冲突问题
原来的功能测试(一般在spec/features)也出问题,大概率是和系统测试的配置冲突了:
- 旧功能测试要明确标记
type: :feature,确保Capybara的DSL正确注入:
# spec/features/posts_feature_spec.rb RSpec.feature "Posts", type: :feature do scenario "loads the index page" do visit posts_path expect(page).to have_content("Posts") end end
- 检查
config/environments/test.rb里的这两个配置,它们会影响Capybara的页面加载:
config.action_dispatch.show_exceptions = false config.action_controller.perform_caching = false
快速调试的小技巧
要是还是摸不准问题出在哪,在测试代码里加两行调试输出:
puts "Page对象是否存在?#{defined?(page)}" puts "当前Capybara驱动:#{Capybara.current_driver}"
如果输出Page对象是否存在?nil,那100%是Capybara的DSL没被正确引入到测试类里——要么是继承错了基类,要么是RSpec的type标记没加对。
另外别忘了核对Gem版本兼容性:Rails 5.1要求Capybara至少2.18版本,Selenium驱动要和你本地的浏览器版本匹配(比如Chrome驱动得对应Chrome的版本),驱动不兼容也会导致session创建失败,间接让page对象无法生成。
内容的提问来源于stack exchange,提问作者Voxorin
相关产品推荐
相关产品推荐

