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

如何持久化Capybara Session完成含2FA验证的端到端测试

Capybara会话丢失及2FA流程失败解决方案

问题根因

你遇到的2FA跳转问题大概率是两类原因:

  1. Capybara默认异步执行,enter_password_and_email执行完后页面还未完成2FA页跳转,就已经触发了OTP填写逻辑,导致操作的仍是登录页,最终请求校验失败跳转
  2. 测试配置启用了自动会话重置,或是驱动(如RackTest)跨域/配置不当导致Cookie未正确存储

同一测试用例内2FA流程修复

首先确保两个方法在同一个测试块内执行,且增加页面加载等待校验,避免异步问题:

it "完成2FA登录并测试后续功能" do
  enter_password_and_email("test@example.com", "your_password")
  # 强制等待2FA页加载完成,避免异步操作提前执行
  expect(page).to have_current_path("/otp")
  expect(page).to have_content("请输入两步验证代码")

  enter_two_factor_auth_code
  expect(page).to have_content("登录成功")
  # 后续功能测试逻辑
end

如果确认是Cookie丢失,可手动提取、注入Cookie保留会话:

  • Selenium类JS驱动用法:
# 输入账号密码跳转至2FA页后,提取当前Cookie
saved_cookies = Capybara.current_session.driver.browser.manage.all_cookies

# 执行下一步操作前重新注入Cookie
saved_cookies.each do |cookie|
  Capybara.current_session.driver.browser.manage.add_cookie(cookie)
end
  • RackTest驱动用法:
# 提取会话Cookie值
session_cookie = Capybara.current_session.driver.request.cookies["your_app_session_key"]
# 手动设置Cookie
page.driver.browser.set_cookie("your_app_session_key=#{session_cookie}; path=/")

跨多个测试用例复用登录会话

如果需要在多个测试用例之间共享登录状态,避免重复执行登录+2FA流程,可修改测试配置关闭自动会话重置,全局复用Cookie:

  1. 首先修改测试配置文件(如spec_helper.rb):
RSpec.configure do |config|
  # 针对系统测试关闭默认的自动会话重置
  config.before(:each, type: :system) do
    driven_by :selenium_chrome_headless # 替换为你使用的驱动
    # 注释掉默认的reset_session!调用即可
  end
end
  1. 新增全局登录前置逻辑,仅执行一次登录流程:
# 所有测试执行前仅跑一次登录+2FA流程,存储Cookie
before(:all) do
  enter_password_and_email("test@example.com", "your_password")
  expect(page).to have_current_path("/otp")
  enter_two_factor_auth_code
  @@shared_login_cookies = Capybara.current_session.driver.browser.manage.all_cookies
end

# 每个测试用例执行前都注入已登录的Cookie
before(:each) do
  @@shared_login_cookies.each do |cookie|
    Capybara.current_session.driver.browser.manage.add_cookie(cookie)
  end
  # 跳转到目标测试页即可直接使用已登录状态
  visit "/your_target_page"
end

注意事项

  • 若测试环境站点配置了HTTPS,需确保Cookie的Secure属性和测试环境匹配,否则浏览器会拒绝存储Cookie
  • 不要在页面跳转未完成时调用Cookie查询方法,此时请求还未响应,会出现Capybara.current_session.driver.request.cookies #=> {}的空值假象
  • RackTest驱动不支持跨域请求,若你的登录页和后续页面域名不一致,会导致Cookie丢失,请改用Selenium等支持跨域的驱动

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:09:03