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

运行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 00:11:04