为什么Cypress运行第三个it用例时会自动跳转回登录页面
问题根因
Cypress.Cookies.preserveOnce()仅能保留下一次测试用例执行期间的Cookie,你仅在before钩子中调用了一次自定义保留Cookie命令,只能保证第一个it用例执行完后Cookie不被清除、第二个it用例可以正常拿到登录态;第二个it执行完后没有再次调用保留逻辑,第三个it执行前Cookie被Cypress默认清空,就会因为无登录态跳转回登录页。- 如果你的系统登录态同时存储在
localStorage/sessionStorage中,仅保留Cookie无法完整保留登录状态,Cypress默认会在每个测试用例执行前清空站点存储数据。 - 额外注意:你定义的自定义命令名
preverseAllCookiesOnce存在拼写错误,正确拼写应为preserveAllCookiesOnce,不过你调用时用的是同一个错误拼写,所以不会触发命令未找到的报错,可以后续统一修正避免后续维护出问题。
修复方案
方案1:调整Cookie保留命令的调用时机
把保留Cookie的命令调用放到beforeEach钩子中,保证每次测试用例执行前都保留上一次的Cookie:
describe("Overview Page", () => { before("Behaviour to overview page", () => { cy.SignIn(); }); // 新增beforeEach钩子,每次执行it前保留cookie beforeEach(() => { cy.preverseAllCookiesOnce(); }); // 其余it测试代码保持不变 it("Overview Page Check (Sidebar and Header)", () => { // 原有逻辑 }); it("Button Current and Dissmiss", () => { // 原有逻辑 }); it("Mapbox Button Check", () => { // 原有逻辑 }); });
方案2:登录态存在存储中时,新增存储保留逻辑
修改自定义命令,同时保留Cookie和存储数据:
// command.js let savedLocalStorage; let savedSessionStorage; Cypress.Commands.add("preserveLoginState", () => { // 保留Cookie cy.getCookies().then((cookies) => { const namesOfCookies = cookies.map((c) => c.name); Cypress.Cookies.preserveOnce(...namesOfCookies); }); // 恢复localStorage if (savedLocalStorage) { Object.keys(savedLocalStorage).forEach(key => { window.localStorage.setItem(key, savedLocalStorage[key]); }); } // 恢复sessionStorage if (savedSessionStorage) { Object.keys(savedSessionStorage).forEach(key => { window.sessionStorage.setItem(key, savedSessionStorage[key]); }); } // 执行完当前用例后保存最新的存储数据 afterEach(() => { savedLocalStorage = { ...window.localStorage }; savedSessionStorage = { ...window.sessionStorage }; }); });
之后在beforeEach中调用preserveLoginState()即可。
方案3(快速验证用):关闭Cypress的测试隔离
在cypress.config.js中添加testIsolation: false配置,关闭每个测试用例之间的环境自动清空逻辑,所有用例共享同一个浏览器上下文,登录态会全程保留:
// cypress.config.js 示例 const { defineConfig } = require('cypress') module.exports = defineConfig({ e2e: { testIsolation: false, // 其余原有配置保持不变 } })
该方案会关闭用例之间的环境隔离,不推荐在正式测试套件中长期使用,适合快速验证跳转问题是否由登录态丢失导致。
内容的提问来源于stack exchange,提问作者surya kumara
相关产品推荐
相关产品推荐

