Есть два способа решения этой проблемы. Во-первых, вместо * по умолчанию networkidle0
следует использовать networkidle2
(«считать навигацию завершенной, если в течение не менее 500 мсек не более 2 сетевых подключений»), чтобы до двух запросов могли выполняться медленно, не влияя на вашу работу. код:
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto(process.argv[2], {waitUntil: "networkidle2"}).then( () => {
}, (e) => {
console.error("Error", e);
});
browser.close();
В качестве альтернативы, для реализации тайм-аутов на отдельных запросах страниц я бы предложил использовать модуль тайм-аутов, например p-timeout
:
const pTimeout = require("p-timeout");
const shorterTimeout = 10000;
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.setRequestInterception(true);
page.on('request', async (request) => {
if (!shouldImplementTimeout(request.url())) {
await request.continue();
}
await pTimeout(request.continue(), shorterTimeout)
.catch((e) => {
console.error(request.url(), "failed:", e);
await request.abort("timedout");
});
})
await page.goto(process.argv[2]).then( () => {
}, (e) => {
console.error("Error", e);
});
browser.close();
Вам нужно будет написать shouldImplementTimeout
, что должно вернуть true
, если запрос требует более короткого времени ожидания.