Rails 5系统测试无法后台运行(Capybara+Selenium+Chrome)求助
我太懂这种测试跑起来,Chrome窗口反复跳出来抢焦点,根本没法正常干活的烦躁了!结合你用的gem版本(rails 5.2.0、capybara 3.0.3、selenium-webdriver 3.12.0、chromedriver-helper 1.2.0),给你几个亲测有效的解决方案:
方案一:把Chrome窗口移到“看不见的地方”
最简单的方法就是让Chrome窗口在屏幕外运行,这样它就不会抢你的焦点了。你只需要在Capybara的配置文件里(比如spec/support/capybara.rb或者test/application_system_test_case.rb)添加驱动配置:
Capybara.register_driver :chrome do |app| options = Selenium::WebDriver::Chrome::Options.new # 把窗口定位到屏幕左上角外,彻底看不到也不会抢焦点 options.add_argument('--window-position=-10000,-10000') # 如果你偏好最小化窗口,也可以换成下面这行 # options.add_argument('--start-minimized') Capybara::Selenium::Driver.new(app, browser: :chrome, options: options) end # 设置默认驱动为我们配置好的chrome Capybara.default_driver = :chrome Capybara.javascript_driver = :chrome
保存配置后再跑测试,应该就不会被窗口打扰了。
方案二:启用Chrome无头模式
如果连窗口都不想看到,直接用无头模式跑测试是更彻底的选择。同样在驱动配置里添加--headless参数:
Capybara.register_driver :chrome_headless do |app| options = Selenium::WebDriver::Chrome::Options.new options.add_argument('--headless') options.add_argument('--disable-gpu') # 某些环境下需要这个参数兼容 options.add_argument('--window-size=1280,720') # 模拟正常窗口尺寸,避免页面布局问题 Capybara::Selenium::Driver.new(app, browser: :chrome, options: options) end Capybara.javascript_driver = :chrome_headless
这样测试会在后台静默运行,完全不会影响你当前的工作。
方案三:检查Chrome与Chromedriver版本兼容性
你提到之前没出现这个问题,很可能是Chrome自动更新后,和你用的chromedriver版本不匹配导致的异常行为。chromedriver-helper会自动匹配chromedriver版本,但偶尔也会出问题。你可以手动确认一下:
- 打开Chrome,查看版本(设置→关于Chrome)
- 运行
chromedriver --version,看版本是否和Chrome对应(一般要求主版本号一致)
如果版本不匹配,可以尝试更新chromedriver-helper,或者换成更稳定的webdriver-manager gem(替换掉chromedriver-helper的依赖后调整配置即可)。
方案四:用虚拟显示(适合Linux/macOS)
如果上面的方法都不行,可以试试用虚拟X服务器运行Chrome,比如Linux上的xvfb,或者macOS上的XQuartz:
- Linux:安装
xvfb,然后用xvfb-run bundle exec rspec命令启动测试 - macOS:先安装XQuartz,然后在终端里设置
export DISPLAY=:0,再运行测试
这样Chrome会在虚拟显示中运行,不会干扰你的真实桌面。
内容的提问来源于stack exchange,提问作者wmakley

