Estoy probando una lista desplegable virtual, mi código es así:
while (!cy.contains('.ant-select-item',/^Cypress$/)) { cy.get('.ant-select-dropdown').trigger('wheel', {deltaX:0,deltaY:100}); } Sigue girando hacia abajo hasta que encuentra un elemento específico. Sin embargo, este código no funciona, cuando contains no encuentra el elemento específico, falla la prueba en lugar de devolver falso.
¿Cómo hacer que el ciclo while funcione?
Puede usar jQuery, Cypress.$ en su lugar.
while (!Cypress.$('.ant-select-item:contains('Cypress').length) { cy.get('.ant-select-dropdown').trigger('wheel', {deltaX:0,deltaY:100}); } Una cosa: :contains() coincidirá parcialmente, por lo que esto no es bueno si más de un elemento tiene la cadena.
Versión larga - Cypress.$('.ant-select-item:contains('Cypress') obtiene una lista de elementos coincidentes. Si no encuentra ninguno, no falla, pero la longitud de la lista es 0. Dado que 0 es falso, el bucle continúa.
La idea del bucle solo es buena si el menú desplegable realmente contiene el valor en alguna parte, de lo contrario, gira para siempre.
Si bien los bucles generalmente no funcionan con Cypress, sería más seguro usar una función de repetición (recursiva)
function findItem(item, loop = 0) { if (loop === 10) throw 'Too many attempts' cy.get('.ant-select-item') .invoke('text') .then(textsOfCurrentList => { if (!textsOfCurrentList.contains(item)) { // wheel down and try next cy.get('.ant-select-dropdown').trigger('wheel', {deltaX:0,deltaY:100}) findItem(item, ++loop) } else { return } }) }) findItem('Cypress')O con el paquete cypress-recurse
recurse( () => cy.get('.ant-select-item').invoke('text'), (textsOfCurrentList) => { const found = textsOfCurrentList.contains(item) if (!found) { cy.get('.ant-select-dropdown').trigger('wheel', {deltaX:0,deltaY:100}) } return found // true means finish, false means repeat }, { log: true, limit: 10, // max number of iterations timeout: 30000, // time limit in ms }, )Una buena información de fondo para evitar bucles en ciprés