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.

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.

Tags:  , , , ,

Answer

  1. Avatar for 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 comando switchToWindow. 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


    Esto esperará hasta que el título de la pestaña secundaria ya no sea "Loading..." o "Waiting..." antes de cambiar a ella, con un tiempo máximo de espera de 10 segundos. Otra posible solución es manejar las fallas ocasionales al cambiar mediante reintentos del comando `switchToWindow` un cierto número de veces hasta que sea exitoso. Esto se puede implementar utilizando un bucle `while` y un contador. Por ejemplo, puedes intentar reemplazar la línea `await this.driver.switchToWindow(childGUID)` con el siguiente código:

    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 de maxRetries según tus necesidades.

Comments are closed.