Esto es lo que sucede con las cadenas de comandos en Cypress. Si observo el comando EQ, puedes ver que se aplica exactamente a esos dos elementos que el comando get ha encontrado. Es el array de dos elementos. El comando EQ está utilizando eso. Y nuevamente, está produciendo algo, por lo que ha filtrado el segundo elemento. Se produce el segundo. Podemos ver esto, hay un div, etc. Entonces, cuando hago clic en contains, nuevamente puedes ver que se aplica a ese elemento. El que el comando EQ ha pasado. Así es como funciona Cypress. Va a pasar información de un comando a otro hasta que hagamos algo con eso, hagamos una afirmación o hagamos clic en él o algo así. Entonces sí, el encadenamiento, un concepto muy importante en Cypress. Muy bien. Otro concepto muy importante en Cypress es la retrialidad. Así que echemos un vistazo a la segunda prueba. Guardo mi prueba y puedo ver que en realidad está tratando de afirmar que hay cinco elementos de tarjeta. Tengo este texto de tarjeta. Va a encontrar cinco elementos y los ha encontrado. Entonces la prueba ha pasado. Ahora, si cambiara este número de cinco a seis y guardara mi prueba, puedes ver que en realidad no falla de inmediato. En realidad está volviendo a intentar y tratando de encontrar esos seis elementos en la página hasta que finalmente la prueba va a fallar. Ahora, si estás trabajando con Selenium, es posible que conozcas esto como un tiempo de espera fluido. Olvidé si era fluido o fluido. Uno de esos. Básicamente, tenemos un límite superior de cuánto tiempo queremos esperar hasta que declaremos que la prueba ha fallado. Entonces, si quiero tener seis elementos, básicamente, el sexto elemento puede aparecer durante ese período de tiempo y la prueba va a pasar, como puedes ver aquí, así que si tengo seis, creo otra tarjeta, ahora está pasando. Ahora, puede haber otro. Oh, una cosa que quiero señalar es que tenemos este comando should que tiene la afirmación de que deberíamos tener seis elementos. Ahora, no solo se vuelve a intentar la afirmación, sino que también se vuelve a intentar el comando anterior. Porque si la afirmación no se cumple, si no hay seis elementos, volveremos a consultar los elementos en el DOM y básicamente llamaremos a ese comando get una y otra vez. Entonces, si tenemos una afirmación como esta, podemos pasar un tiempo de espera más largo y asegurarnos de esperar un período de tiempo más largo. Entonces, hagamos un tiempo de espera y hagamos 60 segundos, ¿verdad? Así que cuando guarde eso ahora, y veas que no hay seis elementos en la página, puedes ver que Cypress está volviendo a intentar, volviendo a intentar, volviendo a intentar hasta que finalmente cuando agrego ese sexto elemento, la prueba va a pasar. Ahora, lo que puede suceder no solo esto, sino que podemos tener un problema opuesto. Entonces, lo que voy a hacer, tengo este código malicioso preparado aquí y tengo esta función cards load slowly, que va a cargar las tarjetas en mi tablero durante más tiempo, así que este es un truco que tengo para mi aplicación. Ahora, si echas un vistazo, oh, vamos a hacer esta inserción a cinco. Entonces, la prueba debería pasar, ¿verdad? Si observas lo que está sucediendo aquí, las tarjetas se están cargando, la prueba falla, pero eventualmente, nuestras tarjetas aparecen, ¿verdad? Entonces, si tenemos una aplicación lenta, esto podría ser un problema, ¿verdad? Porque las tarjetas eventualmente aparecen, por lo que no deberíamos declarar que la prueba ha fallado, probablemente debería pasar. Ya te mostré la solución. Podemos hacer que ese tiempo de espera sea un poco más largo, podemos hacer que ese reintentar sea un poco más largo, por defecto, son cuatro segundos, pero podemos hacerlo más largo. Hagámoslo seis segundos, así que ese es el tiempo en milisegundos, ¿verdad? Entonces, cuando lo guarde ahora, y las tarjetas tardan cinco segundos en cargarse, todavía se cargarán a tiempo para que la prueba pase. Y, por supuesto, incluso si pongo como 60 segundos, mi prueba va a pasar cuando encuentre esos cinco elementos, por lo que no va a esperar 60 segundos completos, solo el tiempo máximo necesario, y luego procede a terminar la prueba o pasar al siguiente comando. Entonces, podemos cambiar ese tiempo de espera tanto a nivel de comando como a nivel de prueba. La forma en que podemos hacer eso es, como mencioné, la función ID tiene dos parámetros, ¿verdad? El primero es el nombre de la prueba, el segundo es una devolución de llamada, pero en realidad podemos hacer que el segundo sea un objeto y que sea como un objeto de configuración de prueba. Entonces, lo que podemos hacer aquí es definir el tiempo de espera de comando predeterminado y decir que debería ser de seis segundos. Entonces, cuando guarde esto, todos los comandos en realidad ahora tendrán no los cuatro segundos por defecto, sino seis segundos de tiempo de espera por defecto. También podemos definir eso no solo a nivel de prueba, sino que podemos hacerlo para todo el conjunto de pruebas. Entonces, si vamos a tiempo de espera de comando predeterminado, oh, lo siento, eso no es un objeto e2e, en realidad está fuera de él. Podemos decir que, bien, estamos probando una aplicación bastante lenta, por lo que hagamos que el tiempo de espera de comando predeterminado no sea de cuatro segundos, sino de seis segundos. Entonces, sí, eso es algo que deberías hacer. Aunque no recomendaría poner ese tiempo de espera de comando en un número muy alto, porque no solo significa que tus pruebas van a tener una reintentabilidad más larga, también significa que van a tardar mucho más tiempo en fallar, lo que podría ser un problema si tienes cientos de pruebas. Si agregas solo un segundo y 60 de tus pruebas deberían fallar, entonces acabas de agregar un minuto de espera a tu prueba, o no un minuto, porque si están fallando, obviamente están tardando más tiempo. Entonces sí, básicamente trata de mantener este número lo más bajo posible, por supuesto, dentro de límites razonables. Muy bien, pongamos todo esto junto. Tenemos el encadenamiento, tenemos la reintentabilidad. Ahora echemos un vistazo a la tercera prueba donde combinamos estos dos conceptos. Tengo otro código malicioso aquí y eso carga las tarjetas al azar. Así que hagamos tres segundos aquí, lo que esto va a hacer es que no todas las tarjetas se cargarán al mismo tiempo, sino que se cargarán al azar, por lo que las tarjetas en la primera lista se cargarán primero o las tarjetas en la segunda lista se cargarán primero. Lo que eso significa al mirar la prueba, tal vez puedas darte cuenta, tal vez no, lo que significa es que estamos seleccionando las tarjetas, ¿verdad? Tan pronto como encontremos las tarjetas, queremos seleccionar la segunda y asegurarnos de que el texto sea `breadth`. Ahora la segunda es `breadth`, ¿verdad? Pero si ejecutamos la prueba un par de veces, podríamos encontrarnos en una situación en la que nuestra prueba fallaría. Intentemos llegar a esa situación, y aquí está. Nuestra prueba está fallando. Y ¿por qué es eso? Bueno, la línea de tiempo nos lo dirá, ¿verdad? Si paso el cursor sobre mi comando EQ, puedes ver que no está seleccionando esta primera tarjeta, ¿verdad? Esta, pero está seleccionando la segunda. Ahora, ¿por qué es eso? ¿Cuál es la razón detrás de eso? Bueno, la razón es que las tarjetas en la segunda lista se cargaron primero, lo que significa que encontramos algunas tarjetas. Luego filtramos la segunda, que era esta tarjeta de jabón en este caso, y afirmamos que contiene el texto `breadth`. Entonces, el problema aquí es que cuando hablábamos de reintentabilidad, ya mencioné eso. Cuando tenemos una afirmación, hará que el comando anterior vuelva a intentar, ¿verdad? Pero no hará que toda la cadena vuelva a intentar. Entonces, lo que sucede es que quedaremos atrapados en un bucle infinito entre estos dos elementos, donde entre estos dos comandos, donde el comando EQ simplemente está filtrando y filtrando, y aún está filtrando esos dos elementos que el comando get ha encontrado, porque este no volverá a intentar. Y nuestro comando shoot está tratando de afirmar algo que simplemente nunca va a cambiar, porque el comando EQ ya está trabajando con esos dos elementos que estaban allí antes. Entonces, si echas un vistazo a la consola, eso puede ser más claro. El comando get encontrará dos elementos. Tan pronto como encuentre dos elementos, pasará al siguiente comando.
Comments