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

如何在Cypress测试间保留cookies/localStorage会话?

解决Cypress中持久化Cookie/JWT令牌,避免重复登录的方案

嘿,我来给你分享几个实用的方法,帮你在Cypress测试里持久化cy.request()获取的Cookie或者localStorage里的JWT令牌,不用每次测试都跑一遍登录流程~


方法一:用官方推荐的cy.session()(Cypress 12+)

这是现在最省心的方案,Cypress会帮你自动缓存会话状态,包括Cookie、localStorage这些,后续测试直接复用,不用手动处理存储。

步骤1:定义API登录命令

先在cypress/support/commands.js里写一个登录命令,用cy.request()调用登录接口,拿到令牌后存入localStorage(如果是Cookie的话,Cypress会自动保留,不用额外操作):

Cypress.Commands.add('loginViaApi', () => {
  cy.request({
    method: 'POST',
    url: '/api/auth/login', // 替换成你的实际登录接口地址
    body: {
      email: 'your-test-email@example.com',
      password: 'your-test-password'
    }
  }).then((response) => {
    // 把JWT存入localStorage,键名要和你的前端代码一致
    window.localStorage.setItem('authToken', response.body.accessToken);
  });
});

步骤2:在测试中使用cy.session()缓存会话

在你的测试套件里,用cy.session()包裹登录操作,Cypress会自动识别并缓存这个会话,后续测试不会重复执行登录:

describe('需要权限的功能测试', () => {
  beforeEach(() => {
    cy.session('用户登录会话', () => {
      // 只有第一次会执行登录,后续测试直接复用缓存的会话
      cy.loginViaApi();
    });
    // 每次测试前访问首页,确保会话生效
    cy.visit('/');
  });

  it('访问仪表盘页面', () => {
    cy.visit('/dashboard');
    cy.contains('欢迎回来').should('be.visible');
  });

  it('修改个人资料', () => {
    cy.visit('/profile');
    cy.get('#nickname-input').type('新昵称').should('have.value', '新昵称');
  });
});

方法二:手动持久化到Fixtures文件(适合旧版本Cypress)

如果你的Cypress版本低于12,或者需要更灵活控制令牌的存储,可以把令牌保存到fixture文件里,后续测试直接读取。

步骤1:生成并保存令牌到Fixture

先写一个单独的测试(或者脚本),执行一次登录,把令牌写入cypress/fixtures目录下的JSON文件:

it('生成登录令牌并保存到Fixture', () => {
  cy.request({
    method: 'POST',
    url: '/api/auth/login',
    body: { email: 'your-test-email@example.com', password: 'your-test-password' }
  }).then((response) => {
    cy.writeFile('cypress/fixtures/auth-token.json', {
      token: response.body.accessToken
    });
  });
});

运行这个测试后,你会在cypress/fixtures里看到auth-token.json文件,里面存着你的JWT令牌。

步骤2:在测试中读取并设置令牌

在测试的beforeEach钩子中,从fixture读取令牌,设置到localStorage里:

describe('需要权限的功能测试', () => {
  beforeEach(() => {
    cy.fixture('auth-token.json').then((authData) => {
      window.localStorage.setItem('authToken', authData.token);
    });
    cy.visit('/');
  });

  it('查看订单列表', () => {
    cy.visit('/orders');
    cy.get('.order-item').should('have.length.greaterThan', 0);
  });
});

一些注意事项

  • 如果你的应用用的是Cookie会话,Cypress默认会在测试间保留Cookie,但cy.session()依然是更可靠的选择,尤其是跨域名测试或者有复杂Cookie策略的场景。
  • 确保你设置的localStorage键名和前端应用实际使用的完全一致,不然令牌不会生效。
  • 对于JWT令牌,要注意它的过期时间,如果令牌过期了,重新运行一次生成令牌的测试或者命令即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:29:31