Programmatic login (cy.request) in Cypress - Build an Automation Script
describe('Programmatic login using cy.request', () => { it('logs in via API and visits dashboard', () => { cy.request({ method: 'POST', url: '/api/login', body: { username: 'testuser', password: 'Test@1234' } }).then((response) => { expect(response.status).to.equal(200); expect(response.body).to.have.property('token'); const token = response.body.token; // Set token in local storage window.localStorage.setItem('authToken', token); // Now visit dashboard cy.visit('/dashboard'); // Verify URL cy.url().should('include', '/dashboard'); // Verify welcome message is visible cy.get('[data-cy=welcome-message]').should('be.visible'); }); }); });
This test uses cy.request to send a POST request to the login API with the username and password. It then asserts the response status is 200 and that the response body contains a token. The token is saved to local storage to simulate a logged-in state. After setting the token, the test visits the dashboard page and verifies the URL and the presence of a welcome message element. This approach avoids using the UI login form, making tests faster and more reliable.
Selectors use data-cy attributes for stability. Assertions ensure the login succeeded and the dashboard loaded correctly.
Now add data-driven testing with 3 different sets of valid login credentials
Practice
cy.request for programmatic login in Cypress?Solution
Step 1: Understand what
cy.requestdoescy.requestsends HTTP requests directly without interacting with the UI.Step 2: Identify the benefit in login context
By usingcy.requestfor login, tests skip slow UI steps and run faster.Final Answer:
It logs in faster by skipping the UI steps. -> Option AQuick Check:
Programmatic login = faster login without UI [OK]
- Thinking
cy.requestshows UI login - Assuming manual input is needed every time
- Believing cookies are disabled automatically
cy.request in Cypress?Solution
Step 1: Recall
The correct order iscy.requestmethod signaturecy.request(method, url, body)for POST requests.Step 2: Check each option
cy.request('POST', '/login', { username: 'user', password: 'pass' }) matches the correct syntax with method 'POST', URL '/login', and body object.Final Answer:
cy.request('POST', '/login', { username: 'user', password: 'pass' }) -> Option DQuick Check:
Method first, then URL, then body [OK]
- Swapping method and URL order
- Using GET instead of POST for login
- Passing body with GET method
token after the test runs?cy.request('POST', '/api/login', { username: 'test', password: '1234' })
.then((response) => {
const token = response.body.token
cy.wrap(token).as('authToken')
})Solution
Step 1: Understand
Thecy.requestandthencallbackthenreceives the response object from the POST request.Step 2: Extract
The code assignstokenfromresponse.body.tokentokento the token string from the response body and saves it as an alias.Final Answer:
The token string returned from the login API response body. -> Option BQuick Check:
Response body token is saved as alias [OK]
- Thinking token is undefined outside callback
- Believing cy.wrap cannot be used inside then
- Confusing response object with token string
cy.request('POST', '/login', { username: 'user', password: 'pass' })
cy.visit('/dashboard')What is the most likely reason?
Solution
Step 1: Understand session preservation in Cypress
After login viacy.request, you must save cookies or tokens to keep the session.Step 2: Identify missing step in code
The code does not save or set any authentication cookie or token before visiting the dashboard.Final Answer:
You forgot to save and set the authentication cookie or token after login. -> Option AQuick Check:
Session needs saved cookie/token after login [OK]
- Assuming cy.visit order matters here
- Thinking login API rejects POST requests
- Adding unnecessary waits instead of fixing session
Solution
Step 1: Check HTTP method and payload correctness
Login usually requires POST with correct keys; Cypress.Commands.add('login', () => { cy.request('POST', '/api/login', { username: 'user', password: 'pass' }) .then((res) => { cy.setCookie('authToken', res.body.token) }) }) uses 'username' and 'password' correctly.Step 2: Verify token storage and cookie setting
Cypress.Commands.add('login', () => { cy.request('POST', '/api/login', { username: 'user', password: 'pass' }) .then((res) => { cy.setCookie('authToken', res.body.token) }) }) sets the cookie 'authToken' with the token from response body, enabling session reuse.Step 3: Review other options for errors
Cypress.Commands.add('login', () => { cy.visit('/login') cy.get('#username').type('user') cy.get('#password').type('pass') cy.get('button[type=submit]').click() }) uses UI login, not programmatic. Cypress.Commands.add('login', () => { cy.request('GET', '/api/login') .then((res) => { cy.setCookie('authToken', res.body.token) }) }) uses GET instead of POST. Cypress.Commands.add('login', () => { cy.request('POST', '/api/login', { user: 'user', pass: 'pass' }) .then((res) => { cy.setCookie('authToken', res.body.token) }) }) uses wrong keys 'user' and 'pass'.Final Answer:
Reusable command with POST request, correct keys, and cookie set. -> Option CQuick Check:
POST + correct keys + setCookie = reusable login [OK]
- Using GET instead of POST for login
- Wrong payload keys like 'user' instead of 'username'
- Trying UI login instead of programmatic
- Not setting cookie after login
Ready to prove it?
Pass the test and this pattern moves unknown
