refactor: refs #8484 improve selectOption command with retry logic for visibility checks

This commit is contained in:
Jose Antonio Tubau 2025-02-04 13:58:56 +01:00
parent 6c36bdb834
commit 3bb09c8310
1 changed files with 42 additions and 26 deletions

View File

@ -100,33 +100,48 @@ Cypress.Commands.add('getValue', (selector) => {
// Fill Inputs // Fill Inputs
Cypress.Commands.add('selectOption', (selector, option, timeout = 5000) => { Cypress.Commands.add('selectOption', (selector, option, timeout = 5000) => {
cy.waitForElement(selector, timeout); // cy.waitForElement(selector, timeout);
cy.get(selector).click(); // cy.get(selector).click();
cy.get(selector).invoke('data', 'url').as('dataUrl'); // cy.get(selector).invoke('data', 'url').as('dataUrl');
cy.get(selector) // cy.get(selector)
.clear() // .clear()
.type(option) // .type(option)
.then(() => { // .then(() => {
cy.get('.q-menu', { timeout }) // cy.get('.q-menu', { timeout })
.should('be.visible') // Asegurarse de que el menú está visible // .should('be.visible') // Asegurarse de que el menú está visible
.and('exist') // Verificar que el menú existe // .and('exist') // Verificar que el menú existe
.then(() => { // .then(() => {
cy.get('@dataUrl').then((url) => { // cy.get('@dataUrl').then((url) => {
if (url) { // if (url) {
// Esperar a que el menú no esté visible (desaparezca) // // Esperar a que el menú no esté visible (desaparezca)
cy.get('.q-menu').should('not.be.visible'); // cy.get('.q-menu').should('not.be.visible');
// Ahora esperar a que el menú vuelva a aparecer // // Ahora esperar a que el menú vuelva a aparecer
cy.get('.q-menu').should('be.visible').and('exist'); // cy.get('.q-menu').should('be.visible').and('exist');
} // }
}); // });
}); // });
}); // });
// Finalmente, seleccionar la opción deseada // // Finalmente, seleccionar la opción deseada
cy.get('.q-menu:visible') // Asegurarse de que estamos dentro del menú visible // cy.get('.q-menu:visible') // Asegurarse de que estamos dentro del menú visible
.find('.q-item') // Encontrar los elementos de las opciones // .find('.q-item') // Encontrar los elementos de las opciones
.contains(option) // Verificar que existe una opción que contenga el texto deseado // .contains(option) // Verificar que existe una opción que contenga el texto deseado
.click(); // Hacer clic en la opción // .click(); // Hacer clic en la opción
const retryAssertion = (selector, option, retries = 5) => {
if (retries === 0) throw new Error('Assertion failed after retries');
cy.waitForElement(selector).click().clear().type(option);
cy.get('.q-menu')
.then($el => {
if ($el.css('visibility') !== 'visible') {
retryAssertion(selector, option, retries - 1);
} else {
cy.get($el).should('be.visible').find('.q-item').contains(option).click();
cy.wait(200);
}
});
};
retryAssertion(selector, option);
}); });
Cypress.Commands.add('countSelectOptions', (selector, option) => { Cypress.Commands.add('countSelectOptions', (selector, option) => {
@ -145,6 +160,7 @@ Cypress.Commands.add('fillInForm', (obj, form = '.q-form > .q-card') => {
if (!field) return; if (!field) return;
const { type, val } = field; const { type, val } = field;
cy.log("TIPO: ", field);
switch (type) { switch (type) {
case 'select': case 'select':
cy.selectOption(el, val); cy.selectOption(el, val);