diff --git a/packages/app/cypress/e2e/runner/sessions.ui.cy.ts b/packages/app/cypress/e2e/runner/sessions.ui.cy.ts index 26670f450f24..99f820ffd3e0 100644 --- a/packages/app/cypress/e2e/runner/sessions.ui.cy.ts +++ b/packages/app/cypress/e2e/runner/sessions.ui.cy.ts @@ -19,10 +19,7 @@ const validateSetupSessionGroup = (isNewSession = true) => { cy.get('@setupSession').find('.command-expander').click() cy.get('@setupSession').find('.command-alias').contains('runSetup') - return cy.contains(groupText) - .closest('.command') - .find('.command-name-Clear-page') - .should('have.length', 1) + return cy.get('@setupSession') } describe('runner/cypress sessions.ui.spec', { @@ -200,7 +197,7 @@ describe('runner/cypress sessions.ui.spec', { cy.contains('user1') cy.contains('restored') - cy.get('.command-name-Clear-page').should('have.length', 1) + cy.get('.command-name-Clear-page').should('have.length', 2) cy.contains('Restore saved session') @@ -258,7 +255,7 @@ describe('runner/cypress sessions.ui.spec', { .find('.command-expander') .should('have.class', 'command-expander-is-open') - cy.get('.command-name-Clear-page').should('have.length', 2) + cy.get('.command-name-Clear-page').should('have.length', 3) validateSetupSessionGroup(false) @@ -321,8 +318,6 @@ describe('runner/cypress sessions.ui.spec', { cy.get('.command-name-Clear-page').should('have.length', 2) validateSetupSessionGroup(false) - .parent() - .closest('.command') .next() .contains('Validate session') .closest('.command').as('secondValidateSession') diff --git a/packages/driver/cypress/e2e/commands/sessions/sessions.cy.js b/packages/driver/cypress/e2e/commands/sessions/sessions.cy.js index 5496293f081a..b9dc24937e4a 100644 --- a/packages/driver/cypress/e2e/commands/sessions/sessions.cy.js +++ b/packages/driver/cypress/e2e/commands/sessions/sessions.cy.js @@ -24,27 +24,6 @@ const clearAllSavedSessions = () => { }) } -// In webkit, the clear page and clear cookies, etc log messages may be reversed. This isn't an issue, but we just want to test we have both messages. -const validateClearLogs = (logs, sessionGroupId) => { - let clearPageLogIndex = 0 - let clearCookiesIndex = 1 - - if (logs[1].get('name') === 'Clear page') { - clearPageLogIndex = 1 - clearCookiesIndex = 0 - } - - expect(logs[clearPageLogIndex].get()).to.contain({ - name: 'Clear page', - group: sessionGroupId, - }) - - expect(logs[clearCookiesIndex].get()).to.contain({ - displayName: 'Clear cookies, localStorage and sessionStorage', - group: sessionGroupId, - }) -} - describe('cy.session', { retries: 0 }, () => { describe('args', () => { it('accepts string as id', () => { @@ -147,9 +126,6 @@ describe('cy.session', { retries: 0 }, () => { const handleValidate = () => { // both create & restore session clears page after running - cy.contains('Default blank page') - cy.contains('This page was cleared by navigating to about:blank.') - cy.visit('/fixtures/auth/index.html') cy.contains('Welcome tester') } @@ -205,7 +181,7 @@ describe('cy.session', { retries: 0 }, () => { }) // test must be first to run before blank page visit between each test - it('clears page after setup runs', () => { + it('clears page after command runs', () => { cy.url().should('eq', 'about:blank') }) @@ -225,7 +201,15 @@ describe('cy.session', { retries: 0 }, () => { }, }) - validateClearLogs([logs[1], logs[2]], sessionGroupId) + expect(logs[1].get()).to.contain({ + name: 'Clear page', + group: sessionGroupId, + }) + + expect(logs[2].get()).to.contain({ + displayName: 'Clear cookies, localStorage and sessionStorage', + group: sessionGroupId, + }) const createNewSessionGroup = logs[3].get() @@ -242,7 +226,7 @@ describe('cy.session', { retries: 0 }, () => { expect(logs[5].get()).to.contain({ name: 'Clear page', - group: createNewSessionGroup.id, + group: sessionGroupId, }) }) @@ -285,8 +269,8 @@ describe('cy.session', { retries: 0 }, () => { }) // test must be first to run before blank page visit between each test - it('does not clear page visit from validate function', () => { - cy.url().should('contain', '/fixtures/auth/index.html') + it('clears page after command runs', () => { + cy.url().should('eq', 'about:blank') }) it('successfully creates new session and validates it', () => { @@ -306,7 +290,15 @@ describe('cy.session', { retries: 0 }, () => { }, }) - validateClearLogs([logs[1], logs[2]], sessionGroupId) + expect(logs[1].get()).to.contain({ + name: 'Clear page', + group: sessionGroupId, + }) + + expect(logs[2].get()).to.contain({ + displayName: 'Clear cookies, localStorage and sessionStorage', + group: sessionGroupId, + }) const createNewSessionGroup = logs[3].get() @@ -321,22 +313,22 @@ describe('cy.session', { retries: 0 }, () => { group: createNewSessionGroup.id, }) - expect(logs[5].get()).to.contain({ - name: 'Clear page', - group: createNewSessionGroup.id, - }) - - const validateSessionGroup = logs[6].get() + const validateSessionGroup = logs[5].get() expect(validateSessionGroup).to.contain({ displayName: 'Validate session', group: sessionGroupId, }) - expect(logs[7].get()).to.deep.contain({ + expect(logs[6].get()).to.deep.contain({ alias: ['validateSession'], group: validateSessionGroup.id, }) + + expect(logs[7].get()).to.contain({ + name: 'Clear page', + group: sessionGroupId, + }) }) }) @@ -348,7 +340,7 @@ describe('cy.session', { retries: 0 }, () => { cy.once('fail', (err) => { expect(setup).to.be.calledOnce expect(validate).to.be.calledOnce - expect(clearPageCount, 'total times session cleared the page').to.eq(2) + expect(clearPageCount, 'total times session cleared the page').to.eq(1) expect(err.message).to.contain('This error occurred while validating the created session') expect(logs[0].get()).to.deep.contain({ name: 'session', @@ -360,7 +352,15 @@ describe('cy.session', { retries: 0 }, () => { }, }) - validateClearLogs([logs[1], logs[2]], sessionGroupId) + expect(logs[1].get()).to.contain({ + name: 'Clear page', + group: sessionGroupId, + }) + + expect(logs[2].get()).to.contain({ + displayName: 'Clear cookies, localStorage and sessionStorage', + group: sessionGroupId, + }) const createNewSessionGroup = logs[3].get() @@ -375,19 +375,14 @@ describe('cy.session', { retries: 0 }, () => { group: createNewSessionGroup.id, }) - expect(logs[5].get()).to.contain({ - name: 'Clear page', - group: createNewSessionGroup.id, - }) - - const validateSessionGroup = logs[6].get() + const validateSessionGroup = logs[5].get() expect(validateSessionGroup).to.contain({ displayName: 'Validate session', group: sessionGroupId, }) - expect(logs[7].get()).to.deep.contain({ + expect(logs[6].get()).to.deep.contain({ alias: ['validateSession'], group: validateSessionGroup.id, }) @@ -426,7 +421,7 @@ describe('cy.session', { retries: 0 }, () => { it('successfully restores saved session', () => { expect(setup).to.not.be.called expect(validate).to.not.be.called - expect(clearPageCount, 'total times session cleared the page').to.eq(1) + expect(clearPageCount, 'total times session cleared the page').to.eq(2) }) it('groups session logs correctly', () => { @@ -445,7 +440,15 @@ describe('cy.session', { retries: 0 }, () => { }, }) - validateClearLogs([logs[1], logs[2]], sessionGroupId) + expect(logs[1].get()).to.contain({ + name: 'Clear page', + group: sessionGroupId, + }) + + expect(logs[2].get()).to.contain({ + displayName: 'Clear cookies, localStorage and sessionStorage', + group: sessionGroupId, + }) const restoreSavedSessionGroup = logs[3].get() @@ -474,14 +477,14 @@ describe('cy.session', { retries: 0 }, () => { }) // test must be first to run before blank page visit between each test - it('does not clear page visit from validate function', () => { - cy.url().should('contain', '/fixtures/auth/index.html') + it('clears page after command runs', () => { + cy.url().should('eq', 'about:blank') }) it('successfully restores saved session', () => { expect(setup).to.not.be.called expect(validate).to.be.calledOnce - expect(clearPageCount, 'total times session cleared the page').to.eq(1) + expect(clearPageCount, 'total times session cleared the page').to.eq(2) }) it('groups session logs correctly', () => { @@ -500,7 +503,15 @@ describe('cy.session', { retries: 0 }, () => { }, }) - validateClearLogs([logs[1], logs[2]], sessionGroupId) + expect(logs[1].get()).to.contain({ + name: 'Clear page', + group: sessionGroupId, + }) + + expect(logs[2].get()).to.contain({ + displayName: 'Clear cookies, localStorage and sessionStorage', + group: sessionGroupId, + }) const restoreSavedSessionGroup = logs[3].get() @@ -548,8 +559,8 @@ describe('cy.session', { retries: 0 }, () => { }) // test must be first to run before blank page visit between each test - it('does not clear page visit from validate function', () => { - cy.url().should('contain', '/fixtures/auth/index.html') + it('clears page after command runs', () => { + cy.url().should('eq', 'about:blank') }) it('successfully recreates session', () => { @@ -574,7 +585,15 @@ describe('cy.session', { retries: 0 }, () => { }, }) - validateClearLogs([logs[1], logs[2]], sessionGroupId) + expect(logs[1].get()).to.contain({ + name: 'Clear page', + group: sessionGroupId, + }) + + expect(logs[2].get()).to.contain({ + displayName: 'Clear cookies, localStorage and sessionStorage', + group: sessionGroupId, + }) const restoreSavedSessionGroup = logs[3].get() @@ -598,7 +617,15 @@ describe('cy.session', { retries: 0 }, () => { // this error is associated with the group since the validation rejected expect(logs[4].get('error').message).to.contain('This error occurred while validating the restored session') - validateClearLogs([logs[6], logs[7]], sessionGroupId) + expect(logs[6].get()).to.contain({ + name: 'Clear page', + group: sessionGroupId, + }) + + expect(logs[7].get()).to.contain({ + displayName: 'Clear cookies, localStorage and sessionStorage', + group: sessionGroupId, + }) const createNewSessionGroup = logs[8].get() @@ -613,22 +640,22 @@ describe('cy.session', { retries: 0 }, () => { group: createNewSessionGroup.id, }) - expect(logs[10].get()).to.contain({ - name: 'Clear page', - group: createNewSessionGroup.id, - }) - - const secondValidateSessionGroup = logs[11].get() + const secondValidateSessionGroup = logs[10].get() expect(secondValidateSessionGroup).to.contain({ displayName: 'Validate session', group: sessionGroupId, }) - expect(logs[12].get()).to.deep.contain({ + expect(logs[11].get()).to.deep.contain({ alias: ['validateSession'], group: secondValidateSessionGroup.id, }) + + expect(logs[12].get()).to.contain({ + name: 'Clear page', + group: sessionGroupId, + }) }) }) @@ -638,7 +665,7 @@ describe('cy.session', { retries: 0 }, () => { cy.log('Creating new session for test') cy.session(`session-${Cypress.state('test').id}`, setup, { validate }) .then(() => { - // reset and only test restored session + // reset and only test restored session resetMocks() validate.callsFake(() => Promise.reject(false)) }) @@ -647,7 +674,7 @@ describe('cy.session', { retries: 0 }, () => { expect(err.message).to.contain('Your `cy.session` **validate** promise rejected with false') expect(setup).to.be.calledOnce expect(validate).to.be.calledTwice - expect(clearPageCount, 'total times session cleared the page').to.eq(3) + expect(clearPageCount, 'total times session cleared the page').to.eq(2) expect(logs[0].get()).to.contain({ name: 'session', @@ -664,7 +691,15 @@ describe('cy.session', { retries: 0 }, () => { }, }) - validateClearLogs([logs[1], logs[2]], sessionGroupId) + expect(logs[1].get()).to.contain({ + name: 'Clear page', + group: sessionGroupId, + }) + + expect(logs[2].get()).to.contain({ + displayName: 'Clear cookies, localStorage and sessionStorage', + group: sessionGroupId, + }) const restoreSavedSessionGroup = logs[3].get() @@ -688,7 +723,15 @@ describe('cy.session', { retries: 0 }, () => { // this error is associated with the group since the validation rejected expect(logs[4].get('error').message).to.contain('Your `cy.session` **validate** promise rejected with false.') - validateClearLogs([logs[6], logs[7]], sessionGroupId) + expect(logs[6].get()).to.contain({ + name: 'Clear page', + group: sessionGroupId, + }) + + expect(logs[7].get()).to.contain({ + displayName: 'Clear cookies, localStorage and sessionStorage', + group: sessionGroupId, + }) const createNewSessionGroup = logs[8].get() @@ -703,19 +746,14 @@ describe('cy.session', { retries: 0 }, () => { group: createNewSessionGroup.id, }) - expect(logs[10].get()).to.contain({ - name: 'Clear page', - group: createNewSessionGroup.id, - }) - - const secondValidateSessionGroup = logs[11].get() + const secondValidateSessionGroup = logs[10].get() expect(secondValidateSessionGroup).to.contain({ displayName: 'Validate session', group: sessionGroupId, }) - expect(logs[12].get()).to.deep.contain({ + expect(logs[11].get()).to.deep.contain({ alias: ['validateSession'], group: secondValidateSessionGroup.id, }) diff --git a/packages/driver/src/cy/commands/sessions/index.ts b/packages/driver/src/cy/commands/sessions/index.ts index ef7b92ea34bf..83e66dfec70a 100644 --- a/packages/driver/src/cy/commands/sessions/index.ts +++ b/packages/driver/src/cy/commands/sessions/index.ts @@ -55,10 +55,7 @@ export default function (Commands, Cypress, cy) { return } - // Component testing does not support navigation and handles clearing the page via mount utils - const clearPage = Cypress.testingType === 'e2e' ? navigateAboutBlank(false) : new Cypress.Promise.resolve() - - return clearPage + return navigateAboutBlank(false) .then(() => sessions.clearCurrentSessionData()) .then(() => Cypress.backend('reset:rendered:html:origins')) } @@ -196,7 +193,6 @@ export default function (Commands, Cypress, cy) { }) .then(async () => { cy.state('onQueueFailed', null) - await navigateAboutBlank() const data = await sessions.getCurrentSessionData() _.extend(existingSession, data) @@ -441,7 +437,7 @@ export default function (Commands, Cypress, cy) { await navigateAboutBlank() await sessions.clearCurrentSessionData() - return createSession(existingSession, step) + return cy.whenStable(() => createSession(existingSession, step)) }) .then(() => validateSession(existingSession, step)) .then(async (isValidSession: boolean) => { @@ -513,7 +509,10 @@ export default function (Commands, Cypress, cy) { return restoreSessionWorkflow(session) }).then(() => { - _log.set({ state: 'passed' }) + return navigateAboutBlank() + .then(() => { + _log.set({ state: 'passed' }) + }) }) }) }, diff --git a/packages/driver/src/cy/commands/sessions/utils.ts b/packages/driver/src/cy/commands/sessions/utils.ts index 0c4e7ba3c017..bac14834bc91 100644 --- a/packages/driver/src/cy/commands/sessions/utils.ts +++ b/packages/driver/src/cy/commands/sessions/utils.ts @@ -194,13 +194,18 @@ const getPostMessageLocalStorage = (specWindow, origins): Promise => { } function navigateAboutBlank (session: boolean = true) { - if (Cypress.config('testIsolation') === 'off') { - return + // Component testing does not support navigation and handles clearing the page via mount utils + if (Cypress.testingType === 'component' || Cypress.config('testIsolation') === 'off') { + return Promise.resolve() } - Cypress.action('cy:url:changed', '') + return new Promise((resolve) => { + cy.once('window:load', resolve) - return Cypress.action('cy:visit:blank', { type: session ? 'session' : 'session-lifecycle' }) as unknown as Promise + Cypress.action('cy:url:changed', '') + + return Cypress.action('cy:visit:blank', { type: session ? 'session' : 'session-lifecycle' }) as unknown as Promise + }) } const statusMap = {