Время ожидания (timeout) устанавливает максимальное время ожидания для определенного метода или методов, по истечению которых будет выдана ошибка или исключение.
- Puppeteer время ожидания по умолчанию
- Метод setDefaultNavigationTimeout
- Метод setDefaultTimeout
- Свойство timeout параметра options
- Свойство waitUntil параметра options
- 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(); // закрываем браузер
})();