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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 08:13:23