我添加了一个命令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
承诺可能会有所作为,但事实并非如此。
答案 0 :(得分:0)
默认情况下,赛普拉斯会在每次运行测试之前清除所有cookie。他们有一个API可以保存Cookie,以便下次执行测试时Cypress.Cookies.preserveOnce
回到您的用例,您可以在套件级别之前调用 Cypress.Cookies.preserveOnce('XSRF-TOKEN'),每个要获取令牌的套件中的每个。如果您不想重复通话,可以将其移至 getCSRFToken 命令中。
Cypress.Commands.add("getCSRFToken", () => {
Cypress.Cookies.preserveOnce('XSRF-TOKEN')
cy.getCookie('XSRF-TOKEN').then((cookie) => {
.....
});
});