¿Cómo usar el console.log y el debugger para depuración en Cypress?
Al enfrentarnos a problemas en nuestro código durante el desarrollo con Cypress, la depuración se convierte en una herramienta vital. Comenzamos explorando el método clásico: el console.log. Esta técnica, a menudo utilizada por desarrolladores JavaScript, permite imprimir valores en la consola para inspeccionar, por ejemplo, la longitud de un array:
console.log("Soy la longitud", inputs.length);
Podemos abrir el navegador y la consola para verificar que se imprimen nuestros valores esperados. Aunque efectiva, necesitar abrir las DevTools puede no ser siempre la opción más eficiente.
Otra herramienta que podemos usar es el debugger. Este método pausa la ejecución del código, permitiéndonos examinar el call stack y los valores de las variables en tiempo real. Sin embargo, su funcionalidad está limitada a cuando las DevTools están abiertas.
debugger;
Así, el debugger sigue siendo una herramienta poderosa, especialmente nativo en JavaScript, si mantenemos la consola activa.
¿Cómo crear un plugin y usar tasks en Cypress?
Para superar las limitaciones del console.log y debugger en entornos donde no podemos ver el navegador, como en CI/CD, los plugins personalizados son una excelente alternativa. Cypress permite agregar funciones externas mediante su carpeta de plugins y el archivo index.js. Un ejemplo sencillo es crear un task para registrar logs:
on('task',{logMessage(message){console.log('Soy el console.log del task', message);returnnull;}});
Para usar este task, podemos integrarlo en nuestras pruebas así:
cy.task('logMessage', inputs.length);
Esto nos permite recibir feedback en entornos sin interfaz gráfica, facilitando la depuración en modo headless.
¿Cuáles son las alternativas al console.log?
Adicionalmente, Cypress ofrece funcionalidades como el cy.log y cy.debug, permitiendo un control más detallado y adaptable. Usando cy.log, podemos evitar abrir constantemente la consola para ver los resultados:
cy.log("Soy la longitud", inputs.length);
Utilidad de cy.debug
El cy.debug actúa como un console.log, pero integrado con Cypress. Cuando se ejecuta, proporciona detalles más claros sobre los elementos y valores en las operaciones actuales:
cy.get('form').find('label').debug();
Y añadiendo comodidad, el cy.pause permite detener la ejecución de pruebas, dándonos tiempo para analizar los errores o comportamientos inesperados en detalle.
¿Por qué son importantes las pausas y depuraciones en Cypress?
Utilizar cy.pause es crucial para detener y examinar la ejecución de nuestras pruebas. Por ejemplo, si un proceso es demasiado rápido, podemos pausar para verificar si una página carga correctamente. El control visual sobre nuestra prueba con las pausas interactivas nos permite diagnosticar problemas sin modificar continuamente el código.
Estas estrategias avanzadas de depuración proporcionan herramientas esenciales para trabajar eficientemente. Sin detenerse en la simple impresión de logs, Cypress nos dota de un marco robusto para enfrentar los desafíos de identificar errores en la codificación. Con práctica, dominarás estas técnicas y serás capaz de resolver complejos problemas de manera más intuitiva y efectiva. ¡Sigue explorando y depurando con confianza!
En la nueva version no se descarga la carpeta de plugins que usa el profesor para agregar el 'task', ahora tenemos que hacerlo directo en el documento de configuracion como en esta Info lo indica
Para poder configurar el task en CY 10, se realiza en el cypress.config.js
e2e:{// implement node event listeners heresetupNodeEvents(on, config){// plugins para imprimir en la consola del terminal on('task',{log(message){console.log('Mensaje del console log del task '+ message)returnnull}})},
me sirvio, gracias.
Plugins
📚 Documentación
.
Los plugins son extensiones que nos permiten modificar el comportamiento interno de Cypress. Básicamente, son funcionalidades que son ejecutados en etapas del ciclo de vida de Cypress.
.
Los casos de uso son variados, descritas en su documentación de Cypress, por lo que enumero las siguientes más interesantes:
Configuración Plugins que operan al configurar o durante el reconocimiento del entorno donde se ejecuta Cypress
Pre-procesadores Plugins que operan para la personalización de la transpilación del código enviado al navegador
Ciclo de pruebas Plugins que ocurren antes y después de ciertos bloques de ejecución, como reportes o entregas de tiempo
.
Plugin para eventos
Como visto en esta sesión, son plugins que operan en conjunto con el comando task, permitiendo escribir código arbitrario para NodeJS que no es de intención ser realizado por el navegador.
.
Casos de uso como:
Manipulación de base de datos
Almacenar estados que serán persistidos por el backend
📚 Documentación
.
Retomando lo visto en esta sesión, el proceso de inspección de un código (Debugger) nos permite analizar procesos secuenciales como estados, valores de retorno, interacciones, etc.
.
Usando el Debugger de forma tradicional
Cuando obtenemos un elemento .get, visitamos un sitio.visit / .url o montamos un componente mount, podemos encadenar un debugger mediante la funcionalidad .then.
Cypress, expone adicionalmente el comando .debug() con el que al referenciar un elemento, podemos interactuar con él mediante la variable subject.
.
!image
.
O de manera complementaria, detener el proceso mediante el comando .pause (visto en esta sesión).
Anatomía de un error
📚 Documentación
.
Como está descrita en su documentación, Cypress nos presenta varias piezas de información que ocurren cuando sucede un error.
Nombre del error - Describiendo el tipo de error
Mensaje de error - Describiendo en alto nivel el hecho o fallo, donde adicionalmente veremos una sugerencia para arreglar al mismo error
Enlace adicional - Enlace directo a la documentación de Cypress como referencia
Sección de código - Marcando la línea origen de error
Bloque de código - Fracción de código del origen de error
Trazo de error - Seguimiento del camino del error
DevTools - Botón que permite visualizar en DevTools nuestro asunto
.
!image
Aquí hay algunas técnicas comunes para debuggear pruebas en Cypress:
Uso de comandos cy.log(): Puedes insertar comandos cy.log() en tu código para registrar mensajes en la consola de Cypress durante la ejecución de la prueba. Esto te permite verificar valores de variables, estados de elementos y más.
cy.log('Mensaje de depuración');
Uso de cy.pause(): Este comando pausará la ejecución de la prueba y te permitirá inspeccionar manualmente el estado de la aplicación y las variables en ese momento. Puedes reanudar la prueba cuando estés listo.
cy.pause();
Uso de cy.debug(): Similar a cy.pause(), este comando permite pausar la ejecución de la prueba y abrir una consola interactiva de DevTools para inspeccionar la aplicación y ejecutar comandos de Cypress directamente en la consola DevTools.
cy.debug();
Grabación de videos y capturas de pantalla: Cypress puede grabar videos de la ejecución de la prueba y capturar capturas de pantalla en caso de errores. Esto te permite revisar la ejecución paso a paso y entender mejor lo que sucedió durante la prueba.
Uso de cy.get() con selectores precisos: Asegúrate de usar selectores CSS o selectores personalizados precisos para ubicar elementos en la página. Puedes usar la función .should() para verificar el estado de un elemento después de su selección.
Revisión de la consola del navegador: Además de las herramientas de Cypress, también debes revisar la consola del navegador (DevTools) en busca de errores de JavaScript, advertencias y mensajes de registro que puedan ayudarte a identificar problemas en tu aplicación web.
Uso de comandos cy.wait(): A veces, es necesario agregar comandos cy.wait() para asegurarse de que ciertas acciones o eventos se completen antes de continuar con la prueba.
Buenas
Intente los del task con cypress 10 y me da este error:
cy.task('log') failed with the following error:
The 'task' event has not been registered in the setupNodeEvents method. You must register it before using cy.task()
No he logrado porque. Agrege el task en el archivo de configuración de cypress 10
Alguien ha hecho esto con cypress 10?
En los "Aportes" dejaron esto:
e2e: {
// implement node event listeners here
setupNodeEvents(on, config) {
// plugins para imprimir en la consola del terminal
on('task',{
log(message){
console.log('Mensaje del console log del task ' + message)
return null
}
})
},
Creo que solucionaría tu problema.
Ahora tienes que agregar esto al cypress.config.js
setupNodeEvents(on, config){on('task',{log(message){console.log(`Soy el console log del task ${message}`)returnnull}})}```De la siguiente manera
```js
const{ defineConfig }=require('cypress');module.exports=defineConfig({e2e:{chromeWebSecurity:false,experimentalModifyObstructiveThirdPartyCode:true,baseUrl:'https://demoqa.com',setupNodeEvents(on, config){// implement node event listeners here},excludeSpecPattern:["**/1-getting-started/*.js"],"viewportWidth":1920,"viewportHeight":1080,testIsolation:false,setupNodeEvents(on, config){on('task',{log(message){console.log(`Soy el console log del task ${message}`)returnnull}})}},});```Si necesitan aprender más de los plugins y como se implementan actualmente, este es el link:Ahí se comenta que el anterior método con la carpeta plugins está **Deprecated**, por lo que deberán leer lo nuevo.