如何在Cypress多测试用例中用cy.session替代弃用的Cookie保留
解决方案
不需要修改现有测试用例结构,只需替换beforeEach中的Cookie保留逻辑为cy.session,就能在多个it块间保持会话,具体实现如下:
步骤1:替换beforeEach逻辑
移除原有的Cypress.Cookies.defaults配置,改用cy.session来管理会话,确保登录状态仅在首次执行或会话失效时初始化:
beforeEach(() => { cy.session('user-auth-session', () => { // 执行会话初始化步骤(仅首次运行/会话失效时执行) performance.NavigateToUrl(URL); performance.LoginUserPass(); // 验证登录成功的核心标志(按需调整,比如检查关键Cookie或页面元素) cy.getCookie('somecookie').should('exist'); cy.getCookie('someOtherCookie').should('exist'); }, { // 每次测试前验证会话有效性,确保Cookie未过期/丢失 validate() { cy.getCookie('somecookie').should('exist'); cy.getCookie('someOtherCookie').should('exist'); cy.getCookie('AnotherCookie').should('exist'); } }); });
步骤2:保留原有测试用例结构
原有的it块无需大幅修改,只需根据实际情况调整验证逻辑(避免重复执行登录/导航操作):
it('Navigate to URL', () => { // 改为验证当前URL是否正确(因为cy.session已完成导航) cy.url().should('include', URL); // 若必须保留原调用,也可继续使用,但会重复导航(不影响会话状态) // performance.NavigateToUrl(URL); }); it('Login - Username/Pass', () => { // 改为验证登录状态(因为cy.session已完成登录) cy.get('#user-profile-icon').should('be.visible'); // 示例元素,需替换为实际页面标识 // 若必须保留原调用,可继续使用,但登录操作会被Cypress会话机制跳过(不会重复登录) // performance.LoginUserPass(); }); it('Navigate Order Page', () => { performance.Orderpage(); }); // 其他测试用例保持不变
原理说明
cy.session会在第一个测试用例运行时执行回调内的登录逻辑,后续测试用例运行时,先执行validate方法检查会话有效性:- 若会话有效(Cookie存在),则直接复用现有会话,跳过登录步骤;
- 若会话失效(Cookie丢失/过期),则重新执行回调内的登录逻辑,重建会话。
- 完全保留原有测试结构,不影响报告生成格式。
内容的提问来源于stack exchange,提问作者Coding wanabe
相关产品推荐
相关产品推荐

