如何在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配置执行测试,避免环境差异导致的问题:
- 删除工作流
.github/workflows/tests.yml中定义的postgres、browser服务配置 - 替换原有测试相关步骤为以下内容:
- 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的网络规则:
- 修改
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
- 修改工作流中的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
- 执行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
相关产品推荐
相关产品推荐

