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

Cypress:3DS支付重定向后如何恢复会话?

解决Cypress中3DS支付重定向后的会话丢失问题

1. 确保会话配置正确,避免跨域清除

首先确认cypress.config.js中已启用会话与跨域支持(Cypress 12+默认启用,低版本需手动配置):

module.exports = defineConfig({
  e2e: {
    experimentalSessionAndOrigin: true,
  },
})

在beforeEach中定义登录会话,加入验证逻辑确保会话有效性:

beforeEach(() => {
  cy.session('login', () => {
    // 标准登录流程
    cy.visit('/login')
    cy.get('#username').type('your-username')
    cy.get('#password').type('your-password')
    cy.get('button[type="submit"]').click()
    // 验证登录成功,比如检查首页专属元素
    cy.get('.user-profile').should('be.visible')
  }, {
    cacheAcrossSpecs: true,
    validate: () => {
      // 校验会话cookie是否存在,避免恢复无效会话
      cy.getCookie('auth-session').should('exist')
    }
  })
  cy.visit('/') // 确保每次测试前处于主应用页面
})

2. 用cy.origin()处理3DS跨域流程

3DS支付属于第三方域名跳转,直接操作会导致Cypress清除主应用会话。用cy.origin()包裹跨域交互,可保留主域会话:

it('完成3DS支付并正常返回应用', () => {
  // 触发支付流程,进入3DS验证页
  cy.get('#initiate-payment').click()

  // 处理第三方3DS页面的交互
  cy.origin('https://3ds-provider-domain.com', () => {
    cy.get('#verification-code').type('123456')
    cy.get('#confirm-code').click()
  })

  // 回到主应用后,验证会话仍有效,无需重新登录
  cy.get('.payment-success').should('be.visible')
})

3. 解决会话恢复的报错问题

  • 若仅调用cy.session('login')提示缺少第二个参数,说明该会话尚未被定义。确保beforeEach中已提前创建同名会话,后续调用cy.session('login')会自动恢复会话,无需重复传入初始化函数。
  • 若提示“会话已存在”,检查是否在同一个测试文件中多次定义了同名cy.session(即重复传入初始化函数)。同一个会话只需定义一次,后续调用直接使用名称即可。

4. 手动保留cookie的替代方案

如果自定义cookie命令之前无效,可能是未覆盖所有关键会话cookie或时机错误。调整命令如下(在cypress/support/commands.js中定义):

Cypress.Commands.add('saveSessionCookies', () => {
  cy.getCookies().then(cookies => {
    // 筛选出会话相关的cookie(根据实际项目调整)
    const criticalCookies = cookies.filter(c => 
      c.name === 'auth-token' || c.name.includes('session-id')
    )
    cy.wrap(criticalCookies).as('savedCookies')
  })
})

Cypress.Commands.add('restoreSessionCookies', () => {
  cy.get('@savedCookies').then(cookies => {
    cookies.forEach(cookie => {
      cy.setCookie(cookie.name, cookie.value, {
        domain: cookie.domain,
        path: cookie.path,
        secure: cookie.secure,
        httpOnly: cookie.httpOnly
      })
    })
  })
})

测试中使用:

it('手动恢复3DS后的会话', () => {
  cy.saveSessionCookies() // 跳转前保存会话cookie

  cy.get('#start-checkout').click()
  cy.origin('https://3ds-provider-domain.com', () => {
    cy.get('#3ds-code').type('654321')
    cy.get('#submit').click()
  })

  cy.restoreSessionCookies() // 返回后恢复cookie
  cy.get('.order-complete').should('be.visible')
})

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:47:09