Cypress - Cookie
Cypress - 管理 Cookie
Section titled “Cypress - 管理 Cookie”Cypress 提供了强大的机制来在测试期间管理 Cookie。默认情况下,Cypress 在每次测试之前会自动清除所有 Cookie,以确保一个干净的状态。然而,在某些场景下,你需要保留 Cookie 或直接与其交互。
使用 cy.session() 进行现代会话管理
Section titled “使用 cy.session() 进行现代会话管理”为了在多个测试之间保留登录状态或任何会话特定数据(Cookie、localStorage、sessionStorage),推荐的方法是使用 cy.session() 命令。此命令会缓存并恢复会话详情,从而避免重复进行身份验证或重新建立状态。
cy.session() 的语法
Section titled “cy.session() 的语法”cy.session(id, setupFunction, options?)- id: 会话的唯一标识符。可以是字符串或数组。
- setupFunction: 一个函数,如果会话尚未缓存,Cypress 会执行此函数来创建会话。此函数应执行建立会话的步骤(例如,登录、设置 Cookie)。
- options (可选): 用于配置会话验证或其他行为的对象。
一旦 cy.session() 成功完成,Cookie、localStorage 和 sessionStorage 会自动保存并在后续使用相同会话 id 的测试中恢复。
基本的 Cookie 操作命令
Section titled “基本的 Cookie 操作命令”Cypress 提供了几种用于在单个测试中直接进行 Cookie 交互的命令:
- cy.getCookie(name): 按名称检索特定的 Cookie。
- cy.getCookies(): 检索当前域的所有 Cookie。
- cy.setCookie(name, value, options?): 设置具有给定名称和值的 Cookie。你还可以传递
domain、path、secure、httpOnly、expiry等选项。 - cy.clearCookie(name): 按名称清除特定的 Cookie。
- cy.clearCookies(options?): 清除当前域和子域的所有 Cookie。Options 可以用于指定域。
注意:Cypress.Cookies.preserveOnce() 和 Cypress.Cookies.defaults() 已被弃用,并已被 cy.session() 替代,用于管理跨测试的会话状态。Cypress.Cookies.debug() 也已弃用;请使用浏览器 DevTools 或 cy.log(JSON.stringify(cookies)) 进行调试。
示例 1:基本的 Cookie 操作
Section titled “示例 1:基本的 Cookie 操作”describe('Cookie Management Test', () => { beforeEach(() => { // 访问一个可以设置 Cookie 的页面 cy.visit('https://www.example.com'); });
it('should set, get, and clear a cookie', () => { // 设置一个 Cookie cy.setCookie('myCookie', 'myValue', { domain: 'www.example.com' });
// 获取 Cookie 并断言其属性 cy.getCookie('myCookie').should('have.property', 'value', 'myValue');
// 获取所有 Cookie 并打印日志 cy.getCookies().then((cookies) => { cy.log('All cookies:', JSON.stringify(cookies)); });
// 清除特定的 Cookie cy.clearCookie('myCookie');
// 验证 Cookie 已被清除 cy.getCookie('myCookie').should('be.null');
// 设置多个 Cookie 用于全部清除 cy.setCookie('tempCookie1', 'val1'); cy.setCookie('tempCookie2', 'val2');
// 清除所有 Cookie cy.clearCookies();
// 验证所有 Cookie 已被清除 cy.getCookies().should('be.empty'); });});示例 2:使用 cy.session() 保留登录状态
Section titled “示例 2:使用 cy.session() 保留登录状态”describe('User Session Management', () => { beforeEach(() => { // 使用 cy.session 确保登录只发生一次 cy.session('userSession', () => { // 用户登录的步骤 cy.visit('https://your-app.com/login'); cy.get('input[name="username"]').type('testUser'); cy.get('input[name="password"]').type('password123'); cy.get('button[type="submit"]').click(); // 确保登录成功,例如通过检查 URL 或某个元素 cy.url().should('include', '/dashboard'); // (可选)验证登录后 Cookie 已被设置 cy.getCookie('session_id').should('exist'); }); // cy.session 后,Cookie 已被恢复。访问你想要测试的页面。 cy.visit('https://your-app.com/dashboard'); });
it('should access user-specific data on the dashboard', () => { // 由于 cy.session(),用户已经登录 cy.get('.user-profile').should('contain.text', 'testUser'); });
it('should navigate to another protected page', () => { // 会话仍然活跃 cy.visit('https://your-app.com/settings'); cy.get('.settings-header').should('be.visible'); });});这些示例展示了 Cypress 中现代的 Cookie 处理方式,重点在于测试独立性和高效的会话管理。