Bird
Raised Fist0
Cypresstesting~15 mins

Why plugins extend Cypress capabilities - Automation Benefits in Action

Choose your learning style10 modes available
Verify that a Cypress plugin extends Cypress commands
Preconditions (2)
Step 1: Open the Cypress plugins file and add a custom command plugin
Step 2: Write a test that uses the new custom command
Step 3: Run the test in Cypress Test Runner
✅ Expected Result: The test should run successfully using the new custom command added by the plugin
Automation Requirements - Cypress
Assertions Needed:
Verify the custom command is available and works as expected
Verify the test passes using the plugin command
Best Practices:
Use Cypress.Commands.add to add commands
Keep plugins code modular
Use descriptive command names
Use Cypress Test Runner for execution
Automated Solution
Cypress
/// <reference types="cypress" />

// cypress/support/commands.js
Cypress.Commands.add('loginByCustomCommand', (email, password) => {
  cy.get('input[name=email]').type(email)
  cy.get('input[name=password]').type(password)
  cy.get('button[type=submit]').click()
})

// cypress/e2e/login_spec.cy.js

describe('Login with custom plugin command', () => {
  it('should login successfully using the custom command', () => {
    cy.visit('https://example.cypress.io/login')
    cy.loginByCustomCommand('user@example.com', 'Password123!')
    cy.url().should('include', '/dashboard')
  })
})

The Cypress.Commands.add function is used to add a new custom command called loginByCustomCommand. This command types the email and password into the login form and clicks submit.

The test file login_spec.cy.js uses this new command to perform login. It visits the login page, calls the custom command with test credentials, and then asserts that the URL includes '/dashboard' indicating successful login.

This shows how plugins extend Cypress by adding reusable commands that simplify test scripts.

Common Mistakes - 4 Pitfalls
{'mistake': 'Not importing or referencing the commands file in the support file', 'why_bad': "The custom commands won't be registered and tests will fail with 'command not found' errors.", 'correct_approach': 'Ensure the commands file is imported in cypress/support/e2e.js or cypress/support/index.js.'}
Using non-descriptive or generic command names
Hardcoding selectors inside the test instead of inside the command
Not using Cypress best practices like chaining commands
Bonus Challenge

Now add data-driven testing with 3 different sets of login credentials using the custom command

Show Hint

Practice

(1/5)
1. What is the main reason to use plugins in Cypress?
easy
A. To add extra features that work outside the browser
B. To write test cases faster inside the browser
C. To change the browser's user interface
D. To automatically fix test failures

Solution

  1. Step 1: Understand Cypress plugin purpose

    Plugins let Cypress do things that normal browser tests cannot, like file system access or custom tasks.
  2. Step 2: Compare options with plugin use

    Only To add extra features that work outside the browser correctly describes extending Cypress outside the browser environment.
  3. Final Answer:

    To add extra features that work outside the browser -> Option A
  4. Quick Check:

    Plugins extend Cypress beyond browser limits = C [OK]
Hint: Plugins add power outside browser, not inside tests [OK]
Common Mistakes:
  • Thinking plugins only speed up test writing
  • Confusing plugins with UI changes
  • Believing plugins fix test failures automatically
2. Which file is used to write Cypress plugins?
easy
A. cypress/support/commands.js
B. cypress/plugins/index.js
C. cypress/integration/spec.js
D. cypress.json

Solution

  1. Step 1: Identify plugin file location

    Cypress plugins are written in the cypress/plugins/index.js file as per Cypress structure.
  2. Step 2: Eliminate other files

    Other files are for commands, tests, or config, not plugins.
  3. Final Answer:

    cypress/plugins/index.js -> Option B
  4. Quick Check:

    Plugins live in plugins/index.js file = A [OK]
Hint: Plugins always go in plugins/index.js file [OK]
Common Mistakes:
  • Choosing support or integration files for plugins
  • Confusing config file with plugin file
  • Not knowing Cypress folder structure
3. What will this plugin code do?
module.exports = (on, config) => {
  on('task', {
    log(message) {
      console.log(message)
      return null
    }
  })
}
medium
A. Creates a new browser event listener
B. Runs a test inside the browser console
C. Defines a task named 'log' that prints messages to the console
D. Overrides Cypress default logging behavior

Solution

  1. Step 1: Analyze the plugin code

    The code uses on('task', {...}) to define a custom task named 'log' that prints a message to the Node console.
  2. Step 2: Understand task purpose

    This task can be called from tests to log messages outside the browser.
  3. Final Answer:

    Defines a task named 'log' that prints messages to the console -> Option C
  4. Quick Check:

    Task 'log' prints messages = D [OK]
Hint: Tasks run in Node, not browser console [OK]
Common Mistakes:
  • Thinking task runs inside browser
  • Confusing task with event listener
  • Assuming it overrides default logs
4. Identify the error in this plugin code:
module.exports = (on, config) => {
  on('task', {
    readFile(path) {
      return fs.readFileSync(path, 'utf8')
    }
  })
}
medium
A. Missing import of 'fs' module
B. Wrong event name instead of 'task'
C. Incorrect return type for readFile
D. Plugin file should be JSON, not JS

Solution

  1. Step 1: Check code dependencies

    The code uses fs.readFileSync but does not import the 'fs' module, causing a runtime error.
  2. Step 2: Verify other parts

    The event name 'task' is correct, return type is valid, and plugin files are JavaScript files.
  3. Final Answer:

    Missing import of 'fs' module -> Option A
  4. Quick Check:

    Using fs without import causes error = B [OK]
Hint: Always import Node modules before use in plugins [OK]
Common Mistakes:
  • Assuming event name is wrong
  • Thinking return type must be a promise
  • Believing plugin files must be JSON
5. You want to create a plugin that reads a JSON file and returns its content as an object to your test. Which plugin code correctly does this?
const fs = require('fs')

module.exports = (on, config) => {
  on('task', {
    readJson(path) {
      const content = fs.readFileSync(path, 'utf8')
      return JSON.parse(content)
    }
  })
}
hard
A. This code needs to use asynchronous fs.readFile instead
B. This code will fail because JSON.parse cannot be used in plugins
C. This code should return content without parsing
D. This code correctly reads and parses JSON file content

Solution

  1. Step 1: Check file reading method

    The code uses fs.readFileSync to read the file synchronously, which is valid in plugins.
  2. Step 2: Verify JSON parsing

    It correctly parses the JSON string to an object using JSON.parse and returns it.
  3. Final Answer:

    This code correctly reads and parses JSON file content -> Option D
  4. Quick Check:

    Sync read + JSON.parse returns object = A [OK]
Hint: Use sync read and JSON.parse in plugins for JSON files [OK]
Common Mistakes:
  • Thinking JSON.parse is disallowed in plugins
  • Believing async read is required
  • Returning raw string instead of parsed object
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard