无法使用赛普拉斯发送 POST 登录请求

Posted

技术标签:

【中文标题】无法使用赛普拉斯发送 POST 登录请求【英文标题】:Unable to send a POST login request using Cypress 【发布时间】:2021-10-26 05:40:39 【问题描述】:

我正在使用 Cypress 为网站编写端到端测试,并希望发出 API POST 请求来验证用户身份。

我已经能够发出一个带有适当 jwt 的 200 响应代码的请求。

这是请求的代码 sn-p:

Cypress.Commands.add('login', () => 

cy.request(
    method: 'POST',
    url: 'https://api.website.com/api/login',
    body: 
        email: "xxx",
        password: "xxx"
    
).then((resp) => 
    window.localStorage.setItem('jwt', resp.body.token)
    // console.log(resp.body.token)
    cy.log(resp)
)
cy.visit('/')

这是赛普拉斯测试输出的图像: Cypress test

这是 Chrome 控制台的图像,显​​示了成功的响应代码: Chrome console

阅读Cypress command log后,我注意到白色圆圈表示请求无法到达服务器(请求被存根)。发生这种情况的可能原因是什么?

提前致谢!

【问题讨论】:

“白色圆圈”是什么意思?你可以试试这个cy.log(JSON.stringify(resp))吗? 【参考方案1】:

在这个section of the docs

cy.intercept() 无法使用 cy.request() 进行调试! Cypress 仅拦截您的前端应用程序发出的请求。

这意味着您在测试中发出的任何cy.request() 都不能被拦截,因此不能被存根。

我会说白色圆圈表示响应是从浏览器缓存中提供的(只是猜测)。

【讨论】:

【参考方案2】:

更新

我已经设法解决了我的问题。但是,该请求有效,我没有在本地存储中设置正确的数据以进行身份​​验证。使用谷歌浏览器开发者工具后,发现请求后需要设置 auth._token.local 和 auth.refresh_token.local。我附上了下面的代码 sn-p 以帮助遇到类似问题的任何人。谢谢。

cy.request(
    method: 'POST',
    url: 'http://127.0.0.1:8000/api/login',
    body: 
        email: "email",
        password: "password",
    
).then((resp) => 
    localStorage.setItem('auth._token.local', 'Bearer ' + resp.body.token)
    localStorage.setItem('auth._refresh_token.local', false)
);
cy.visit('/');

【讨论】:

以上是关于无法使用赛普拉斯发送 POST 登录请求的主要内容,如果未能解决你的问题,请参考以下文章

赛普拉斯没有看到 graphql 请求

赛普拉斯自定义命令无法识别

当我尝试使用赛普拉斯登录帐户时如何使用 2FA?

无法通过赛普拉斯加载我的 Azure 托管 Web 应用程序

无法从赛普拉斯的 html 正文中提取 CSRF 令牌

如何在赛普拉斯的所有测试套件之前执行代码?