以下是添加一个命令cy.login()
的示例,你可以在任何Cypress测试中使用它,或将其放置在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()
})
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();
});
before()
中清除存储,然后在beforeEach
中进行恢复和访问,最后在afterEach
中保存localstorage。请注意,在所有测试之间保留localStorage的使用beforeEach
和afterEach
。此外,在before语句中使用clearLocalStorageSnapshot以避免与其他测试文件保留localStorage可能发生的冲突。 - dragon788cy.setLocalStorage
命令。它只能在你启动了一个 API,并且该 API 在 http://localhost:3000/api/users/login
上返回一个带有 JSON 主体和 user.token
属性的响应时才能正常工作。你需要根据自己的情况来调整登录请求和响应。 - Javier Breacypress-localstorage-commands
Cypress 插件的使用,而你提到的博客文章与此无关。 - Javier Brea我已经使用过类似bkuceras回答的东西一段时间了。最近,在测试多个角色/登录时遇到了一个问题。基本上是我以管理员身份登录并进行了一次测试,然后我以非管理员身份登录并进行第二次测试。第一个测试正常运行并结束(cypress清除本地存储),但是当第二个测试开始时,第一个测试仍在运行某些xhr请求。这些xhr请求不再看到令牌,从而触发我的应用程序看到401未经授权的错误并清除本地存储(包括我设置的非管理员令牌)。现在第二个测试失败了,因为该非管理员令牌在本地存储中不可用。
最终我的解决方案是在测试之前预取令牌,然后在visit的onBeforeLoad函数中设置令牌。这确保了在访问命令之前没有任何竞争条件会清除令牌。
cy.visit('/app', {
onBeforeLoad: function (window) {
window.localStorage.setItem('token', myToken);
}
})
实际上这是一个相当独特的边缘情况,但希望这可以帮助某人,因为我花了很多时间找到这个解决方案。
Cypress.Commands.add('login', (username, password) => {
cy.session([username, password], () => {
cy.request({
method: 'POST',
url: '/login',
body: { username, password },
}).then(({ body }) => {
window.localStorage.setItem('authToken', body.token)
})
})
})
更多信息请查看官方Cypress文档: https://docs.cypress.io/api/commands/session
我认为这个主题的标题应该更新一下。JWT令牌是这次讨论的重点!
主要问题是关于JWT令牌的,但总的来说,所有现代应用程序都在使用OIDC Microsoft article - v2-protocols-oidc / ADAL,并且在仅通过API调用生成令牌来获取访问权限时,这里有一个非常棘手的情况。
我在这里找到了
并将其与我的应用程序进行检查。但请确保您精通JS,并且从您的DevTeam获得良好的协助;)
我已经花费了很多时间在这上面,最终可以得出结论:它永远不会适用于OAuth请求。
它可能适用于本地服务器,但在获取身份验证令牌时不起作用。
cy.window().then(win => win.localStorage.setItem('jwt', resp.body.user.token))
- guillaumepn