如何在Cypress测试间保留cookies/localStorage会话?
嘿,我来给你分享几个实用的方法,帮你在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
相关产品推荐
相关产品推荐

