Contenido del curso
Cookies y Localstorage
Emulando dispositivos
Instalando plugins
Flaky tests
Buenas prácticas
Visual testing
Seguridad
Data Driven Test
BDD
Reportes
Docker
Dashboard
CI/CD
Final
Seguridad entre dominios en Cypress
Resumen
Cuando empiezas a escribir pruebas end to end con Cypress, te topas con un muro: no puedes visitar dos superdominios distintos dentro de la misma prueba. Esta restricción no es un bug, es una capa de seguridad pensada para proteger tus tests y a tus usuarios de redirecciones maliciosas.
Entender cómo funciona esta protección te ayuda a diseñar pruebas más limpias y a saber cuándo Cypress te va a dejar compartir información entre tests y cuándo no.
¿Por qué Cypress bloquea la navegación entre superdominios?
Cypress implementa esta restricción para evitar que un test caiga en un link malicioso que lo redirija a otra página sin control. A diferencia de herramientas como Puppeteer, que controlan directamente el navegador y permiten saltar entre sitios sin fricción, Cypress se enfoca en tu aplicación y prioriza la seguridad.
Cuando intentas hacer dos cy.visit() a dominios distintos en la misma prueba, verás un error claro que dice que no puedes visitar una URL diferente a la de origen. El superdominio es el dominio raíz, por ejemplo netlify.app, mientras que un subdominio sería pokemonpokedex.netlify.app. La regla aplica al superdominio.
¿Qué es un superdominio en Cypress? Es el dominio raíz de una URL, como
netlify.appoplatzi.com. Cypress no permite cambiar de superdominio dentro de una misma prueba, aunque sí puedes moverte entre subdominios.
¿Cómo se ve el error en la práctica?
Dentro de un bloque describe('seguridad'), si haces un primer cy.visit() a tu página de inicio y luego intentas un segundo cy.visit() hacia una to do list en otro dominio, Cypress detiene la prueba. El primer visit pasa sin problema, pero el segundo dispara el error de cross origin.
El propio mensaje te sugiere qué instrucción usar para resolverlo, algo que se aborda en clases posteriores con comandos como cy.origin().
¿Cómo compartir información entre pruebas con alias?
El caso de uso más común para querer saltar entre dominios es compartir información capturada en una página para usarla en otra prueba. Aquí entran los alias y el contexto de Cypress.
Dentro de un test puedes capturar texto así:
javascript cy.get('h1').invoke('text').as('titulo')
Para acceder al alias en otro test necesitas usar function() en lugar de arrow function, porque las arrow functions no preservan el contexto this que Cypress necesita.
javascript it('navego a un dominio', function() { cy.visit('https://mi-pagina.com') cy.get('h1').invoke('text').as('titulo') })
it('navego al mismo dominio', function() { cy.visit('https://mi-pagina.com') cy.log(this.titulo) })
Si ambas pruebas visitan el mismo superdominio, el cy.log imprime el valor guardado, por ejemplo to do list para Cypress. Todo fluye.
¿Qué pasa cuando cambias de dominio entre pruebas?
Aquí está el matiz importante. Cypress sí te permite visitar diferentes superdominios en pruebas distintas, no falla. Lo que falla es la persistencia del alias.
Si la primera prueba guarda titulo desde el dominio A y la segunda prueba navega al dominio B, el cy.log(this.titulo) no devuelve nada. La variable se limpia porque cambió el contexto de origen.
¿Por qué se pierde el alias entre dominios distintos? Cypress limpia el contexto compartido cuando cambias de superdominio entre pruebas, como medida de aislamiento y seguridad. El alias deja de existir en la nueva prueba.
¿Cuándo te conviene aceptar esta restricción?
En la mayoría de los flujos reales, querer saltar entre superdominios suele apuntar a un solo objetivo: transferir un dato capturado de un sitio a otro. Si ese es tu caso, vale la pena revisar si realmente necesitas dos dominios o si puedes resolverlo con fixtures, variables de entorno o mocks.
Algunas señales de que estás peleando contra Cypress en lugar de aprovecharlo:
- Intentas hacer login en un proveedor externo dentro del mismo test que valida tu app.
- Quieres scrapear datos de un sitio público para inyectarlos en otro flujo.
- Necesitas validar redirecciones que cruzan dominios completos.
Para estos escenarios existen comandos específicos como cy.origin(), que se cubren más adelante. Por ahora, recuerda la regla: mismo superdominio, libertad total; dominios distintos, prepárate para perder el contexto.
Si tienes un caso de uso distinto donde necesites saltar entre superdominios, déjalo en los comentarios para que el resto de la comunidad aprenda contigo.