Skip to content

Cypress - Cookie

Cypress 提供了强大的机制来在测试期间管理 Cookie。默认情况下,Cypress 在每次测试之前会自动清除所有 Cookie,以确保一个干净的状态。然而,在某些场景下,你需要保留 Cookie 或直接与其交互。

使用 cy.session() 进行现代会话管理

Section titled “使用 cy.session() 进行现代会话管理”

为了在多个测试之间保留登录状态或任何会话特定数据(Cookie、localStorage、sessionStorage),推荐的方法是使用 cy.session() 命令。此命令会缓存并恢复会话详情,从而避免重复进行身份验证或重新建立状态。

cy.session(id, setupFunction, options?)
  • id: 会话的唯一标识符。可以是字符串或数组。
  • setupFunction: 一个函数,如果会话尚未缓存,Cypress 会执行此函数来创建会话。此函数应执行建立会话的步骤(例如,登录、设置 Cookie)。
  • options (可选): 用于配置会话验证或其他行为的对象。

一旦 cy.session() 成功完成,Cookie、localStorage 和 sessionStorage 会自动保存并在后续使用相同会话 id 的测试中恢复。

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)) 进行调试。

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 处理方式,重点在于测试独立性和高效的会话管理。