Cypress.Commands.add() - Build an Automation Script
/// <reference types="cypress" /> // cypress/support/commands.js Cypress.Commands.add('login', (username, password) => { cy.visit('/login'); cy.get('input[name="username"]').type(username); cy.get('input[name="password"]').type(password); cy.get('button[type="submit"]').click(); }); // cypress/e2e/login_spec.js describe('Login using custom command', () => { it('should login successfully and show welcome message', () => { cy.login('testuser', 'Test@1234'); cy.url().should('include', '/dashboard'); cy.contains('Welcome, testuser!').should('be.visible'); }); });
The Cypress.Commands.add() function is used to create a custom command named login. This command visits the login page, fills in the username and password fields, and clicks the submit button.
In the test file, we call cy.login('testuser', 'Test@1234') to perform the login steps. Then, we assert that the URL includes /dashboard to confirm navigation after login. Finally, we check that the welcome message with the username is visible on the page.
This approach keeps the test clean and reusable by encapsulating login steps in a custom command.
Now add data-driven testing with 3 different username and password combinations using the custom login command
Practice
Cypress.Commands.add() in Cypress testing?Solution
Step 1: Understand the function of Cypress.Commands.add()
This method allows you to define your own commands that you can reuse in tests.Step 2: Identify the benefit of reusable commands
Reusable commands help keep test code clean and avoid repetition.Final Answer:
To create reusable custom commands for cleaner test code -> Option CQuick Check:
Reusable commands = Cleaner code [OK]
- Thinking it adds test cases automatically
- Confusing it with test report generation
- Assuming it changes browser settings
login in Cypress?Solution
Step 1: Recall the correct method name
The correct method to add commands isCypress.Commands.add().Step 2: Check the syntax format
The first argument is the command name as a string, the second is a function.Final Answer:
Cypress.Commands.add('login', () => { /* code */ }) -> Option DQuick Check:
Correct method and syntax = Cypress.Commands.add('login', () => { /* code */ }) [OK]
- Using Cypress.addCommand instead of Commands.add
- Omitting Cypress.Commands prefix
- Using create instead of add
cy.login() is called in a test? Cypress.Commands.add('login', (username, password) => {
cy.get('#user').type(username)
cy.get('#pass').type(password)
cy.get('#submit').click()
})
// In test
cy.login('user1', 'pass1')Solution
Step 1: Analyze the custom command parameters
The command takes username and password and types them into respective fields.Step 2: Follow the command actions
It types username into '#user', password into '#pass', then clicks '#submit'.Final Answer:
Types 'user1' in #user, 'pass1' in #pass, then clicks #submit -> Option AQuick Check:
Parameters map to correct fields = Types 'user1' in #user, 'pass1' in #pass, then clicks #submit [OK]
- Assuming no parameters are needed
- Mixing up username and password fields
- Ignoring the click action
Cypress.Commands.add('clickButton', () => {
cy.get('#button')
cy.click()
})Solution
Step 1: Review the command chaining
cy.get('#button')returns an element, butcy.click()is called separately, not chained.Step 2: Understand correct chaining
Click should be chained to the element:cy.get('#button').click().Final Answer:
Missing chaining ofclick()tocy.get()-> Option AQuick Check:
Method chaining required = Missing chaining ofclick()tocy.get()[OK]
- Calling cy.click() separately
- Changing command name unnecessarily
- Using cy.find() instead of cy.get() without reason
fillForm that fills multiple fields and submits a form. Which approach correctly uses Cypress.Commands.add() to accept an object with field values and perform the actions?Solution
Step 1: Understand parameter passing
Using a single object parameterdatawith named properties is clear and flexible.Step 2: Check usage of object properties
Accessingdata.nameanddata.emailmatches the object keys.Final Answer:
Cypress.Commands.add('fillForm', (data) => { cy.get('#name').type(data.name) cy.get('#email').type(data.email) cy.get('#submit').click() }) -> Option BQuick Check:
Object parameter with named fields = Cypress.Commands.add('fillForm', (data) => { cy.get('#name').type(data.name) cy.get('#email').type(data.email) cy.get('#submit').click() }) [OK]
- Using undefined variables without parameters
- Passing multiple parameters instead of one object
- Accessing object fields by index instead of name
Ready to prove it?
Pass the test and this pattern moves unknown
