Cypress is a powerful testing framework for end-to-end web application testing. If you haven’t used it for some time and want to remind yourself how to set it up and what the commands look like, I have prepared a complete cheat sheet to help you quickly get back on track.
Setup and Configuration
Install Cypress:
npm install cypress --save-dev
Open Cypress Test Runner:
npx cypress open
Configuration:
Put all the configuration into the cypress.json
file:
{
"baseUrl": "http://localhost:3000",
"viewportWidth": 1280,
"viewportHeight": 720
}
Writing the test
Example:
describe('My First Test', () => {
it('Visits the site', () => {
cy.visit('https://example.com')
cy.contains('example').click()
cy.url().should('include', '/example/page')
cy.get('#email').type('test@example.com')
.should('have.value', 'test@example.com')
})
})
Selectors
Basic Selectors:
cy.get('button') // By tag name
cy.get('.btn-primary') // By class
cy.get('#submit') // By id
cy.get('[name="email"]') // By attribute
Chaining Selectors:
cy.get('form').find('input[name="email"]')
Using Contains:
cy.contains('Submit') // Select by text
Assertions
Basic Assertions:
cy.get('.success').should('be.visible')
cy.get('input').should('have.value', 'test@example.com')
cy.get('.error').should('not.exist')
Chai Assertions:
expect(true).to.be.true
Multiple Assertions:
cy.get('input')
.should('have.class', 'form-control')
.and('have.value', 'test@example.com')
Interacting with Elements
Click:
cy.get('button').click()
Type:
cy.get('input[name="email"]').type('test@example.com')
Check/Uncheck:
cy.get('input[type="checkbox"]').check()
cy.get('input[type="checkbox"]').uncheck()
Select:
cy.get('select').select('Option1')
Hover:
cy.get('.menu-item').trigger('mouseover')
Network Requests
Intercept Requests:
cy.intercept('GET', '/api/users', { fixture: 'users.json' }).as('getUsers')
cy.visit('/')
cy.wait('@getUsers')
Mocking Responses:
cy.intercept('POST', '/login', {
statusCode: 200,
body: { token: '12345' }
}).as('login')
cy.get('form').submit()
cy.wait('@login')
Custom Commands
Define a Custom Command:
Cypress.Commands.add('login', (email, password) => {
cy.get('input[name="email"]').type(email)
cy.get('input[name="password"]').type(password)
cy.get('button[type="submit"]').click()
})
// Use the custom command in a test
cy.login('test@example.com', 'password123')
Best Practices
Use Data Attributes:
<button data-cy="submit-button">Submit</button>
cy.get('[data-cy=submit-button]').click()
Avoid Hard-Coding Waits:
// Instead of this
cy.wait(5000)
// Use this
cy.get('.loading-spinner').should('not.exist')
Clean State Between Tests:
beforeEach(() => {
cy.visit('/login')
})
Use Aliases for Repeated Selectors:
cy.get('input[name="email"]').as('emailInput')
cy.get('@emailInput').type('test@example.com')
Troubleshooting
Debugging:
cy.get('button').click().debug()
Pause Test Execution:
cy.pause()
cy.get('button').click()
Console Log:
cy.get('button').click().then(() => {
console.log('Button clicked')
})
Thank you for sharing this insightful article! I found the information really useful and thought-provoking. Your writing style is engaging, and it made the topic much easier to understand. Looking forward to reading more of your posts!