es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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é?

Tags:  

Answer

  1. Avatar for 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ón const table = cy.get('table'), la promesa aún no se ha resuelto y table es una promesa, no el elemento table real. Como resultado, table.find('th') no puede encontrar ningún elemento th porque table aún no es el elemento table real. Para solucionar esto, necesitamos usar .then() para esperar a que la promesa cy.get('table') se resuelva antes de poder usar el elemento table. Aquí hay una implementación modificada que debería funcionar:

    Then('Debería ver una tabla con los siguientes encabezados (2)', (dataTable) => {    
        // llama al backend para obtener datos
        cy.wait(2000) // esperar 2 segundos
    
        cy.get('table').should('be.visible').then((table) => {
            for (let row of dataTable.rows()) {
                cy.wrap(table).find('th').should("contain", row[0])
            }
        })
    })
    

    En esta implementación, usamos .then() para esperar a que la promesa devuelta por cy.get('table') se resuelva antes de usar table. Luego, usamos cy.wrap(table) para envolver table en una cadena de comandos de Cypress y usamos .find() para encontrar elementos th dentro de table.

Comments are closed.