Bird
Raised Fist0
Cypresstesting~15 mins

Asserting request properties in Cypress - Build an Automation Script

Choose your learning style10 modes available
Verify HTTP request properties on form submission
Preconditions (3)
Step 1: Enter 'Alice' in the name field
Step 2: Enter 'alice@example.com' in the email field
Step 3: Enter 'Hello, this is a test message.' in the message field
Step 4: Click the submit button with id 'submit-btn'
Step 5: Intercept the POST request to '/api/contact'
Step 6: Assert that the request method is POST
Step 7: Assert that the request body contains the entered name, email, and message
Step 8: Assert that the request headers include 'Content-Type' with value 'application/json'
✅ Expected Result: The POST request to '/api/contact' is sent with correct method, headers, and body matching the form inputs
Automation Requirements - Cypress
Assertions Needed:
Request method is POST
Request body contains correct form data
Request headers include 'Content-Type: application/json'
Best Practices:
Use cy.intercept() to spy on network requests
Use aliases for intercepted requests
Use cy.wait() to wait for the request to complete before assertions
Avoid hardcoding selectors; use IDs or data attributes
Keep assertions clear and focused
Automated Solution
Cypress
describe('Contact form request properties test', () => {
  it('should send correct POST request on form submission', () => {
    cy.visit('/contact');

    cy.intercept('POST', '/api/contact').as('postContact');

    cy.get('#name').type('Alice');
    cy.get('#email').type('alice@example.com');
    cy.get('#message').type('Hello, this is a test message.');

    cy.get('#submit-btn').click();

    cy.wait('@postContact').then(({ request }) => {
      expect(request.method).to.equal('POST');
      expect(request.headers['content-type']).to.include('application/json');
      expect(request.body).to.deep.equal({
        name: 'Alice',
        email: 'alice@example.com',
        message: 'Hello, this is a test message.'
      });
    });
  });
});

This test visits the contact form page first.

It uses cy.intercept() to watch for POST requests to /api/contact and gives it an alias @postContact.

Then it fills the form fields using their IDs and clicks the submit button.

After clicking, it waits for the intercepted request to happen with cy.wait().

Inside the wait callback, it asserts the request method is POST, the content-type header includes 'application/json', and the request body exactly matches the form data entered.

This ensures the form sends the correct request with expected properties.

Common Mistakes - 4 Pitfalls
Not using cy.intercept() and trying to assert request properties directly
Using hardcoded XPath selectors or brittle selectors instead of stable IDs
Not waiting for the intercepted request before asserting
Checking request headers with exact string match instead of includes
Bonus Challenge

Now add data-driven testing with 3 different sets of form inputs to verify request properties for each

Show Hint

Practice

(1/5)
1. What is the primary purpose of using cy.intercept in Cypress tests?
easy
A. To watch and control network requests during test execution
B. To create UI elements dynamically
C. To write CSS styles for the application
D. To generate random test data automatically

Solution

  1. Step 1: Understand cy.intercept role

    cy.intercept is used to monitor or stub network requests in Cypress tests.
  2. Step 2: Identify correct purpose

    It helps watch and control HTTP requests, not UI or styling tasks.
  3. Final Answer:

    To watch and control network requests during test execution -> Option A
  4. Quick Check:

    cy.intercept = watch/control requests [OK]
Hint: Remember: intercept = watch network calls [OK]
Common Mistakes:
  • Confusing intercept with UI manipulation
  • Thinking intercept generates test data
  • Mixing intercept with CSS styling
2. Which of the following is the correct syntax to assert that a request method is POST inside a cy.intercept callback?
easy
A. assert(req.method == 'POST')
B. assert.equal(req.method, 'GET')
C. expect(req.method).equals('post')
D. expect(req.method).to.equal('POST')

Solution

  1. Step 1: Identify correct assertion syntax

    Cypress uses Chai assertions like expect(value).to.equal(expected).
  2. Step 2: Match method and case sensitivity

    HTTP methods are uppercase strings, so 'POST' must be exact.
  3. Final Answer:

    expect(req.method).to.equal('POST') -> Option D
  4. Quick Check:

    expect().to.equal() with exact case [OK]
Hint: Use expect().to.equal() with exact method case [OK]
Common Mistakes:
  • Using lowercase 'post' instead of 'POST'
  • Using assert syntax instead of expect
  • Checking wrong method like 'GET'
3. Given the following code snippet, what will the assertion check inside the intercept callback?
cy.intercept('POST', '/api/login', (req) => {
  expect(req.body).to.have.property('username', 'admin')
})
medium
A. The request headers must include username 'admin'
B. The request body must include a username property with value 'admin'
C. The response body must have username 'admin'
D. The request URL must contain 'username=admin'

Solution

  1. Step 1: Analyze the assertion target

    The assertion checks req.body for a property named 'username' with value 'admin'.
  2. Step 2: Understand request vs response and headers

    It does not check URL, response, or headers, only the request body.
  3. Final Answer:

    The request body must include a username property with value 'admin' -> Option B
  4. Quick Check:

    expect(req.body).to.have.property('username', 'admin') [OK]
Hint: Check if property is in req.body, not URL or headers [OK]
Common Mistakes:
  • Confusing request body with URL query
  • Checking response instead of request
  • Looking at headers instead of body
4. Identify the error in this Cypress intercept assertion:
cy.intercept('GET', '/api/data', (req) => {
  expect(req.headers['Content-Type']).to.equal('application/json')
})
medium
A. The assertion syntax is incorrect
B. The method should be POST, not GET
C. Headers keys are case-insensitive; 'Content-Type' should be 'content-type'
D. The intercept callback must use res instead of req

Solution

  1. Step 1: Check header key case sensitivity

    HTTP headers are case-insensitive, but Cypress normalizes header keys to lowercase in the req.headers object. The code uses 'Content-Type' which is incorrect; it should be 'content-type'.
  2. Step 2: Validate other parts

    Method GET is valid, assertion syntax is correct, and req is proper for request interception.
  3. Final Answer:

    Headers keys are case-insensitive; 'Content-Type' should be 'content-type' -> Option C
  4. Quick Check:

    Cypress req.headers use lowercase keys [OK]
Hint: Cypress req.headers uses lowercase keys [OK]
Common Mistakes:
  • Using wrong HTTP method
  • Misusing response object instead of request
  • Incorrect assertion syntax
5. You want to assert that a POST request to /api/submit contains a JSON body with a non-empty email property and a header Authorization starting with 'Bearer '. Which is the best way to write this assertion inside cy.intercept?
hard
A. cy.intercept('POST', '/api/submit', (req) => { expect(req.body.email).to.be.a('string').and.not.be.empty expect(req.headers.authorization).to.match(/^Bearer /) })
B. cy.intercept('POST', '/api/submit', (req) => { expect(req.body.email).to.exist expect(req.headers.authorization).to.include('Bearer') })
C. cy.intercept('POST', '/api/submit', (req) => { assert.isString(req.body.email) assert.include(req.headers.authorization, 'Bearer') })
D. cy.intercept('POST', '/api/submit', (req) => { expect(req.body.email).to.be.empty expect(req.headers.authorization).to.equal('Bearer') })

Solution

  1. Step 1: Check email property assertion

    cy.intercept('POST', '/api/submit', (req) => { expect(req.body.email).to.be.a('string').and.not.be.empty expect(req.headers.authorization).to.match(/^Bearer /) }) asserts email is a non-empty string using to.be.a('string').and.not.be.empty, which is precise.
  2. Step 2: Check Authorization header assertion

    cy.intercept('POST', '/api/submit', (req) => { expect(req.body.email).to.be.a('string').and.not.be.empty expect(req.headers.authorization).to.match(/^Bearer /) }) uses regex to.match(/^Bearer /) to ensure header starts with 'Bearer ', which is exact and case-sensitive.
  3. Step 3: Compare other options

    cy.intercept('POST', '/api/submit', (req) => { expect(req.body.email).to.exist expect(req.headers.authorization).to.include('Bearer') }) uses correct lowercase header key, but .to.exist only checks existence (could be empty or falsy), and .to.include checks substring anywhere, not prefix.
    cy.intercept('POST', '/api/submit', (req) => { assert.isString(req.body.email) assert.include(req.headers.authorization, 'Bearer') }) uses non-standard assert style and misses non-empty check; include not prefix.
    cy.intercept('POST', '/api/submit', (req) => { expect(req.body.email).to.be.empty expect(req.headers.authorization).to.equal('Bearer') }) incorrectly expects empty email and exact 'Bearer' match only.
  4. Final Answer:

    expect(req.body.email).to.be.a('string').and.not.be.empty
    expect(req.headers.authorization).to.match(/^Bearer /)
    -> Option A
  5. Quick Check:

    Use precise type and regex assertions for properties [OK]
Hint: Use type checks and regex for precise property assertions [OK]
Common Mistakes:
  • Ignoring case sensitivity in headers
  • Checking only existence, not content
  • Using wrong assertion style inconsistently
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