Bird
Raised Fist0
Cypresstesting~8 mins

Waiting for requests (cy.wait with alias) in Cypress - Framework Patterns

Choose your learning style10 modes available
Framework Mode - Waiting for requests (cy.wait with alias)
Folder Structure
  cypress/
  ├── e2e/
  │   ├── login.cy.js          # Test files
  │   ├── dashboard.cy.js
  │   └── apiRequests.cy.js    # Tests using cy.wait with alias
  ├── fixtures/                # Static test data
  │   └── user.json
  ├── support/
  │   ├── commands.js          # Custom commands
  │   └── e2e.js               # Global setup
  └── cypress.config.js        # Configuration file
  
Test Framework Layers
  • Test Files (cypress/e2e/): Contains test scripts that use cy.intercept to spy or stub network requests and cy.wait with aliases to wait for them.
  • Support Layer (cypress/support/): Holds reusable commands and global hooks to set up intercepts or common behaviors.
  • Fixtures (cypress/fixtures/): Static JSON or other files used as mock data for API responses or test inputs.
  • Configuration (cypress.config.js): Defines environment variables, base URLs, and browser settings.
Configuration Patterns

Use cypress.config.js to define base URLs and environment variables for different environments (dev, staging, prod). For example:

  export default defineConfig({
    e2e: {
      baseUrl: 'https://example.com',
      env: {
        apiUrl: 'https://api.example.com'
      },
      setupNodeEvents(on, config) {
        // implement node event listeners here
      }
    }
  })
  

In tests, use cy.intercept with aliases to listen for specific API calls. Use cy.wait('@alias') to pause test execution until the request finishes, ensuring stable tests.

Test Reporting and CI/CD Integration
  • Use Cypress built-in reporter for test results in the terminal.
  • Integrate with CI/CD pipelines (GitHub Actions, Jenkins, GitLab CI) to run tests on every push or pull request.
  • Generate HTML reports using plugins like mochawesome for detailed test reports.
  • Use screenshots and video recordings on test failures for easier debugging.
Best Practices
  • Use cy.intercept with meaningful aliases: Name aliases clearly to reflect the request purpose, e.g., @getUser.
  • Always wait for requests before asserting UI changes: Use cy.wait('@alias') to ensure the app has received data before checking results.
  • Keep intercepts and waits close to the test steps: This improves readability and debugging.
  • Use fixtures for consistent mock data: This helps tests be reliable and repeatable.
  • Avoid arbitrary waits like cy.wait(5000): They slow tests and cause flakiness.
Self Check

Where in this folder structure would you add a new alias for waiting on the "POST /login" API request?

Key Result
Use cy.intercept with aliases and cy.wait('@alias') in test files to reliably wait for network requests.

Practice

(1/5)
1. What is the main purpose of using cy.wait() with an alias in Cypress tests?
easy
A. To log the test results to the console
B. To pause the test until a specific network request finishes
C. To reload the page automatically
D. To skip a test step temporarily

Solution

  1. Step 1: Understand cy.wait() with alias

    The cy.wait() command pauses the test until the network request with the given alias completes.
  2. Step 2: Purpose of waiting for requests

    This ensures the test runs only after the needed data is loaded, making tests reliable.
  3. Final Answer:

    To pause the test until a specific network request finishes -> Option B
  4. Quick Check:

    Waiting for request = pause test until done [OK]
Hint: Wait pauses test until named request finishes [OK]
Common Mistakes:
  • Thinking cy.wait skips steps
  • Confusing cy.wait with page reload
  • Using cy.wait without alias
2. Which of the following is the correct syntax to alias a network request in Cypress?
easy
A. cy.intercept('/api/data').alias('getData')
B. cy.route('/api/data').alias('getData')
C. cy.wait('/api/data').as('getData')
D. cy.intercept('/api/data').as('getData')

Solution

  1. Step 1: Identify correct alias method

    In Cypress, cy.intercept() is used to spy or stub requests, and .as() assigns an alias.
  2. Step 2: Check syntax correctness

    cy.intercept('/api/data').as('getData') uses cy.intercept('/api/data').as('getData'), which is the correct syntax.
  3. Final Answer:

    cy.intercept('/api/data').as('getData') -> Option D
  4. Quick Check:

    Alias uses .as() after intercept [OK]
Hint: Use .as() to alias intercept, not .alias() [OK]
Common Mistakes:
  • Using .alias() instead of .as()
  • Trying to alias cy.wait instead of cy.intercept
  • Using deprecated cy.route instead of cy.intercept
3. Given the code below, what will be the output in the test if the request takes 500ms to complete?
cy.intercept('GET', '/users').as('getUsers')
cy.visit('/users')
cy.wait('@getUsers').then(({ response }) => {
  console.log(response.status)
})
medium
A. 200
B. undefined
C. 500
D. 404

Solution

  1. Step 1: Understand intercept and wait behavior

    The cy.intercept() spies on the GET request to '/users' and aliases it as 'getUsers'.
  2. Step 2: Analyze the wait and response

    cy.wait('@getUsers') waits for the request to finish, then logs the response.status. A successful GET usually returns 200.
  3. Final Answer:

    200 -> Option A
  4. Quick Check:

    Wait logs response status 200 [OK]
Hint: Wait returns response object with status [OK]
Common Mistakes:
  • Confusing request duration with status code
  • Expecting wait to return undefined
  • Assuming 404 if request is slow
4. Identify the error in the following Cypress test code:
cy.intercept('POST', '/login').as('loginRequest')
cy.get('button#submit').click()
cy.wait('loginRequest')
medium
A. Missing @ symbol in cy.wait alias
B. Incorrect HTTP method in intercept
C. Alias name should be in double quotes
D. cy.get selector is invalid

Solution

  1. Step 1: Check cy.wait usage

    The cy.wait() command requires the alias to be prefixed with '@' to identify the request alias.
  2. Step 2: Identify the error

    The code uses cy.wait('loginRequest') missing the '@', which causes Cypress to not recognize the alias.
  3. Final Answer:

    Missing @ symbol in cy.wait alias -> Option A
  4. Quick Check:

    Alias in cy.wait needs '@' prefix [OK]
Hint: Always prefix alias with '@' in cy.wait [OK]
Common Mistakes:
  • Omitting '@' before alias in cy.wait
  • Using wrong HTTP method in intercept
  • Thinking quotes affect alias recognition
5. You want to test that after clicking a button, a POST request to '/submit' completes successfully before checking the page content. Which is the best way to write this in Cypress?
hard
A. cy.intercept('POST', '/submit').as('submitRequest') cy.wait('@submitRequest') cy.get('button#send').click() cy.contains('Success').should('be.visible')
B. cy.get('button#send').click() cy.wait('@submitRequest') cy.intercept('POST', '/submit').as('submitRequest') cy.contains('Success').should('be.visible')
C. cy.intercept('POST', '/submit').as('submitRequest') cy.get('button#send').click() cy.wait('@submitRequest') cy.contains('Success').should('be.visible')
D. cy.get('button#send').click() cy.contains('Success').should('be.visible') cy.intercept('POST', '/submit').as('submitRequest') cy.wait('@submitRequest')

Solution

  1. Step 1: Setup intercept before action

    You must call cy.intercept() and alias before triggering the request by clicking the button.
  2. Step 2: Wait for request before assertions

    Use cy.wait('@submitRequest') after clicking to pause until the POST completes, then check page content.
  3. Final Answer:

    Intercept first, click, wait, then assert success message -> Option C
  4. Quick Check:

    Intercept before action, wait after click [OK]
Hint: Always intercept before triggering request, then wait [OK]
Common Mistakes:
  • Waiting before intercepting
  • Asserting before request finishes
  • Interception after click triggers request
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