You need to enable JavaScript to run this app. 为何Capybara调用visit访问root_path时未向浏览器传递服务端端口
优惠活动
大模型
产品
解决方案
定价
更多

为何Capybara调用visit访问root_path时未向浏览器传递服务端端口

问题根因

你遇到的端口缺失问题核心有两个:

  1. Rails 6 系统测试默认会自动将 Capybara.app_host 覆盖为不带端口的 http://127.0.0.1,当你手动指定了不带端口的主机地址时(不管是通过全局app_host还是host!方法),Capybara.always_include_port 配置不会生效,该配置仅在未自定义主机地址、调用visit使用相对路径时才会自动追加端口。
  2. 你之前注释的静态CAPYBARA_APP_HOST定义时机过早,此时Capybara测试服务还未启动,动态端口尚未分配,就算打开注释也拿不到正确的运行时端口。

解决方案

不需要固定服务端口,也不需要手动启动Rails服务,仅修改rails_helper.rb中RSpec的系统测试前置逻辑即可:
保留原有配置不动,仅修改config.prepend_before(:each, type: :system)块内容如下:

config.prepend_before(:each, type: :system) do
  # 运行时动态获取Capybara自动分配的服务地址,直接拼接端口
  Capybara.app_host = "http://#{Capybara.server_host}:#{Capybara.server_port}"
  # 如果你习惯用host!方法,也可以替换为下面这行
  # host! "http://#{Capybara.server_host}:#{Capybara.server_port}"
  driven_by Capybara.javascript_driver
end

验证

修改后直接执行 bundle exec rspec,Capybara会自动启动测试服务,浏览器访问的地址会自动携带分配的端口,HEADLESS开关也可以正常控制是否展示执行过程,无需手动启动Rails服务。
如果修改后仍有问题,检查system/support目录下的自定义配置是否存在覆盖app_host或host的逻辑,删除相关配置即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 01:45:10