Cypress:如何为测试套件保留会话以避免重复登录?
解决Cypress重复登录耗时问题的方案
由于Cypress.Cookies.preserveOnce()已被移除,现在官方推荐使用cy.session()来复用登录会话,避免每个测试用例重复执行登录和客户选择步骤。以下是具体实现方式:
核心思路
用cy.session()封装登录+客户选择的逻辑,Cypress会自动保存会话状态(Cookie、LocalStorage等),后续测试用例直接复用该会话,无需重复执行前置操作。
修改后的测试代码
describe("Resource Add / Remove", () => { beforeEach(() => { // 复用登录会话,不存在则创建 cy.session('my-user-session', () => { cy.visit('http://localhost/myapp') const user = { email: EMAIL, password: PASSWORD, }; cy.login(user); cy.selectCustomer('MyCustomer') // 验证会话创建成功(可选,确保进入正确页面) cy.url().should('include', '/dashboard') // 替换为你的目标页面路径 }); // 会话已存在,直接访问应用即可,不会重定向到登录页 cy.visit('http://localhost/myapp') }); it("should create a new resource", () => { const resourceName = "MyResource"; // 存到Cypress环境变量,供下一个测试用例使用 Cypress.env('resourceName', resourceName); // 执行创建资源的逻辑 // 示例:cy.get('[data-testid="create-resource-btn"]').click() // cy.get('[data-testid="resource-name-input"]').type(resourceName) // cy.get('[data-testid="submit-btn"]').click() // 验证资源创建成功 // cy.get('[data-testid="resource-list"]').should('contain', resourceName) }); it("should delete last created resource", () => { const resourceName = Cypress.env('resourceName'); // 执行删除资源的逻辑 // 示例:cy.get('[data-testid="resource-list"]').contains(resourceName).parent().find('[data-testid="delete-btn"]').click() // cy.get('[data-testid="confirm-delete-btn"]').click() // 验证资源被移除 // cy.get('[data-testid="resource-list"]').should('not.contain', resourceName) }); });
关键细节说明
cy.session()的第一个参数是会话的唯一标识(比如用户名或自定义名称),Cypress会根据这个标识判断是否需要重新创建会话。- 会话创建的回调函数只会在会话不存在时执行,后续测试用例会直接恢复会话状态。
- 使用
Cypress.env()在测试用例间共享资源名称,避免异步变量传递的问题。 - 确保
cy.login()和cy.selectCustomer()是可靠的自定义命令,能正确完成登录和客户选择操作。
内容的提问来源于stack exchange,提问作者harunB10
相关产品推荐
相关产品推荐

