Browser 在Cypress中,在测试之前在localStorage中设置令牌

Browser 在Cypress中,在测试之前在localStorage中设置令牌,browser,e2e-testing,cypress,Browser,E2e Testing,Cypress,我想登录并在客户端上设置一个localStorage令牌(特别是) 如何按照Cypress文档中的建议,使用cy.request实现这一点?下面是一个添加命令cy.login()的示例,您可以在任何Cypress测试中使用该命令,或者在每个钩子之前放入 Cypress.Commands.add('login',()=>{ 赛义德请求({ 方法:“POST”, 网址:'http://localhost:3000/api/users/login', 正文:{ 用户:{ 电邮:'jake@jake.j

我想登录并在客户端上设置一个
localStorage
令牌(特别是)


如何按照Cypress文档中的建议,使用
cy.request
实现这一点?

下面是一个添加命令
cy.login()
的示例,您可以在任何Cypress测试中使用该命令,或者在每个
钩子之前放入

Cypress.Commands.add('login',()=>{
赛义德请求({
方法:“POST”,
网址:'http://localhost:3000/api/users/login',
正文:{
用户:{
电邮:'jake@jake.jake',
密码:“杰克”,
}
}
})
。然后((resp)=>{
window.localStorage.setItem('jwt',resp.body.user.token)
})
})
然后在你的测试中:

beforeach(()=>{
cy.login()
})

我在这方面花了很多时间,最后我可以有把握地得出结论,它永远不会适用于OAuth请求


它可能适用于本地服务器,但在您获取用于身份验证的令牌时不起作用。

另外,您还可以使用该包在测试之间保留本地存储,因此登录请求只会发出一次:

在support/commands.js中:

导入“cypress localstorage命令”;
add('login',()=>{
赛义德请求({
方法:“POST”,
网址:'http://localhost:3000/api/users/login',
正文:{
用户:{
电邮:'jake@jake.jake',
密码:“杰克”,
}
}
})
.其(‘主体’)
。然后(body=>{
cy.setLocalStorage(“jwt”,body.user.token);
})
});
然后,在测试中:

之前(()=>{
cy.login();
cy.saveLocalStorage();
});
在每个之前(()=>{
恢复性存储();
});

我已经使用了一些类似于Bkucera答案的东西有一段时间了。最近,我在整个测试过程中测试多个角色/登录时遇到了一个问题。基本上,我以管理员身份登录并进行一次测试,然后以非管理员身份登录并进行第二次测试。第一个测试运行良好并结束(cypress清除本地存储),但是在第二个测试开始时,仍有一些xhr请求从第一个测试运行。这些xhr请求不再看到触发我的应用程序看到401未经授权错误并清除本地存储(包括我设置的非管理员令牌)的令牌。现在,第二次测试失败,因为该非管理员令牌在本地存储中不可用

最终,我的解决方案是在测试之前预取令牌,然后在visit的onBeforeLoad函数中设置令牌。这可确保在发出visit命令之前,令牌不会被任何竞赛条件清除

cy.visit('/app', {
    onBeforeLoad: function (window) {
        window.localStorage.setItem('token', myToken);
    }
})

实际上,这是一个非常独特的edge案例,但我希望它能帮助一些人,因为我花了很多时间寻找这个解决方案。

我认为应该更新这个主题的标题。JWT令牌是本次讨论的主要内容

主要的问题是关于JWT令牌的,但一般来说,所有现代应用程序都使用OIDC/并且这里有一个非常棘手的情况,即仅通过API调用生成令牌来获得访问。 我发现
并将使用我的应用程序进行检查。但请确保您在JS方面很酷,并且得到了开发团队的良好帮助;)

这是可行的,但当我访问应用程序URL时,该值会被覆盖。我的应用程序似乎无法读取创建的本地存储。在设置localStorageOnly之前,您需要导航到您的页面,该设置仅适用于您指定的软件包。感谢根据npm上的文档,您应该在
before()
中清除存储,然后在
before
中执行恢复和访问,然后在每次
后保存本地存储<代码>注意beforeach和afterEach用于在所有测试之间保留本地存储。此外,在before语句中使用clearLocalStorageSnapshot,以避免与保存本地存储的其他测试文件可能发生冲突。
Lol xD-没有什么是不可能的,您可以请求检索OAuth提供程序上所需的数据。