有没有办法在赛普拉斯的测试之间保持会话存储

Is there a way to keep session Storage between tests in Cypress

我目前正在开发一个将信息保存在会话存储中的应用程序。登录过程结束后,我看到会话存储被清除,DOM 刷新回登录屏幕。 我想在每个规范的测试之间保留会话存储,这样我就不必不断注销并重新登录以检查同一容器中的多个内容。

我当前的设置如下所示:

describe('Quickpanel', () => {
    before(() => {
    
        cy.visit(base_url, {onBeforeLoad: (window) => {
            window.sessionStorage.setItem('someInfo',
            `{"SubsId":${info[0]},"RId":${nfo[1]}}`)
           window.sessionStorage.setItem('loc', `${info[2]}`)
        }})

        LoginPage
            .login(login_username, login_password)

        Navbar
            .clickOnBookingsSubLink('Beta Calendar')
            .verifyCalendarLoads()
            .clickBookReservationButton()
            .verifyQuickPanelIsOpen()

    })

第一个测试运行良好,设置了正确的会话存储值,并使用提供的信息创建了其他值。当我移动到第二个“It()”时,会话存储消失了。 我也尝试在“beforeEach()”中设置会话存储项目,但出现同样的问题。

感谢任何帮助,谢谢:)

您可以使用 cy.session()[Cypess docs] 来实现这一点。这是一个实验性的 API。因此,要使用它,请在 cypress.json.

中将 experimentalSessionSupport 的标志设置为 true

cy.session() 命令是一个缓存 - 里面的任何东西都不会被多次调用。

您需要调用它 beforeEach() 测试不只是一次 before() 但设置函数只调用一次。

这是一个概念验证

Cypress.config('experimentalSessionSupport', true)

let sessionCallCount = 0;

Cypress.session.clearAllSavedSessions()   // to avoid caching across browser reload

beforeEach(() => {                   
  cy.session('mySession', () => {     
    cy.visit('https://example.com', {
      onBeforeLoad: (window) => {
        window.sessionStorage.setItem('myKey', 'someInfo')
        sessionCallCount++
      }
    })
  })
})

it('t1', () => {
  cy.window().then(window => {
    let data = window.sessionStorage.getItem('myKey')
    expect(data).to.eq('someInfo')
    expect(sessionCallCount).to.eq(1)
  })
})

it('t2', () => {
  cy.window().then(window => {
    let data = window.sessionStorage.getItem('myKey')
    expect(data).to.eq('someInfo')          
    expect(sessionCallCount).to.eq(1)        // cached code is called only once
  })
})

登录示例

Cypress.config('experimentalSessionSupport', true)

Cypress.session.clearAllSavedSessions()   // to avoid caching across browser reload

beforeEach(() => {                   
  cy.session('mySession', () => {     
    cy.visit('https://example.com', {
      onBeforeLoad: (window) => {
        cy.login(userName, password)  // sets a cookie
      }
    })
  })
})

it('t1', () => {
  cy.visit('https://example.com')  // uses cookie  set by cy.login call
})

it('t2', () => {
  cy.visit('https://example.com')  // uses cookie preserved by cy.session cache
                                   // so app sees logged-in state
                                   // and does not redirect to login page
})