我正在发送多个API请求,并且一切正常,直到尝试导航到API测试期间生成的页面为止。当我使用cy.visit()函数导航到页面时,即使我向cy.visit()
函数添加了授权标头,我也遭到了未经授权,并且所有后续请求都没有授权令牌地发送。
任何帮助将不胜感激
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 ', '') } })
})
答案 0 :(得分:0)
您的代码看起来像Cypress Docs: Core Concepts: Aliases示例中的反模式示例。使用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()
闭包中创建的别名。
答案 1 :(得分:0)
我设法通过将授权从支持的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()