我想登录并在客户端设置localStorage
令牌(具体为jwt
)
如何按照赛普拉斯文档中的建议使用cy.request
完成此操作?
答案 0 :(得分:23)
以下是添加可在任何赛普拉斯测试中使用的命令cy.login()
的示例,或放入beforeEach
挂钩。
Cypress.Commands.add('login', () => {
cy.request({
method: 'POST',
url: 'http://localhost:3000/api/users/login',
body: {
user: {
email: 'jake@jake.jake',
password: 'jakejake',
}
}
})
.then((resp) => {
window.localStorage.setItem('jwt', resp.body.user.token)
})
})
然后在你的测试中:
beforeEach(() => {
cy.login()
})
答案 1 :(得分:1)
我已经使用了一些类似bkuceras的答案。最近,在整个测试中测试多个角色/登录时遇到了一个问题。基本上发生的事情是我以管理员身份登录并进行一项测试,然后以非管理员身份登录并进行第二项测试。第一个测试运行良好并结束(赛普拉斯清除了本地存储),但是,第二个测试开始时,第一个测试仍然有一些xhr请求正在运行。这些xhr请求不再看到触发我的应用程序以查看401未经授权错误并清除本地存储的令牌(包括我设置的非管理员令牌)。现在第二次测试失败,因为该非管理员令牌在本地存储中不可用。
最终我的解决方案是在测试之前预取令牌,然后在访问的onBeforeLoad函数中设置令牌。这样可以确保在您的访问命令之前,任何竞争条件都不会清除令牌。
cy.visit('/app', {
onBeforeLoad: function (window) {
window.localStorage.setItem('token', myToken);
}
})
这真的是一个非常独特的优势案例,但是我希望它可以对某人有所帮助,因为我已经花了很多时间来寻找这种解决方案。
答案 2 :(得分:0)
另外,您还可以使用this包在测试之间持久化localStorage,因此登录请求将仅发出一次:
在support / commands.js中:
import "cypress-localstorage-commands";
Cypress.Commands.add('login', () => {
cy.request({
method: 'POST',
url: 'http://localhost:3000/api/users/login',
body: {
user: {
email: 'jake@jake.jake',
password: 'jakejake',
}
}
})
.its('body')
.then(body => {
cy.setLocalStorage("jwt", body.user.token);
})
});
然后,在您的测试中:
before(() => {
cy.login();
cy.saveLocalStorage();
});
beforeEach(() => {
cy.restoreLocalStorage();
});
答案 3 :(得分:0)
我认为应该为此主题更新标题。 JWT令牌是此讨论的主要内容!
主要问题是有关JWT令牌的,但总的来说,所有现代应用程序都使用OIDC Microsoft article - v2-protocols-oidc / ADAL,这是一个非常棘手的情况,仅通过API调用生成令牌即可获得访问权限。 我发现here 并会通过我的应用进行检查。但是请确保您在JS方面很出色,并在DevTeam的帮助下获得了很好的帮助;)
答案 4 :(得分:-1)
我花了很多时间在此上,最后我可以肯定地说,它永远无法用于OAuth请求。
它可能适用于本地服务器,但当您获得身份验证令牌时无效。