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

如何在Rails项目中通过Github Actions运行Selenium测试?

问题根因

你本地执行时所有服务通过docker-compose启动,web、db、browser服务都处于同一个docker自定义网络下,因此browser容器可以正常解析web域名。但在Github Actions工作流中,你没有启动web服务容器,Rails应用直接运行在Github Runner的宿主机上,selenium所在的browser容器自然无法解析不存在的web主机,因此报错。
部分带@javascript标签的场景能正常通过,通常是因为这些场景没有触发浏览器访问后端服务的请求,仅做了前端静态内容渲染,未触发网络请求所以未暴露问题。

解决方案

提供两种可选方案,你可以根据需求选择:

方案一:工作流对齐本地docker-compose运行逻辑(最稳妥,无需修改业务配置)

直接复用本地的docker-compose配置执行测试,避免环境差异导致的问题:

  1. 删除工作流.github/workflows/tests.yml中定义的postgres、browser服务配置
  2. 替换原有测试相关步骤为以下内容:
- name: 启动所有docker服务
  run: docker-compose up -d --build
- name: 初始化测试数据库
  run: docker-compose exec -T web bundle exec rails db:create db:schema:load RAILS_ENV=test
- name: 执行RSpec测试
  run: docker-compose exec -T web bundle exec rspec RAILS_ENV=test
- name: 执行Cucumber测试
  run: docker-compose exec -T web bundle exec cucumber --retry 3 RAILS_ENV=test

注:命令中添加-T参数是为了适配CI环境无伪终端的场景。

方案二:调整配置适配现有工作流结构

修改Capybara配置和工作流配置,适配Github Actions的网络规则:

  1. 修改features/support/env.rb的Capybara配置,新增CI环境判断:
Capybara.register_driver :remote_chrome do |app|
  Capybara::Selenium::Driver.new(app,
                                 browser: :remote,
                                 capabilities: :chrome,
                                 url: 'http://browser:4444/wd/hub')
end

Capybara.configure do |config|
  config.run_server = true
  config.javascript_driver = :remote_chrome
  if ENV['CI']
    # CI环境下selenium容器通过host.docker.internal访问宿主机上的Rails服务
    config.app_host = 'http://host.docker.internal:3001'
    config.server_host = '0.0.0.0' #  Rails服务监听所有地址,允许容器访问
  else
    # 本地docker-compose环境配置
    config.app_host = 'http://web:3001'
    config.server_host = 'web'
  end
  config.server_port = '3001'
  config.always_include_port = true
  config.default_max_wait_time = 4
end
  1. 修改工作流中的browser服务配置,添加host映射:
browser:
  image: selenium/standalone-chrome-debug
  ports:
    - "5900:5900" #for VNC access
    - "4444:4444" #for webdriver access
  options: --add-host=host.docker.internal:host-gateway
  1. 执行Cucumber测试的步骤中新增CI环境变量:
- name: Run scenarios
  run: |
    bundler exec cucumber --retry 3
  env:
    RAILS_ENV: test
    POSTGRES_HOST: localhost
    POSTGRES_PORT: ${{ job.services.postgres.ports[5432] }} 
    CI: true

内容的提问来源于stack exchange,提问作者Aleksandar Jeftic

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 06:36:05