Cypress e2e: I am unable to use saved cookies cy.session() in my 'it' block. I am learning Cypress, sorry if something I missed

Viewed 150

I tried to use the saved session in 'it' block, but it's opening the "baseurl/index.php/dashboard" so it means opening fresh login page. I am trying to use the saved cookies so that I can directly visit/use in another 'it' block. Kindly help.

import testdata from '../../fixtures/testdata.json'
describe('Example to demonstrate the use `each` in Cypress', function () {
    const loginPage = (username, password) => {
        cy.session([username, password], () => {
            cy.visit('/') // baseUrl: "https://opensource-demo.orangehrmlive.com/"
            cy.get('#txtUsername').type(username)
            cy.get('#txtPassword').type(username)
            cy.get('#btnLogin').click()
        })
    }
    beforeEach('Loading test data', function () {
        loginPage(testdata.username, testdata.password)
    })
    it('Validating the Quick Launch menu', function () {
        cy.visit('/index.php/dashboard')
        cy.get('.quickLaungeContainer').each(($el, index) => {
            expect($el).to.contain(this.testdata.quickLaunch[index])
        })
    })
})
1 Answers

The code looks like it should work, you have username twice instead of password but I assume that's a typo.

In case the cookie isn't set as expected you can add a validate function to help you debug the cy.session()

See Gleb's video Use cy.session Command To Prepare Test Data But Only When Needed, about 4 minutes in is the TLDR point.

The idea is to use validate() to assert the condition you assume will be true after the setup() has run.

In this case, just want to check a cookie has been set on the domain. If it does not happen, the setup() tries again and if still not passing validate() the test fails.

It's also useful if one of your tests deliberately removes the cookie, then the next test will cause it to be re-fetched.

testdata.json

{
  username: ...,
  password: ...,
  quicklaunch: [...],
  cookieName: 'orangehrmlive'  // check actual name in devtools
}

Test

import testdata from '../../fixtures/testdata.json'

describe('Example to demonstrate the use `each` in Cypress', function () {
    const loginPage = (username, password) => {
        const setup = () => {
          cy.visit('/') // baseUrl: "https://opensource-demo.orangehrmlive.com/"
          cy.get('#txtUsername').type(username)
          cy.get('#txtPassword').type(password)
          cy.get('#btnLogin').click()
        }
        const validate = () => {
          cy.getCookie(testdata.cookieName).should('exist')
        }
        cy.session([username, password], setup, {validate})
    }
    beforeEach('Loading test data', function () {
        loginPage(testdata.username, testdata.password)
    })
    it('Validating the Quick Launch menu', function () {
        cy.visit('/index.php/dashboard')
        cy.get('.quickLaungeContainer').each(($el, index) => {
            expect($el).to.contain(this.testdata.quickLaunch[index])
        })
    })
})
 
Related