使用 cy.visit() 时赛普拉斯注销
Cypress logs out when using cy.visit()
我正在发送多个 API 请求并且一切正常,直到我尝试导航到在 API 测试期间生成的页面。当我使用 cy.visit() 函数导航到页面时,我得到了未经授权,并且所有后续请求都在没有授权令牌的情况下发送,即使我向 cy.visit()
函数添加了授权 header。
如有任何帮助,我们将不胜感激
var accessToken
before(function () {
cy.request({
method: 'POST',
url: 'https://someurl.com/connect/token',
form: true,
body: {
grant_type: 'password',
username: 'admin',
password: 'pass',
client_id: 'client_id',
client_secret: 'secret'
}
}).then((response) => {
accessToken = response.body.access_token
})
})
//api requests
it('Navigates to order page', () => {
cy.visit(`https://someurl.com/orders/${orderId}`, { auth: { bearer: accessToken.replace('Bearer ', '') } })
})
您的代码看起来像 Cypress Docs: Core Concepts: Aliases example. Using as 中创建别名的反模式示例,您可以这样做:
before(function () {
cy.request({
method: 'POST',
url: 'https://someurl.com/connect/token',
form: true,
body: {
grant_type: 'password',
username: 'admin',
password: 'pass',
client_id: 'client_id',
client_secret: 'secret'
}
}).then((response) => {
cy.wrap(response.body.access_token).as('accessToken')
})
})
//api requests
it('Navigates to order page', function() {
const accessToken = this.accessToken
cy.visit({
url: `https://someurl.com/orders/${orderId}`,
headers: {
'Authorization': accessToken
}
})
})
注意:有必要将it()
块的闭包从箭头函数改为常规函数,因为箭头函数使用词法作用域this
,并且不会包含在 before()
闭包中创建的别名。
我设法通过将授权从支持的 api 请求更改为前端登录表单然后将本地存储列入白名单来解决问题。
我不得不添加这段代码
Cypress.LocalStorage.clear = function (keys, ls, rs) {
if (keys) {
return
}
}
现在我的规格文件如下所示:
before(function () {
cy.server()
cy.route('GET', '/api/orders/orders?PageNo=1&Size=20').as('orders')
cy.LogIn('email', 'pass')
//wrapping access token from the request after successfull authorization
cy.wait('@orders').then((request) => {
cy.wrap(request.requestHeaders.Authorization).as('accessToken')
})
//whitelisting local storage
Cypress.LocalStorage.clear = function (keys, ls, rs) {
if (keys) {
return
}
}
})
it('A',()=>{
cy.visit('some url') //it works!
})
另外,当重新启动测试时,我仍然处于登录状态。为了防止这种情况发生,我在 before() 函数的开头添加了清除本地存储
window.localStorage.clear()
我正在发送多个 API 请求并且一切正常,直到我尝试导航到在 API 测试期间生成的页面。当我使用 cy.visit() 函数导航到页面时,我得到了未经授权,并且所有后续请求都在没有授权令牌的情况下发送,即使我向 cy.visit()
函数添加了授权 header。
如有任何帮助,我们将不胜感激
var accessToken
before(function () {
cy.request({
method: 'POST',
url: 'https://someurl.com/connect/token',
form: true,
body: {
grant_type: 'password',
username: 'admin',
password: 'pass',
client_id: 'client_id',
client_secret: 'secret'
}
}).then((response) => {
accessToken = response.body.access_token
})
})
//api requests
it('Navigates to order page', () => {
cy.visit(`https://someurl.com/orders/${orderId}`, { auth: { bearer: accessToken.replace('Bearer ', '') } })
})
您的代码看起来像 Cypress Docs: Core Concepts: Aliases example. Using as 中创建别名的反模式示例,您可以这样做:
before(function () {
cy.request({
method: 'POST',
url: 'https://someurl.com/connect/token',
form: true,
body: {
grant_type: 'password',
username: 'admin',
password: 'pass',
client_id: 'client_id',
client_secret: 'secret'
}
}).then((response) => {
cy.wrap(response.body.access_token).as('accessToken')
})
})
//api requests
it('Navigates to order page', function() {
const accessToken = this.accessToken
cy.visit({
url: `https://someurl.com/orders/${orderId}`,
headers: {
'Authorization': accessToken
}
})
})
注意:有必要将it()
块的闭包从箭头函数改为常规函数,因为箭头函数使用词法作用域this
,并且不会包含在 before()
闭包中创建的别名。
我设法通过将授权从支持的 api 请求更改为前端登录表单然后将本地存储列入白名单来解决问题。
我不得不添加这段代码
Cypress.LocalStorage.clear = function (keys, ls, rs) {
if (keys) {
return
}
}
现在我的规格文件如下所示:
before(function () {
cy.server()
cy.route('GET', '/api/orders/orders?PageNo=1&Size=20').as('orders')
cy.LogIn('email', 'pass')
//wrapping access token from the request after successfull authorization
cy.wait('@orders').then((request) => {
cy.wrap(request.requestHeaders.Authorization).as('accessToken')
})
//whitelisting local storage
Cypress.LocalStorage.clear = function (keys, ls, rs) {
if (keys) {
return
}
}
})
it('A',()=>{
cy.visit('some url') //it works!
})
另外,当重新启动测试时,我仍然处于登录状态。为了防止这种情况发生,我在 before() 函数的开头添加了清除本地存储
window.localStorage.clear()