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

Cit*_*nex 5 session-storage 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()

    })
Run Code Online (Sandbox Code Playgroud)

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

如有任何帮助,我们将不胜感激,谢谢:)

Pao*_*olo 6

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

beforeEach()您不仅需要调用它一次 test before(),而且 setup 函数只调用一次。

这是一个概念验证

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
  })
})
Run Code Online (Sandbox Code Playgroud)

登录示例

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
})
Run Code Online (Sandbox Code Playgroud)