afterEach钩子调用Cypress.Cookies.preserveOnce('session_id')不生效问题
Cypress测试保留登录状态失效解决方案
失效原因排查
- Cypress 12及以上版本默认开启testIsolation(测试隔离) 特性,每执行完一个测试用例后会自动清空所有Cookie、本地存储等会话数据,旧的
preserveOnce方法会被该特性覆盖 - 填写的待保留Cookie名与实际会话Cookie名不符
Cypress.Cookies.preserveOnce调用位置错误,官方要求放在beforeEach钩子而非afterEach钩子中生效
解决方案
方案1:使用官方推荐的cy.session()管理登录状态(适配所有Cypress 10+版本,无需关闭测试隔离,更稳定)
- 先在
cypress/support/commands.js中封装全局登录命令:
Cypress.Commands.add('login', (email, password) => { // 用邮箱+密码作为缓存key,相同账号会复用登录会话 cy.session([email, password], () => { myApp.pages.Login.navigate(); myApp.pages.Login.login(email, password); // 补充登录成功断言,确保会话生成后再缓存 cy.url().should('include', '/dashboard'); }) })
- 调整测试文件代码:
describe('用户页面测试场景', () => { beforeEach(() => { // 仅第一次调用会真实执行登录,后续调用直接复用缓存的会话 cy.login(credentials.globalAdmin.email, credentials.globalAdmin.password); myApp.sharedComponents.Header.navigateToUsers(); }); describe('用户列表测试', () => { it('点击导航栏用户入口后应跳转至用户页面', () => { cy.url().should('eq', `${Cypress.config().baseUrl}/user`); }); }) describe('新建用户测试', () => { it('点击邀请管理员按钮后应打开新建用户页面', () => { myApp.pages.Users.UsersList.inviteAdministrator(); cy.url().should('eq', `${Cypress.config().baseUrl}/user/new`); }); it('应成功完成新用户创建', () => { myApp.pages.Users.UsersList.inviteAdministrator(); myApp.pages.Users.UsersInfo.createNewUser(user.generateUser()); }) }); })
方案2:继续使用preserveOnce
- 先在
cypress.config.js中关闭测试隔离特性:
const { defineConfig } = require('cypress') module.exports = defineConfig({ e2e: { testIsolation: false, // 其余原有配置保持不变 } })
- 调整测试文件中的钩子逻辑,把
preserveOnce移到beforeEach中,删除afterEach中的对应代码:
describe('用户页面测试场景', () => { before(() => { myApp.pages.Login.navigate(); myApp.pages.Login.login( credentials.globalAdmin.email, credentials.globalAdmin.password ); }); beforeEach('每个测试前导航到用户页面并保留会话Cookie', () => { // 此处替换为你实际的会话Cookie名称,可在浏览器Application面板的Cookie列表中查看 Cypress.Cookies.preserveOnce('session_id'); myApp.sharedComponents.Header.navigateToUsers(); }); // 原有测试用例保持不变 describe('用户列表测试', () => { it('点击导航栏用户入口后应跳转至用户页面', () => { cy.url().should('eq', `${Cypress.config().baseUrl}/user`); }); }) describe('新建用户测试', () => { it('点击邀请管理员按钮后应打开新建用户页面', () => { myApp.pages.Users.UsersList.inviteAdministrator(); cy.url().should('eq', `${Cypress.config().baseUrl}/user/new`); }); it('应成功完成新用户创建', () => { myApp.pages.Users.UsersList.inviteAdministrator(); myApp.pages.Users.UsersInfo.createNewUser(user.generateUser()); }) }); })
内容的提问来源于stack exchange,提问作者Mona101ma
相关产品推荐
相关产品推荐

