Programmatic login helps you log in quickly without using the UI. It saves time and makes tests faster and more reliable.
Programmatic login (cy.request) in Cypress
cy.request({
method: 'POST',
url: '/api/login',
body: {
username: 'yourUsername',
password: 'yourPassword'
}
}).then((response) => {
// save token or cookie from response
cy.setCookie('authToken', response.body.token)
})Use cy.request to send HTTP requests directly to your backend.
After login, save the token or cookie to keep the session active for next steps.
cy.request('POST', '/api/login', { username: 'user1', password: 'pass123' }) .then((response) => { expect(response.status).to.eq(200) cy.setCookie('session_id', response.body.sessionId) })
cy.request({
method: 'POST',
url: '/api/login',
body: { username: 'user2', password: 'pass456' },
headers: { 'Content-Type': 'application/json' }
}).then((response) => {
expect(response.body).to.have.property('token')
cy.setCookie('authToken', response.body.token)
})This test logs in by sending a POST request to the login API. It checks the response status and token, saves the token as a cookie, then visits the dashboard page. Finally, it checks that the welcome message is visible.
describe('Programmatic Login Test', () => { it('logs in using cy.request and visits dashboard', () => { cy.request({ method: 'POST', url: '/api/login', body: { username: 'testuser', password: 'testpass' } }).then((response) => { expect(response.status).to.eq(200) expect(response.body).to.have.property('token') cy.setCookie('authToken', response.body.token) cy.visit('/dashboard') cy.contains('Welcome, testuser').should('be.visible') }) }) })
Make sure the API endpoint and request body match your backend login API.
Use cy.setCookie or localStorage to keep the login session.
Programmatic login skips UI, so test UI login separately if needed.
Programmatic login uses cy.request to log in faster without UI.
Save tokens or cookies after login to keep the session.
Use it to speed up tests and avoid flaky UI login steps.
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
