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
相关产品推荐
相关产品推荐

