0

Puppeteer время ожидания

Время ожидания (timeout) устанавливает максимальное время ожидания для определенного метода или методов, по истечению которых будет выдана ошибка или исключение.

  1. Puppeteer время ожидания по умолчанию
  2. Метод setDefaultNavigationTimeout
  3. Метод setDefaultTimeout
  4. Свойство timeout параметра options
  5. Свойство waitUntil параметра options
  6. Puppeteer время ожидания promise

Puppeteer время ожидания по умолчанию

В puppeteer время ожидания по умолчанию (timeout) равно 30 секунд. Для использования пользовательского времени ожидания можно воспользоваться методами page.setDefaultNavigationTimeout() и page.setDefaultTimeout() или свойством timeout в параметре options. Время ожидания во всех случаях задается в миллисекундах.

Во всех перечисленных далее способах в puppeteer время ожидания можно установить равным 0, т.е. отключить timeout.

Метод setDefaultNavigationTimeout

Изменяет максимальное время ожидания для следующих методов:

page.goBack()
page.goForward()
page.goto()
page.reload()
page.setContent()
page.waitForNavigation()

Чтобы установить время ожидания 60 секунд, необходимо выполнить:

await page.setDefaultNavigationTimeout(60000);

Воспользоваться методом можно после объявления страницы:

const puppeteer = require('puppeteer');          // подключаем puppeteer

(async () => {
const browser = await puppeteer.launch();        // запускаем браузер
const page = await browser.newPage();            // открываем новую вкладку
await page.setDefaultNavigationTimeout(60000);   // изменяем время ожидания
...                                              // ваш код
await browser.close();                           // закрываем браузер
})();

Метод setDefaultTimeout

Изменяет максимальное время ожидания для следующих методов:

page.goBack()
page.goForward()
page.goto()
page.reload()
page.setContent()
page.waitFor()
page.waitForFileChooser()
page.waitForFunction()
page.waitForNavigation()
page.waitForRequest()
page.waitForResponse()
page.waitForSelector()
page.waitForXPath()

Чтобы установить время ожидания 45 секунд, необходимо выполнить:

await page.setDefaultTimeout(45000);

Воспользоваться методом можно также только после объявления страницы:

const puppeteer = require('puppeteer');          // подключаем puppeteer

(async () => {
const browser = await puppeteer.launch();        // запускаем браузер
const page = await browser.newPage();            // открываем новую вкладку
await page.page.setDefaultTimeout(45000);        // изменяем время ожидания
...                                              // ваш код
await browser.close();                           // закрываем браузер
})();

Обратите внимание, что метод setDefaultNavigationTimeout имеет более высокий приоритет, чем setDefaultTimeout!

Свойство timeout параметра options

Если требуется установить в puppeteer время ожидания только для одного из методов страницы (page.goto(), page.waitFor(), page.waitForSelector() и т.д.), то это можно сделать через свойство timeout параметра options (с полным списком методов, в которых доступно данное свойство можно ознакомиться в документации).

Например, чтобы изменить максимальное время ожидания при загрузке страницы необходимо при использовании данного метода указать свойство timeout:

await page.goto('<site url>', {timeout: ms});

Например, загрузка страницы google с максимальным временем ожидания 45 секунд:

const puppeteer = require('puppeteer');                  // подключаем puppeteer

(async () => {
const browser = await puppeteer.launch();                // запускаем браузер
const page = await browser.newPage();                    // открываем новую вкладку
await page.goto('https://google.com', {timeout: 45000}); // изменяем время ожидания
...                                                      // ваш код
await browser.close();                                   // закрываем браузер
})();

Свойство waitUntil параметра options

С помощью данного свойства можно ожидать полной загрузки страницы / документа или отсутствия сетевой активности. Возможны следующие значения (по умолчанию – load):

load – навигация считается завершенной (после события окончания загрузки).:
domcontentloaded – навигация считается завершенной (после события DOMContentLoaded):
networkidle0 – навигация считается завершенной, если в течение менее 500 мс отсутствуют активные подключения.
networkidle2 – навигация считается завершенной, если в течение менее 500 мс существует не более 2 активных сетевых подключений.

Данное свойство присутствует в параметрах следующих методов:

page.goBack()
page.goForward()
page.goto()
page.reload()
page.setContent()
page.waitForNavigation()

Например, чтобы убедиться, что страница загрузилась, закончились выполняться все скрипты и т.д. можно воспользоваться свойством networkidle0:

await page.goto('<site url>', {waitUntil: networkidle0});

Пример:

const puppeteer = require('puppeteer');                           // подключаем puppeteer

(async () => {
const browser = await puppeteer.launch();                         // запускаем браузер
const page = await browser.newPage();                             // открываем новую вкладку
await page.goto('https://google.com', {waitUntil: networkidle0}); // ожидаем отсутствия сетевой активности
...                                                               // ваш код
await browser.close();                                            // закрываем браузер
})();

Puppeteer время ожидания promise

В данной статье мы ожидали появления всплывающего окна. Но если оно не откроется, то скрипт не продолжит свое выполнение. Чтобы этого избежать необходимо установить ограничение на время ожидания promise. Для этого я написал следующую функцию, в которою передается promise и максимальное время ожидания. Если событие произошло, то функция возвращает результат, иначе значение ‘1’:

async function timeoutPromise(promise, ms){
  timeout = new Promise(function(resolve, reject){
        setTimeout(resolve, ms, 1);
  });
  result = Promise.race([promise, timeout]).then(function(value){
        return value;
  });
  return result;
}

Допишем наш код:

const puppeteer = require('puppeteer');         // подключаем puppeteer

// функция ожидания promise
async function timeoutPromise(promise, ms){
  timeout = new Promise(function(resolve, reject){
        setTimeout(resolve, ms, 1);
  });
  result = Promise.race([promise, timeout]).then(function(value){
        return value;
  });
  return result;
}

(async () => {
const browser = await puppeteer.launch();       // запускаем браузер
const page = await browser.newPage();           // открываем новую вкладку
await page.goto('https://site.com');            // переходим на site.com       

await page.waitForSelector('#goto');            // ожидаем загрузку объекта
const link = await page.$('#goto');             // объявляем объект

const newPagePromise = new Promise(x => page.once('popup', x));

await link.click();                             // кликаем, должна открыться новая вкладка
newPageResult = await timeoutPromise(newPagePromise, 5000); // на открытие вкладки даем 5 сек

if(newPageResult == 1){                         // если результат равен 1 - значит вкладка не открылась
    console.log('Новая страница не открылась');
    await browser.close();                      // закрываем браузер
    return;
}
...                                             // ваш код
await browser.close();                          // закрываем браузер
})();