赛普拉斯:我们如何在赛普拉斯中使用不记名令牌编写 GET 请求?

Posted

技术标签:

【中文标题】赛普拉斯:我们如何在赛普拉斯中使用不记名令牌编写 GET 请求?【英文标题】:Cypress : How can we write GET request in with bearer token in cypress? 【发布时间】:2020-08-17 13:18:06 【问题描述】:

我有两个请求:一个是 POST 请求,另一个是 get。首先,我通过帖子获取用户访问令牌,而在其他情况下,我使用此 accessToken 登录。我的代码不起作用。

我正在使用窗口 7 和 cypress 3.3.5

我的代码:

var value;
describe("Login operation", () => 
  it("Login Request with post method", () => 
    cy.request(
      method:'POST', 
      url:'https://odms.baitussalam.org:8445/api/v1/auth/login',
      body: 
        "userName": "faizanj",
        "password": "abc"
      
    )
      .then(function(response)
        this.value = response.body.accessToken;
        console.log("Value "+this.value);

        expect(response.body.name).to.equal('Faizan');
        expect(response.status).to.equal(200);
      );
  );

  it('Second test case', function() 

    var authHeader='bearer $'+this.value+'';
    const options = 
      method: 'GET',
      url: `https://odms.baitussalam.org:8445/api/v1/qurbani-representative`,
      headers:
        authorization:authHeader,
      ;

    cy.request(options)
      .then((response)=>
        expect(response.status).to.equal(200);6+9
      );
  );
);

【问题讨论】:

尝试在第二个测试中添加console.log(this.value) 以查看标头是否正在使用该值。我认为你不需要this.前面的value,但你可以这样确认。 【参考方案1】:

问题是您尝试在测试用例之间使用变量集,而当它已经重置以存储令牌时,您需要使用全局变量(不建议),或者创建一些在您需要访问令牌之前将调用的登录命令。例如:

Cypress.Commands.Add('login', (userName, password) => 
  cy.request(
      method:'POST', 
      url:'https://odms.baitussalam.org:8445/api/v1/auth/login',
      body: 
        userName,
        password,
      
    )
    .as('loginResponse')
    .then((response) => 
      Cypress.env('token', response.body.accessToken); // either this or some global var but remember that this will only work in one test case
      return response;
    )
    .its('status')
    .should('eq', 200);
)

然后,当您需要在使用Cypress.env('token') 之前登录用户时。

例如:

describe('testing token', () => 
  beforeEach(() => 
    cy.login();
  );

  it('test request', () => 
    const token = Cypress.env('token');
    const authorization = `bearer $ token `;
    const options = 
      method: 'GET',
      url: `https://odms.baitussalam.org:8445/api/v1/qurbani-representative`,
      headers: 
        authorization,
      ;

    cy.request(options)
      .its('status')
      .should('eq', 200);
  )
);

您可以更进一步并覆盖所有向它们添加令牌的请求,如下所示:

Cypress.Commands.overwrite('request', (originalFn, ...options) => 
  const optionsObject = options[0];
  const token = Cypress.env('token');

  if (!!token && optionsObject === Object(optionsObject)) 
    optionsObject.headers = 
      authorization: 'Bearer ' + token,
      ...optionsObject.headers,
    ;

    return originalFn(optionsObject);
  

  return originalFn(...options);
);

那么上面的例子应该是这样的:

describe('testing token', () => 
  beforeEach(() => 
    cy.login();
  );

  it('test request', () => 
    cy.request(options)
      .its('status')
      .should('eq', 200);
  )
);

【讨论】:

请求覆盖似乎不起作用。如果我与 cy.request(url, Headers: Authorization: 'Bearer ' + token) 一起做,它就可以工作。请指教。 @a2441918 如果您正确设置了Cypress.env('token') 覆盖,则可以尝试调试,如果您需要在cy.request 中单独添加它可能为空。如果是这种情况,您需要在运行任何cy.request之前运行cy.login();(如上定义)

以上是关于赛普拉斯:我们如何在赛普拉斯中使用不记名令牌编写 GET 请求?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用赛普拉斯检查可能不存在的元素

使用赛普拉斯,我将如何编写一个简单的测试来检查页面上是不是存在徽标图像

在赛普拉斯的测试中保留 cookie / localStorage 会话

无法从赛普拉斯的 html 正文中提取 CSRF 令牌

赛普拉斯/GitLab CI/CD 集成 - 赛普拉斯不会在无头模式下启动

如何检查在赛普拉斯 e2e 测试中元素是不是永远不可见?