【问题标题】:Cypress setCookie not working as expected赛普拉斯 setCookie 未按预期工作
【发布时间】:2019-10-31 15:05:45
【问题描述】:

我添加了一个命令 getCSRFToken,其他命令使用它来获取 CSRF 令牌以向我的应用发出请求:

Cypress.Commands.add("getCSRFToken", () => {
  cy.getCookie('XSRF-TOKEN').then((cookie) => {
    if (!cookie) {
      return cy.request('HEAD', '/')
        .its('headers')
        .then((headers) => {
          const token = headers['x-xsrf-token'];
          if (!token) {
            throw new Error('XSRF token not found');
          }

          return cy.setCookie('XSRF-TOKEN', token)
            .then(() => token);
        });
    }

    return cookie.value;
  });
});

发出HEAD请求的部分是为了在测试中还没有访问过任何页面时使用此功能,例如在发出POST请求创建测试数据时。

AFAICT 这看起来应该对我有用,但似乎随后对getCookie 的调用实际上并没有检索到任何东西:

我认为返回 setCookie 承诺和 getCookie 承诺可能会有所作为,但事实并非如此。

【问题讨论】:

    标签: cookies cypress


    【解决方案1】:

    默认情况下,赛普拉斯会在每次测试运行前清除所有 cookie。他们有一个 api 来为下一次测试执行保留一个 cookie,即Cypress.Cookies.preserveOnce

    回到您的用例,您可以在要获取令牌的每个套件中的套件级 beforeEach 中调用 Cypress.Cookies.preserveOnce('XSRF-TOKEN')。如果您不想重复调用,可以将其移动到 getCSRFToken 命令中。

    Cypress.Commands.add("getCSRFToken", () => {
      Cypress.Cookies.preserveOnce('XSRF-TOKEN')
      cy.getCookie('XSRF-TOKEN').then((cookie) => {
        .....
      });
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-11
      • 1970-01-01
      • 1970-01-01
      • 2020-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多