Docker环境下Rails+Capybara连接Selenium Chrome失败求助
问题解决:Docker Compose下Capybara连接Selenium Chrome失败
核心问题分析
报错net::ERR_CONNECTION_REFUSED的本质是:Selenium Chrome容器内的浏览器无法访问Rails应用容器的服务。你设置的Capybara.app_host = "http://#{@company.subdomain}.lvh.me:5000"在Docker内部网络中无效——lvh.me指向宿主机,Chrome容器无法通过该地址访问Rails容器;同时Capybara配置存在多处冲突。
分步修复
1. 修正Docker网络与应用访问地址
Docker内部容器通过服务名互相访问,需调整app_host为Docker内部可识别的地址,同时处理子域名限制:
- 在测试的
setup方法中,将app_host改为http://#{@company.subdomain}.web:5000(web是你docker-compose.yml中定义的Rails服务名) - 在
config/environments/test.rb中添加域名白名单,允许子域名访问:
config.hosts << /.*\.web/
2. 修复Capybara配置冲突
test_helper.rb存在3处关键错误,修正后关键代码如下:
class ActionDispatch::IntegrationTest include Capybara::DSL include Capybara::Minitest::Assertions config.include Rails.application.routes.url_helpers Capybara.default_max_wait_time = 10 Capybara.run_server = true # 改为true,让Capybara启动测试服务器 Capybara.default_driver = :selenium_chrome_in_container Capybara.javascript_driver = :selenium_chrome_in_container # 匹配注册的容器专用驱动 Capybara.always_include_port = true Capybara.server_host = "0.0.0.0" # 让服务器监听所有接口,允许容器间访问 Capybara.server_port = 5000 # 保留原有驱动注册代码... end
- 移除测试
setup中重复设置的server_host和server_port,统一在test_helper.rb配置。
3. 优化Selenium Chrome容器配置(可选)
在docker-compose.yml的selenium_chrome服务中添加环境变量,确保ChromeDriver允许任意IP连接:
selenium_chrome: image: selenium/standalone-chrome privileged: true ports: - "5900:5900" - "4444:4444" - "7900:7900" environment: - SE_NODE_MAX_SESSIONS=10 - SE_NODE_OVERRIDE_MAX_SESSIONS=true - SE_CHROME_DRIVER_ARGS=--allowed-ips=*
4. 调整测试代码
修正hello_world_capybara_test.rb的setup部分:
setup do @company = create(:company) @mailing = create(:user) # 使用Docker内部服务名+子域名 Capybara.app_host = "http://#{@company.subdomain}.web:5000" end
验证步骤
- 重启所有Docker容器:
docker-compose down && docker-compose up --build - 在web容器内执行测试:
bundle exec rake test
内容的提问来源于stack exchange,提问作者valcod3r
相关产品推荐
相关产品推荐

