使用cy.visit()时,赛普拉斯注销

时间:2020-08-04 16:37:04

标签: javascript automated-tests authorization cypress

我正在发送多个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 ', '') } })
    })

enter image description here

enter image description here

2 个答案:

答案 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()

https://github.com/cypress-io/cypress/issues/461