如何通过Cypress.io无UI程序化登录Django服务器
解决Django + Cypress登录的CSRF问题
嘿,我太懂这种被Django CSRF卡脖子的感觉了!之前用Cypress做Django登录测试时也踩过这个坑,官方示例说禁用CSRF完全不适用我们这种要严格遵循Django规则的场景对吧?
Django默认的登录视图确实只认表单里的csrfmiddlewaretoken字段,完全不看请求头,所以得换个思路来处理。这里有两种靠谱的方案,你可以根据测试场景选:
方案1:模拟真实用户提交表单(推荐)
这种方法最贴近真实用户操作,Cypress会自动帮你带上表单里的CSRF token,根本不用手动处理,简单粗暴又有效:
describe('Django登录测试', () => { it('使用有效凭据成功登录', () => { // 先访问登录页面 cy.visit('/accounts/login/') // 填写用户名和密码 cy.get('input[name="username"]').type('你的测试用户名') cy.get('input[name="password"]').type('你的测试密码') // 提交登录表单 cy.get('form').submit() // 验证登录成功(根据你的站点实际情况调整) cy.url().should('include', '/dashboard/') // 假设登录后跳转到仪表盘 cy.contains('欢迎回来,你的测试用户名') // 页面出现用户欢迎语 }) })
方案2:用cy.request手动提交请求
如果你的测试需要在登录后直接发起API请求,不想走页面跳转流程,那可以手动提取CSRF token再发送POST请求:
describe('Django登录API测试', () => { it('通过API请求完成登录', () => { // 先访问登录页面,获取CSRF token和会话Cookie cy.visit('/accounts/login/') // 提取页面里的CSRF token并保存为别名 cy.get('input[name="csrfmiddlewaretoken"]') .invoke('val') .as('csrfToken') // 使用提取到的CSRF token发送登录请求 cy.get('@csrfToken').then((csrfToken) => { cy.request({ method: 'POST', url: '/accounts/login/', form: true, // 关键!自动把请求体编码成表单格式 body: { username: '你的测试用户名', password: '你的测试密码', csrfmiddlewaretoken: csrfToken } }) }) // 验证登录状态(比如访问需要登录的页面) cy.visit('/profile/') cy.get('#user-avatar').should('exist') }) })
几个关键注意点:
- 确保你的测试账号是专门的测试环境账号,别用生产环境的!
- 如果你的登录页面URL不是默认的
/accounts/login/,记得改成你项目里的实际路径。 - 方案2里的
form: true一定要加,不然Django会识别不了请求体的格式,直接返回400错误。
内容的提问来源于stack exchange,提问作者JL Peyret
相关产品推荐
相关产品推荐

