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

Capybara测试启用js:true后,用户重定向为何自动登出?

解决JS测试中Devise会话丢失的问题

以下是针对启用js: true后登录会话丢失问题的几种解决方案:

1. 直接使用Devise测试Helper(最可靠)

绕过UI登录流程,直接通过Devise的测试助手设置用户会话,避免浏览器Cookie相关问题:

  • 首先在spec/support/devise.rb中添加配置:
RSpec.configure do |config|
  config.include Devise::Test::IntegrationHelpers, type: :feature
end
  • 修改你的sign_in辅助方法:
def sign_in(user)
  sign_in user # 直接调用Devise内置的登录助手
end

2. 优化UI登录的等待逻辑

JS测试中页面加载是异步的,需要确保登录操作完成后再执行后续步骤:

def sign_in(user)
  visit new_user_session_path
  within 'form#new_user' do
    fill_in 'Email', with: user.email
    fill_in 'Password', with: user.password
    click_on 'Log in'
  end
  # 等待登录成功的标记出现(比如用户邮箱、退出按钮)
  expect(page).to have_content(user.email)
end

3. 调整测试环境的Cookie设置

检查config/environments/test.rb中的Session配置,确保Cookie的SameSite属性适配Chrome浏览器:

Rails.application.config.session_store :cookie_store, 
  key: '_your_app_session', 
  same_site: :lax,
  secure: false # 测试环境不需要HTTPS,设为false

4. 固定Capybara服务器端口

避免每次测试随机端口导致Cookie域名不匹配:
在spec/rails_helper.rb或spec/spec_helper.rb中添加:

Capybara.server_port = 3001

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 20:40:35