赛普拉斯:我们如何在赛普拉斯中使用不记名令牌编写 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 会话