cypress - 有没有办法在赛普拉斯的测试之间保持会话存储
问题描述
我目前正在开发一个将信息保存在会话存储中的应用程序。在登录过程之后,我看到 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()”中设置会话存储项目,但同样的问题发生了。
任何帮助表示赞赏,谢谢:)
解决方案
该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
})
})
登录示例
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
})