如何让Cypress每次使用不同用户登录,避免Cy.session复用会话?
问题根源
你的cy.session使用了固定的'sessionId'作为会话标识,Cypress会将所有用户的登录会话缓存到同一个标识下,导致后续测试复用第一个用户的会话,不会重新登录新用户。
解决方案
核心是给每个用户分配唯一的会话标识,让Cypress为不同用户单独缓存会话。同时要处理特殊用户(如锁定用户)的登录验证逻辑。
1. 修改Login页面对象的login方法
将会话标识从固定字符串改为传入的username,并根据用户类型调整登录后的断言:
login(username, password) { // 用用户名作为会话唯一标识,每个用户独立缓存 cy.session(username, () => { cy.visit('/'); this.getUsername().type(username); this.getPassword().type(password); this.getLoginButton().click(); // 针对不同用户的登录结果做断言 if (username === 'locked_out_user') { cy.url().should('not.contain', '/inventory.html'); cy.get('[data-test="error"]').should('be.visible'); } else { cy.url().should('contain', '/inventory.html'); } }, { validate: () => { const currentUser = Cypress.env('currentUser'); // 验证会话有效性,适配不同用户场景 if (currentUser === 'locked_out_user') { cy.visit('/'); cy.get('[data-test="error"]').should('not.exist'); } else { cy.url().should('contain', '/inventory.html'); } } }) }
2. 调整测试用例代码
在循环测试时,将当前用户信息存入环境变量,供会话验证逻辑使用:
describe('All users', () => { const login_page = new LoginPage(); const users = Cypress.env("users"); Cypress._.each(users, (user, userType) => { it(`works for ${userType} user`, () => { cy.log(user.username); // 传递当前用户信息到环境变量,供session验证使用 Cypress.env('currentUser', user.username); login_page.login(user.username, user.password); // 针对不同用户添加专属测试逻辑 if (user.username === 'locked_out_user') { cy.get('[data-test="error"]') .should('have.text', 'Epic sadface: Sorry, this user has been locked out.'); } else { cy.get('.inventory_list').should('be.visible'); } }); }) });
额外说明
- 对于
locked_out_user这类登录失败的用户,cy.session不会缓存其会话,每次测试都会重新执行登录步骤,符合测试预期。 - 如果不需要为失败登录的用户启用会话缓存,可以在测试中判断用户类型,直接跳过
cy.session逻辑,执行原生登录流程。
内容的提问来源于stack exchange,提问作者Tahir Bashir
相关产品推荐
相关产品推荐

