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

afterEach钩子调用Cypress.Cookies.preserveOnce('session_id')不生效问题

Cypress测试保留登录状态失效解决方案

失效原因排查

  • Cypress 12及以上版本默认开启testIsolation(测试隔离) 特性,每执行完一个测试用例后会自动清空所有Cookie、本地存储等会话数据,旧的preserveOnce方法会被该特性覆盖
  • 填写的待保留Cookie名与实际会话Cookie名不符
  • Cypress.Cookies.preserveOnce调用位置错误,官方要求放在beforeEach钩子而非afterEach钩子中生效

解决方案

方案1:使用官方推荐的cy.session()管理登录状态(适配所有Cypress 10+版本,无需关闭测试隔离,更稳定)

  1. 先在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');
  })
})
  1. 调整测试文件代码:
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

  1. 先在cypress.config.js中关闭测试隔离特性:
const { defineConfig } = require('cypress')

module.exports = defineConfig({
  e2e: {
    testIsolation: false,
    // 其余原有配置保持不变
  }
})
  1. 调整测试文件中的钩子逻辑,把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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 17:27:04