Búsqueda de sitios web

javascript - Playwright recargar la página después de la navegación si cierto código de estado


Estoy en una situación en la que necesito que mis pruebas funcionales del navegador comprueben el código de estado devuelto de todas las respuestas de las páginas y, si obtengo un 503, intentar recargar la página X número de veces antes de fallar.

He intentado usar los eventos de red de Playwright, pero parece que alterar el estado de la página (es decir, activar una recarga) rompe cualquier interacción futura y terminas con errores El contexto de ejecución fue destruido, muy probablemente debido a una navegación.

Por ejemplo:

page.on('response', async (response) => {
  if (response.request().resourceType() !== 'document') return;

  if (response.status() === 503) {
    await page.reload();
  }
}

(He omitido la lógica de los intentos de reintento por simplicidad)

Después de que este código se haya ejecutado, cualquier intento de interactuar con la página resultará en el error El contexto de ejecución fue destruido.

No estoy 100% seguro de que esta sea la forma correcta de abordar este problema. ¿Alguna idea?

Respuesta #1

Para mí, esta parte solo era necesaria al buscar cómo recargar la página con Playwright:

await page.reload();

Respuesta #2

Este es un escenario interesante. Si response estuviera disponible en BrowserContext, tu enfoque funcionaría. Dado que ese no es el caso, el "recargar" necesita hacerse abriendo una nueva página.

Esto se puede lograr con un método auxiliar que "devuelve la página después de reintentos". Este método reintentaría la creación de la página y la navegación en caso de un código de estado de error.

const {chromium} = require('playwright');

const pageAfterRetries = async (context, url, maxRetries) => {
    if (!maxRetries) return;

    const page = await context.newPage();
    const [_, response] = await Promise.all([
        page.goto(url),
        page.waitForEvent('response', response => response.request().resourceType() === 'document')
    ]);
    if (response.status() === 503) {
        // Retry if this happens
        await page.close();
        return pageAfterRetries(context, url, maxRetries - 1);
    }
    return page;
}

(async() => {
    const browser = await chromium.launch({headless: false});
    const context = await browser.newContext();
    const page = await pageAfterRetries(context, 'https://www.google.com', 3);

    // Use page for remaining script
    console.log(page);
})();

Artículos relacionados