Gitlab跨容器用远程URL运行Capybara测试遇超时问题
解决GitLab CI中独立Selenium容器执行Capybara测试的Net::ReadTimeout问题
一、先确认GitLab CI容器网络连通性
GitLab CI里,作业容器和服务容器通过服务别名互通,首先要确保CI配置正确声明Selenium服务,且主容器能访问它:
test: stage: test services: - name: selenium/standalone-chrome:latest alias: selenium # 这个别名是后续访问Selenium的关键域名 script: # 先测试连通性,确保能ping通Selenium服务 - ping -c 3 selenium # 再执行测试 - bundle exec rspec
二、修正Capybara核心配置
1. 让Capybara服务对外可访问
Capybara默认绑定127.0.0.1,导致Selenium容器无法访问主容器里的测试服务,必须修改绑定地址:
# 在spec_helper.rb/rails_helper.rb中配置 Capybara.server_host = '0.0.0.0' # 绑定到所有网卡 Capybara.server_port = 3000 # 可选,固定端口方便调试 # 动态获取主容器IP,让Selenium能访问到Capybara服务 server_ip = `hostname -i`.strip Capybara.app_host = "http://#{server_ip}:#{Capybara.server_port}"
2. 配置远程Selenium驱动
确保Capybara连接到独立的Selenium容器,而不是本地Chrome:
Capybara.register_driver :selenium_chrome_remote do |app| chrome_options = Selenium::WebDriver::Chrome::Options.new chrome_options.add_argument('no-sandbox') chrome_options.add_argument('headless=new') # 新版无头模式 chrome_options.add_argument('disable-gpu') chrome_options.add_argument('window-size=1920,1080') Capybara::Selenium::Driver.new( app, browser: :remote, url: 'http://selenium:4444/wd/hub', # 对应CI服务的别名和Selenium默认端口 options: chrome_options ) end Capybara.default_driver = :selenium_chrome_remote Capybara.javascript_driver = :selenium_chrome_remote
三、正确设置超时参数
之前的超时设置可能没生效,需同时调整Capybara和Selenium的超时:
# Capybara元素等待超时 Capybara.default_max_wait_time = 30 # Selenium客户端连接超时 Selenium::WebDriver::Remote::Http.default_timeout = 60 # 单位:秒
也可以通过CI环境变量直接设置:
script: - export CAPYBARA_DEFAULT_MAX_WAIT_TIME=30 - export SELENIUM_REMOTE_URL=http://selenium:4444/wd/hub - bundle exec rspec
四、排查Selenium容器状态
如果以上配置都无效,检查Selenium容器是否正常启动:
script: # 检查Selenium服务状态接口 - curl http://selenium:4444/status - bundle exec rspec
如果curl返回错误,尝试更换稳定版本的Selenium镜像(比如selenium/standalone-chrome:114.0),避免最新镜像的兼容性问题。
五、额外注意事项
- 测试代码中不要硬编码
localhost或127.0.0.1,全部使用Capybara的visit方法跳转。 - 必须开启
no-sandbox参数,因为GitLab CI容器通常以root用户运行,Chrome沙箱会触发权限错误。 - 确保Capybara配置加载在全局配置文件(如
spec_helper.rb),而非单个测试文件。
内容的提问来源于stack exchange,提问作者r3b00t
相关产品推荐
相关产品推荐

