Webdriver.io: Problemas al cambiar a una nueva ventana/pestaña
Estoy utilizando Webdriver.io/Nodejs/Mocha y cuando intento cambiar de pestaña padre a pestaña hija, la mayoría de las veces funciona; sin embargo, hay momentos en los que la pestaña tarda mucho en cargarse debido a problemas/anuncios malos en la página y durante esos momentos, aunque obtenga el GUID de la ventana/pestaña, aún no cambia y permanece en la pestaña padre. No sucede todo el tiempo, pero ocasionalmente falla al cambiar.
¿Es necesario que la página se cargue por completo para poder cambiar a la pestaña hija? ¿Me falta algo? Cualquier ayuda será apreciada. ¡Gracias!
- Versión de Node: v16.13.1
- Versión de WebdriverIO: 7.16.12
- Versión de Mocha: 9.0.0
- Versión de Chromedriver: 95.0.0
Ejecución:
npx mocha --config ./mocharc.json ./test/test.js
Archivo de prueba: test.js
it('Caso de prueba: Cambiar pestañas', async () => {
let parentGUID;
let childGUID;
// Obtener GUID de la pestaña padre
parentGUID = await this.driver.getWindowHandle();
// Hacer clic en el elemento para abrir una nueva pestaña
await this.driver.elementClick('//a[@id="test"]');
// Esperar hasta que se cargue la nueva pestaña
await this.driver.pause(2000);
// Obtener todos los GUID
const allGUIDs = await this.driver.getWindowHandles();
// Verificar todos los GUID y encontrar cuál es el de la pestaña hija
for (let i = 0; i < allGUIDs.length; i++) {
if (allGUIDs[i] !== parentGUID) {
childGUID = allGUIDs[i];
}
}
// Cambiar a la pestaña hija
await this.driver.switchToWindow(childGUID);
// Realizar las afirmaciones de contenido en la nueva página aquí
// ...
// ...
// ...
// Cerrar la pestaña
await this.driver.closeWindow();
// Cambiar a la ventana/pestaña padre
await this.driver.switchToWindow(parentGUID);
})
Recuerde que el código y la salida deben presentarse en un bloque de código.
davy.ai
Basado en el fragmento de código proporcionado, parece que la página no tiene que cargarse completamente para cambiar a la pestaña secundaria. Sin embargo, el problema podría potencialmente estar en la línea
await this.driver.pause(2000)
, donde espera una duración fija de 2 segundos antes de obtener todos los identificadores de ventana. Si la página tarda más de 2 segundos en cargarse, puede causar retrasos en la obtención de los identificadores de ventana y resultar en la falla al cambiar a la pestaña secundaria.Una posible solución es usar una espera explícita en lugar de una pausa fija para asegurarse de que la pestaña secundaria se haya cargado completamente antes de intentar cambiar a ella. Esto se puede hacer utilizando la opción
waitUntil
en el comandoswitchToWindow
. Por ejemplo, puedes intentar agregar el siguiente fragmento de código después de obtener el GUID de la pestaña secundaria:“`await this.driver.waitUntil(async () => {
const title = await this.driver.getTitle();
return title !== ‘Loading…’ && title !== ‘Waiting…’;
}, { timeout: 10000 }); // esperar hasta 10 segundos para que la pestaña secundaria se cargue
let retries = 0;
let maxRetries = 3;
let switched = false;
while (!switched && retries < maxRetries) {
try {
await this.driver.switchToWindow(childGUID);
switched = true; // salir del bucle si el cambio es exitoso
} catch (err) {
console.log(
Error al cambiar a la pestaña secundaria (intento ${retries + 1})
);retries++;
}
}
if (!switched) {
throw new Error(‘Error al cambiar a la pestaña secundaria después de varios intentos’);
}
“`
Esto volverá a intentar el comando
switchToWindow
hasta 3 veces antes de lanzar un error si sigue fallando. Puedes ajustar el valor demaxRetries
según tus necesidades.