【问题标题】:Is there a way to keep session Storage between tests in Cypress有没有办法在赛普拉斯的测试之间保持会话存储
【发布时间】:2021-10-29 10:07:45
【问题描述】:

我目前正在开发一个将信息保存在 Session Storage 中的应用程序。在登录过程之后,我看到 Session Storage 被清除并且 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()”中设置会话存储项,但出现同样的问题。

感谢任何帮助,谢谢:)

【问题讨论】:

    标签: cypress session-storage


    【解决方案1】:

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

    你需要调用它beforeEach() test 不只是一次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
    })
    

    【讨论】:

    • 我不确定你在回答什么,Paolo。我认为您的答案是表明会话缓存仅使用一次。但是,我要避免的是必须多次登录应用程序。 beforeEach 中没有 cy.visit() 会提示我在每次测试之前重新登录吗?
    • 不,cy.session() 回调中的代码只被调用一次(如图所示)。您的登录信息也会进入该回调。 beforeEach() 在每次测试之前运行,但在后续测试中,状态是从会话缓存中设置的。这在您的登录产生 cookie、sessionStorage 密钥或 localStorage 密钥时有效。
    • 谢谢你,你的例子在世界上都很有意义。非常感谢
    【解决方案2】:

    您可以使用cy.session()[Cypess docs] 来实现此目的。这是一个实验性 API。因此,要使用它,请将 experimentalSessionSupport 的标志设置为您的 cypress.json 中的 true。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-08-02
      • 2018-05-01
      • 2020-11-06
      • 1970-01-01
      • 2021-06-13
      • 1970-01-01
      • 2023-02-14
      • 2021-11-06
      相关资源
      最近更新 更多