如何在Cypress自动化测试中保持登录状态避免各用例重复登录
Cypress 测试会话保持登录状态实现方案
1. 用cy.session()缓存登录会话(官方推荐)
Cypress 8.0及以上版本内置的cy.session()API专门用来处理会话缓存,同一个测试会话内只会执行一次实际登录逻辑,后续所有用例直接复用缓存的鉴权凭证,不需要重复走登录流程。
首先在cypress/support/commands.js中封装全局登录命令:
Cypress.Commands.add('login', () => { // 给当前登录会话指定唯一标识,区分不同账号的登录状态 cy.session('adminUserSession', () => { // 替换为你自己系统的登录操作逻辑 cy.visit('/login') cy.get('input[name="account"]').type('test_admin') cy.get('input[name="password"]').type('test_pwd123') cy.get('.login-submit-btn').click() // 验证登录成功,确保凭证已经生成 cy.url().should('contain', '/workbench') }) })
之后你在任意测试用例中调用cy.login(),整个测试会话只会实际跑一次登录,后续调用直接恢复缓存的Cookie、本地存储等鉴权信息。
2. 低版本Cypress用全局钩子+凭证保留
如果你用的Cypress版本低于8.0不支持cy.session(),可以通过全局前置钩子+保留指定鉴权凭证的方式实现:
首先在cypress/support/e2e.js(旧版本对应index.js)中添加全局钩子:
// 所有测试用例执行前仅执行一次登录 before(() => { cy.visit('/login') cy.get('input[name="account"]').type('test_admin') cy.get('input[name="password"]').type('test_pwd123') cy.get('.login-submit-btn').click() cy.url().should('contain', '/workbench') }) // 每个测试用例执行前保留需要的鉴权凭证,避免被Cypress默认清空 beforeEach(() => { // 保留Cookie类型的鉴权字段,替换为你系统实际的Cookie名 Cypress.Cookies.preserveOnce('auth_token', 'session_id') // 如果用localStorage存储鉴权信息,添加以下逻辑 cy.window().then(win => { const token = win.localStorage.getItem('auth_token') if (token) win.localStorage.setItem('auth_token', token) }) })
3. 关闭测试隔离(按需使用)
Cypress默认开启测试隔离,每个用例执行完成后会清空所有页面上下文、存储、Cookie。如果你确认你的测试用例之间不会互相污染,可以直接在cypress.config.js中关闭测试隔离,登录状态会自动在所有用例间共享:
const { defineConfig } = require('cypress') module.exports = defineConfig({ e2e: { // 关闭测试隔离,用例间共享上下文状态 testIsolation: false, // 其他配置项 baseUrl: 'https://your-test-domain.com' } })
注意:该方案仅适合测试逻辑简单、用例无互相依赖的场景,复杂项目使用容易出现用例间互相干扰的问题,不优先推荐。
内容的提问来源于stack exchange,提问作者Christian Georgeson
相关产品推荐
相关产品推荐

