Cypress – Comportamiento de .get (para reutilizar el elemento obtenido)
Soy un traductor de español que traduce documentos de TI. Traduzca lo siguiente al español. No traduzca el código y el resultado en markdown
Estoy usando Cypress con Cucumber (Gherkin) y este es el Escenario:
gerkin
Escenario: Abrir página de cartera
Entonces debería ver “Portafolio” en el encabezado
Luego debería ver una tabla con las siguientes cabeceras (1)
| Cabecera |
| Moneda |
| Cantidad |
| Empresas |
Luego debería ver una tabla con las siguientes cabeceras (2)
| Cabecera |
| Moneda |
| Cantidad |
| Empresas |
Ahora, la primera implementación (1) siempre funciona, pero la segunda (2), la que “reutiliza” el objeto “tabla”, siempre falla.
typescript
Luego(‘debería ver una tabla con las siguientes cabeceras (1)’, (dataTable) => {
// llama al backend para recuperar datos
cy.wait(2000) // espera 2 segundos
cy.get(‘table’).should(‘be.visible’)
for (let row of dataTable.rows()) {
cy.get(‘table’).find(‘th’).should(“contain”, row[0])
}
})
Luego(‘debería ver una tabla con las siguientes cabeceras (2)’, (dataTable) => {
// llama al backend para recuperar datos
cy.wait(2000) // espera 2 segundos
const table = cy.get(‘table’)
table.should(‘be.visible’)
for (let row of dataTable.rows()) {
table.find(‘th’).should(“contain”, row[0])
}
})
En realidad falla en la segunda cabecera, “Cantidad”.
Timeout en el reintento después de 4000 ms: Se esperaba encontrar el elemento: th, pero nunca se encontró. Consultado desde el elemento: [
, 3 más… ] ¿Por qué?
davy.ai
La razón por la cual la segunda implementación (2) falla es que
cy.get('table')
devuelve una promesa que se resuelve más tarde, después de que se ejecuten todos los callbacks de.then()
. Por lo tanto, cuando se ejecuta la instrucciónconst table = cy.get('table')
, la promesa aún no se ha resuelto ytable
es una promesa, no el elementotable
real. Como resultado,table.find('th')
no puede encontrar ningún elementoth
porquetable
aún no es el elementotable
real. Para solucionar esto, necesitamos usar.then()
para esperar a que la promesacy.get('table')
se resuelva antes de poder usar el elementotable
. Aquí hay una implementación modificada que debería funcionar:En esta implementación, usamos
.then()
para esperar a que la promesa devuelta porcy.get('table')
se resuelva antes de usartable
. Luego, usamoscy.wrap(table)
para envolvertable
en una cadena de comandos de Cypress y usamos.find()
para encontrar elementosth
dentro detable
.