In Cypress, set a token in localStorage before test
我想登录并在客户端上设置一个
按照赛普拉斯文档中的建议,我如何使用
这是一个添加命令
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | Cypress.Commands.add('login', () => { cy.request({ method: 'POST', url: 'http://localhost:3000/api/users/login', body: { user: { email: '[email protected]', password: 'jakejake', } } }) .then((resp) => { window.localStorage.setItem('jwt', resp.body.user.token) }) }) |
那么在你的测试中:
1 2 3 | beforeEach(() => { cy.login() }) |
另外,您还可以使用 cypress-localstorage-commands 包在测试之间持久化 localStorage,因此登录请求只会发出一次:
在 support/commands.js:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | import"cypress-localstorage-commands"; Cypress.Commands.add('login', () => { cy.request({ method: 'POST', url: 'http://localhost:3000/api/users/login', body: { user: { email: '[email protected]', password: 'jakejake', } } }) .its('body') .then(body => { cy.setLocalStorage("jwt", body.user.token); }) }); |
然后,在你的测试中:
1 2 3 4 5 6 7 8 | before(() => { cy.login(); cy.saveLocalStorage(); }); beforeEach(() => { cy.restoreLocalStorage(); }); |
我已经使用了一些类似 bkuceras answer 的东西有一段时间了。最近,我在整个测试过程中测试多个角色/登录时遇到了一个问题。基本上发生的事情是我以管理员身份登录并进行一次测试,然后我以非管理员身份登录并进行第二次测试。第一个测试运行良好并结束(cypress 清除本地存储),但是当第二个测试开始时,仍然有一些 xhr 请求从第一个测试运行。这些 xhr 请求不再看到触发我的应用程序看到 401 未授权错误并清除本地存储(包括我设置的非管理员令牌)的令牌。现在第二次测试失败了,因为该非管理员令牌在本地存储中不可用。
最终我的解决方案是在测试前预取token,然后在访问的onBeforeLoad函数中设置token。这可确保令牌在您的访问命令之前不会被任何竞争条件清除。
1 2 3 4 5 | cy.visit('/app', { onBeforeLoad: function (window) { window.localStorage.setItem('token', myToken); } }) |
确实这是一个非常独特的边缘案例,但希望它可以帮助某人,因为我已经花了很多时间来寻找这个解决方案。
我认为应该为这个主题更新标题。 JWT 令牌是本次讨论的主要内容!
主要问题是关于 JWT 令牌,但总的来说,所有现代应用程序都在使用 OIDC Microsoft 文章 - v2-protocols-oidc / ADAL,这是一个非常棘手的情况,仅使用通过 API 调用生成令牌来获取访问权限。
我在这里发现
并将使用我的应用程序进行检查。但请确保您在 JS 方面很出色,并且从您的 DevTeam 那里得到了很好的帮助;)
我在这方面花了很多时间,最后我可以有把握地得出结论,它永远不会适用于 OAuth 请求。
它可能适用于本地服务器,但在您获取令牌进行身份验证时不起作用。