使用 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()

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