运行Cypress测试时如何保留AWS Amplify登录状态?
在Cypress测试用例间维持登录状态的优化方案
针对你用beforeEach()每次测试都登录导致速度慢的问题,这里有几种实用的优化方案,适配不同场景:
方案1:用before()替代beforeEach(),仅登录一次
如果你的测试用例只是遍历页面检查控制台输出,不会修改用户登录状态(比如登出),直接把登录逻辑移到before()里,整个测试套件只执行一次登录,所有测试用例共享登录状态,这是最简单高效的方式。
修改后的代码:
describe('Candidate Pages', () => { // 整个测试套件启动时仅登录一次 before(() => cy.loginByCognito(Cypress.env("candidate_username"), Cypress.env("candidate_password"))); candidateRoutes.forEach((page) => { it(`No Console Errors for ${page}`, () => checkConsole(page, "error")); it(`No console.warn for ${page}`, () => checkConsole(page, "warn")); }); });
方案2:使用Cypress Session API(Cypress 12+推荐)
如果需要更健壮的会话管理(比如会话意外失效时自动重新登录),Cypress 12+提供的Session API是最佳选择,它会自动持久化cookie、localStorage等会话数据,且支持跨测试文件共享。
首先可以在cypress/support/e2e.js中配置全局会话选项(可选):
import { configure } from '@cypress/session-api'; configure({ cacheAcrossSpecs: true, // 开启后可跨多个测试文件共享会话 });
然后在测试文件中使用:
describe('Candidate Pages', () => { beforeEach(() => { cy.session('candidate-login', () => { // 仅当会话不存在时才执行登录逻辑 cy.loginByCognito(Cypress.env("candidate_username"), Cypress.env("candidate_password")); }); }); candidateRoutes.forEach((page) => { it(`No Console Errors for ${page}`, () => checkConsole(page, "error")); it(`No console.warn for ${page}`, () => checkConsole(page, "warn")); }); });
Session API会自动处理会话的创建、复用和恢复,比手动缓存更可靠。
方案3:手动缓存登录凭证(适配旧版Cypress)
如果你使用的是Cypress 12以下版本,可以手动保存登录后的cookie或localStorage,在beforeEach()中直接恢复,避免重复登录。
示例代码:
describe('Candidate Pages', () => { let savedCookies; let savedLocalStorage; before(() => { // 先执行一次登录 cy.loginByCognito(Cypress.env("candidate_username"), Cypress.env("candidate_password")); // 保存登录后的所有cookie cy.getCookies().then(cookies => savedCookies = cookies); // 保存localStorage(如果登录状态存在这里) cy.window().then(win => savedLocalStorage = JSON.stringify(win.localStorage)); }); beforeEach(() => { // 恢复cookie savedCookies.forEach(cookie => { cy.setCookie(cookie.name, cookie.value, { domain: cookie.domain, path: cookie.path, secure: cookie.secure, httpOnly: cookie.httpOnly, expiry: cookie.expiry }); }); // 恢复localStorage cy.window().then(win => { const storage = JSON.parse(savedLocalStorage); Object.keys(storage).forEach(key => win.localStorage.setItem(key, storage[key])); }); // 刷新首页确保状态生效 cy.visit('/'); }); candidateRoutes.forEach((page) => { it(`No Console Errors for ${page}`, () => checkConsole(page, "error")); it(`No console.warn for ${page}`, () => checkConsole(page, "warn")); }); });
这种方法需要你清楚登录状态的存储位置(cookie或localStorage),维护成本比Session API高,但适配旧版本。
额外注意
- 确保所有测试用例不会触发登出或修改登录状态的操作,否则后续用例会失效。如果有这类测试,单独放在新的
describe块中。 - 优化
checkConsole函数,确保在访问页面前就监听控制台输出,避免遗漏:
function checkConsole(page, type) { // 提前监听对应类型的控制台输出 cy.on('window:console', (msg) => { if (msg.type === type) { throw new Error(`页面${page}出现控制台${type}:${msg.message}`); } }); cy.visit(page); // 等待页面加载完成,确保覆盖所有控制台输出 cy.url().should('include', page); }
内容的提问来源于stack exchange,提问作者Luke
相关产品推荐
相关产品推荐

