Estoy probando que requiere que inicies sesión mientras realizas las pruebas. Para permanecer conectado, conservo las cookies durante una ejecución de prueba.
Yo uso una función personalizada:
Cypress.Commands.add('preserveAllCookiesOnce', () => { Cypress.Cookies.defaults({ preserve: (cookie) => { return true; } }) })
También probé
beforeEach(function () { Cypress.Cookies.preserveOnce('session', 'YII_CSRF_TOKEN'); })
(Revisó dos veces el nombre de las cookies)
Ahora, en este caso de prueba, he incluido dos solicitudes de publicación después de iniciar sesión. Pero después de esas dos pruebas de solicitud POST, recibo un error 403 cuando intento acceder a la página nuevamente.
Si necesita más detalles, por favor hágamelo saber. Estoy tratando de mantener el código al mínimo necesario para comprender el problema:
import {Login} from "../../pages/login/Login"; describe('test POST/client validation', () => { beforeEach(function () { cy.preserveAllCookiesOnce() }) it('log in', () => { login.goToLoginPage() login.loginCredentials(Cypress.env('userEmail'), Cypress.env('userPass')) }) it('test some stuff', function () { cy.visit(Cypress.env('url') + '/index.php?r=tc/tcSettings/index&language=de') ..... }) it('send POST/client request with incorrect values', function () { cy.request({ method: 'POST', ... }) .then(response => { expect(response.status).to.eq(400) expect(response.body.fields).to.contain({stuff}) }) }) it('send POST/client request with correct values', function () { cy.request({ ... }) .then(response => { expect(response.status).to.eq(200) }) }) it('go to clients page and assert created client', () => { cy.visit(Cypress.env('url') + '/index.php?r=client/index&language=de') }) })
Parece que conservar las cookies no funciona a través de las pruebas POST. Cuando intento acceder al sitio web en el último paso, obtengo un estado 403.
Por lo general, puedo ejecutar cualquier cantidad it
instancias con el comando cy.preserveAllCookiesOnce()
, así que supongo que podría tener que ver con las solicitudes POST en el medio.
Captura de pantalla de las cookies después del paso POST:
¿Es cy.preserveAllCookiesOnce()
un custom command
que creó en su proyecto de Cypress
? Tenga en cuenta que debe usar Cypress.Cookies.preserveOnce()
en su lugar:
beforeEach(function () { // before each test, we can automatically preserve the // 'session_id' and 'remember_token' cookies. this means they // will not be cleared before the NEXT test starts. // // the name of your cookies will likely be different // this is an example Cypress.Cookies.preserveOnce('session_id', 'remember_token'); })
Para habilitar o deshabilitar la depuración de cookies, use Cypress.Cookies.debug()
.
// Cypress will now log in the console when // cookies are set or removed Cypress.Cookies.debug(true) cy.setCookie('fakeCookie', '123ABC') cy.clearCookie('fakeCookie') cy.setCookie('fakeCookie', '123ABC') cy.clearCookie('fakeCookie') cy.setCookie('fakeCookie', '123ABC')
Puede leer más sobre la API de Cypress.Cookies
aquí .
Ok, finalmente he encontrado la causa del problema. Tiene que ver con las cookies, pero no puedo explicar en absoluto qué lo causa.
En el primer paso, inicio sesión como usuario administrador. Guardo las cookies de sesión para este usuario y luego procedo a realizar las solicitudes POST.
Sin embargo, en el paso 5, cuando quiero consultar la página de clientes, de repente inicio sesión como usuario que no es administrador (una segunda cuenta de prueba que he creado para realizar pruebas con permisos que no son de administrador).
Para resumir:
it('log in', () => { //in this step I log in as Admin }) it('test some stuff', function () { //in this step I am still logged in as Admin }) it('send POST/client request with incorrect values', function () { //still logged in as Admin }) it('send POST/client request with correct values', function () { //suddenly log in changes to non-Admin account }) it('go to clients page and assert created client', () => { //logged in as non-Admin, therefor this test fails }) })
No puedo encontrar ninguna razón en mi código por la cual el estado de inicio de sesión cambia en la prueba POST.
Pero aunque no puedo encontrar el motivo, ahora puedo solucionar el problema agregando un paso adicional antes del paso 5 que simplemente cierra la sesión y vuelve a iniciarla como usuario administrador.
Este es el código para el paso POST que hace que cambie el inicio de sesión:
it('send POST/client request with incorrect values', function () { cy.request({ method: 'POST', url: Cypress.env('url') + '/service/clients', headers: { 'API-KEY': api_key, }, body: body1, failOnStatusCode: false }) .then(response => { expect(response.status).to.eq(400) expect(response.body.fields).to.contain({ "some stuff" }) }) })
No veo ninguna razón por la que esta solicitud deba cambiar el estado de mi sesión tbh. Además, las credenciales de inicio de sesión para el usuario que no es administrador no se usan en ninguna parte dentro de este archivo de especificaciones.