Aprende a evitar que se produzca esta excepción durante la automatización de tareas con Puppeteer en Node.js

Durante la automatización de múltiples tareas en mi trabajo y proyectos personales, decidí pasar a Puppeteer en lugar del PhantomJS de la vieja escuela. Uno de los problemas más habituales con las páginas que contienen mucho contenido, debido a los anuncios, imágenes, etc., es el tiempo de carga, se lanza una excepción (específicamente TimeoutError) después de que una página tarda más de 30000ms (30 segundos) en cargar. totalmente.

Para solucionar este problema (TimeoutError: Navigation timeout of 30000 ms exceeded), tendrás 2 opciones, ya sea aumentar este tiempo de espera en la configuración o eliminarlo. Personalmente, prefiero eliminar el límite porque sé que las páginas con las que trabajo terminarán cargándose algún día.

En este artículo, le explicaré brevemente 2 formas de evitar esta limitación.

A. Globalmente en la pestaña

La opción que prefiero, ya que navego por varias páginas en la misma pestaña, es eliminar el límite de tiempo de espera en la pestaña que utilizo para navegar. Por ejemplo, para eliminar el límite, debe agregar:

await page.setDefaultNavigationTimeout(0); 

El método setDefaultNavigationTimeout disponible en una página creada de Puppeteer le permite definir el tiempo de espera de la pestaña y espera como primer argumento, el valor en milisegundos. Un valor de 0 significa una cantidad de tiempo ilimitada. El siguiente fragmento muestra cómo puede hacerlo en un ejemplo real:

// Incluir puppeteer
const puppeteer = require('puppeteer');

(async () => {
    // Crea una instancia del navegador Chrome
    // ¡Pero desactive el modo sin interfaz grafica!
    const browser = await puppeteer.launch({
        headless: false
    });

    // Crea una nueva pagina
    const page = await browser.newPage();

    // Configurar el tiempo de espera de la navegación
    await page.setDefaultNavigationTimeout(0);

    // Navegue a algún sitio web, por ejemplo, Our Code World
    await page.goto('http://ourcodeworld.com');

    // Haz tus cosas
    // ...
})();

B. Específicamente en la página actual

Alternativamente, para páginas específicas en caso de que maneje varias páginas en diferentes variables, deberías poder especificar el límite en el contexto como una opción en el objeto de configuración del método page.goto:

await page.goto('https://ourcodeworld.com', {
    waitUntil: 'load',
    // Eliminar el tiempo de espera
    timeout: 0
});

El siguiente fragmento muestra cómo hacerlo en un ejemplo real:

// Incluir puppeteer
const puppeteer = require('puppeteer');

(async () => {
    // Crea una instancia del navegador Chrome
    // ¡Pero desactive el modo sin interfaz grafica!
    const browser = await puppeteer.launch({
        headless: false
    });

    // Crear pagina nueva
    const page = await browser.newPage();

    // Configurar el tiempo de espera de la navegación
    await page.goto('https://ourcodeworld.com', {
        waitUntil: 'load',
        // Remove the timeout
        timeout: 0
    });

    // Navegue a algún sitio web, por ejemplo, Our Code World
    await page.goto('http://ourcodeworld.com');

    // Haz tus cosas
    // ...
})();

Que te diviertas ❤️!


Ingeniero de Software Senior en EPAM Anywhere. Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores