我尝试通过Cypress.io测试PHP Symfony应用程序,但使用使用CSRF保护的自定义登录命令时遇到了问题。
我的命令看起来像这样:
Cypress.Commands.add('login', () => {
cy.request('/login')
.its('body')
.then((body) => {
const $html = Cypress.$(body);
const csrf = $html.find('input[name=_csrf_token]').val();
cy.request({
method: 'POST',
url: '/login',
failOnStatusCode: false,
form: true,
body: {
username: 'user',
password: 'password',
_csrf_token: csrf,
},
})
});
});下面是测试规范:
describe('Masterdata Test', () => {
beforeEach(() => {
cy.login();
cy.visit('/masterdata/autoselector');
});
it('highlights the correct register', () => {
cy.get('.registerTab.bg-white').contains('Masterdata');
});
});当我运行测试时,它似乎以某种方式登录工作(它返回200状态代码),但当它访问url时,它应该检查,它重定向到再次登录。(见下图)

我已经检查了CSRF令牌是否正确,我还从登录中删除了整个CSRF保护,并且只在我的登录命令中使用了第二个cy.request调用,它工作得很好。
有人能帮我解决这个问题吗?
发布于 2021-07-19 23:12:01
下面的代码对我有效,
PS:仅适用于基于UI的登录。
before(() => {
cy.visit("/");
cy.get(/*<get the webelement for csrf token>*/).invoke('attr', 'value').then(($value) => {
cy.setCookie('csrftoken', $value);
});
});
beforeEach(() => {
Cypress.Cookies.preserveOnce('csrftoken');
});发布于 2020-10-31 05:54:06
请参阅Cypress Recipes存储库中的CSRF令牌演示。
https://github.com/cypress-io/cypress-example-recipes/tree/master/examples/logging-in__csrf-tokens
发布于 2021-03-23 22:37:23
我遇到了完全相同的问题:表单重新加载时没有任何错误。
对我来说,这是因为Symfony中的php会话没有使用APP_ENV=test,因此csrf令牌在每次请求时都会改变;-)我不得不切换到dev或prod,然后它就工作得很好。
我是通过测试csfr令牌在两次重新加载之间是否相同来发现这一点的:
describe('Check csrf', () => {
it('Grabs Token and reloads', () => {
// get csrf token and output to command log
cy.request('/login')
.its('body')
.then((body) => {
const $html = Cypress.$(body)
const csrf = $html.find('input[name=_csrf_token]').val()
cy.log(csrf)
})
// do the same again
cy.request('/login')
.its('body')
.then((body) => {
const $html = Cypress.$(body)
const csrf = $html.find('input[name=_csrf_token]').val()
cy.log(csrf)
})
})
})https://stackoverflow.com/questions/64615794
复制相似问题