Symfony应用Cypress测试中遭遇CSRF令牌无效错误求助
解决Symfony应用Cypress测试中的CSRF令牌无效问题
针对你遇到的CSRF令牌无效、路径断言失败问题,以下是具体的解决方案:
核心问题分析
- 测试用例拆分导致状态丢失:两个
it块独立执行,即便保留了PHPSESSID,第二个测试运行时页面可能已重新加载,原CSRF令牌已过期或不匹配。 - 表单必填项缺失:测试中点击「Submit pin」前未输入验证PIN,表单验证失败后服务器会返回原页面并生成新的CSRF令牌,进而触发无效错误,同时路径无法跳转至目标页面。
具体解决方案
1. 合并相关测试用例
将发送PIN和验证PIN的逻辑合并到同一个it块中,保持会话和页面状态的连贯性:
describe('Old Affliates can create lead', () => { beforeEach(() => Cypress.Cookies.preserveOnce('PHPSESSID')); const payload = { emailLead: `test${Cypress._.random(1000, 99999)}@123.com`, mobileNumber: `077890${Cypress._.random(10000, 99999)}`, apiId: Cypress.env('id'), apiToken: Cypress.env('key'), }; it('Send verification pin and verify phone number', () => { // 发送PIN并跳转至验证页面 cy.contains('Send pin').click(); cy.location('pathname').should('eq', '/phone-number/verify'); // 输入验证PIN(根据测试环境配置,可固定值或从API/数据库获取) cy.get('input[name="phone_number_submit_pin[pin]"]').type('1234'); // 替换为实际有效PIN // 提交验证表单 cy.contains('Submit pin').click(); cy.location('pathname').should('eq', '/private-area/borrower'); }); });
2. 确保正确保留会话Cookie
部分Symfony应用使用SFSESSID作为会话Cookie名称,而非PHPSESSID,需要调整Cookie保留规则:
beforeEach(() => { Cypress.Cookies.defaults({ preserve: (cookie) => ['PHPSESSID', 'SFSESSID'].includes(cookie.name) }); });
3. 手动提取并提交CSRF令牌(备选方案)
如果自动点击仍有问题,可手动从表单中提取最新令牌,通过cy.request提交表单:
it('Verifies phone number', () => { cy.visit('/phone-number/verify'); // 提取页面中的CSRF令牌 cy.get('input[name="phone_number_submit_pin[_token]"]').invoke('val').then((csrfToken) => { // 构造表单数据(包含PIN和令牌) cy.request({ method: 'POST', url: '/phone-number/verify', form: true, body: { 'phone_number_submit_pin[pin]': '1234', // 替换为有效PIN 'phone_number_submit_pin[_token]': csrfToken } }); cy.location('pathname').should('eq', '/private-area/borrower'); }); });
内容的提问来源于stack exchange,提问作者Sakshi_Goraniya
相关产品推荐
相关产品推荐

