Node.js puppeteer - 如何设置导航超时?

Posted

技术标签:

【中文标题】Node.js puppeteer - 如何设置导航超时?【英文标题】:Node.js puppeteer - How to set navigation timeout? 【发布时间】:2019-02-09 07:48:18 【问题描述】:

我正在使用 node.js 和 puppeteer 来获取一些数据。我打开的一些文件非常大......然后我得到一个错误:

错误:

our error  TimeoutError: Navigation Timeout Exceeded: 30000ms exceeded
    at Promise.then (/project/node_modules/puppeteer/lib/NavigatorWatcher.js:74:21)
    at <anonymous> name: 'TimeoutError' 

如何忽略它或设置更高的超时时间?

这是我的脚本:

await page.goto('url'+tableCell04Val, waitUntil: 'load');

【问题讨论】:

您可以阅读文档github.com/GoogleChrome/puppeteer/blob/master/docs/… 【参考方案1】:

如果您正在加载一个沉重的页面,您可以使用timeout: 0 来禁用超时错误。

在您的page.goto 中使用它,例如:

await page.goto('url'+tableCell04Val, waitUntil: 'load', timeout: 0);

You can see the PR made to Pupeteer here which added the change, along with documentation and the unit tests that implement it.

【讨论】:

它适用于直接页面,但不适用于 oauth 重定向页面。【参考方案2】:

2019 年更新

您还可以从 V1.0.0 开始更改页面行为:

await page.setDefaultNavigationTimeout(0); 

参数是以毫秒为单位的超时时间。

参考资料: https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagesetdefaultnavigationtimeouttimeout https://pptr.dev/#?product=Puppeteer&version=v1.17.0&show=api-pagesetdefaultnavigationtimeouttimeout

【讨论】:

这是一个很好的答案,正是我想要的【参考方案3】:

在 Puppeteer 中有两种处理超时的方法:

a) page.setDefaultNavigationTimeout(timeoutInMiliseconds)

它会影响导航相关的功能:

•   page.goBack([options])
•   page.goForward([options])
•   page.goto(url[, options])
•   page.reload([options])
•   page.setContent(html[, options])
•   page.waitForNavigation([options])

b) page.setDefaultTimeout(timeoutInMiliseconds)

它会影响之前的所有导航功能以及所有等待功能:

•   page.waitFor(selectorOrFunctionOrTimeout[, options[, ...args]])
•   page.waitForFunction(pageFunction[, options[, ...args]])
•   page.waitForRequest(urlOrPredicate[, options])
•   page.waitForResponse(urlOrPredicate[, options])
•   page.waitForSelector(selector[, options])
•   page.waitForXPath(xpath[, options])

注意page.setDefaultNavigationTimeout 优先于page.setDefaultTimeout

【讨论】:

【参考方案4】:

你可以这样设置超时

await page.goto('url'+tableCell04Val, waitUntil: 'load', timeout: 10000).then(() => 
    console.log('success')
).catch((res) => 
    console.log('fails', res)
)

【讨论】:

【参考方案5】:
await page.goto('url'+tableCell04Val,   waitUntil: 'networkidle2',timeout: 0);

networkidle2 适用于进行长轮询或任何其他辅助活动的页面。

查看https://github.com/puppeteer/puppeteer/issues/1552#issuecomment-350954419

【讨论】:

【参考方案6】:

puppeteer 超时的默认值为 30 秒。要使用自定义超时,您可以使用 setDefaultNavigationTimeout 和 setDefaultTimeout 方法或选项参数中的 timeout 属性。所有情况下的等待时间都以毫秒为单位。

await page.setDefaultNavigationTimeout(60000);

例如

const page = await browser.newPage();            
await page.setDefaultNavigationTimeout(60000); //timeout 60 seconds now

传递 0 禁用超时

await page.setDefaultNavigationTimeout(0); 

【讨论】:

【参考方案7】:

我遇到了同样的错误,但没有直接使用 node.js 应用程序。我在使用安装在 Ubuntu 服务器上的 MagePack 时遇到了这个问题。

我通过增加以下文件中的超时来修复它/ur/local/lib/node_modules/magepack/node_modules/puppeteer/libTimeoutSettings.js

const DEFAULT_TIMEOUT = 30000

注意:这可能不是完美的解决方案,但它对我有用并解决了我面临的问题。

【讨论】:

真是个黑客!喜欢它 这不是一个解决方案......如果工作大于前一个,它将再次说超时 @AliYarKhan 这可能不是一个合适的解决方案,但它在我的情况下有效。

以上是关于Node.js puppeteer - 如何设置导航超时?的主要内容,如果未能解决你的问题,请参考以下文章

Node Js & Puppeteer - 如何选择包裹在 Anchor 标签内的文本

如何在 puppeteer Node.js 中将 const 添加到 await page.$eval?

Node.js:如何重启 Tor 客户端

使用Puppeteer将Node悬停在Node.js中的element和getComputedStyle上?

如何在 puppeteer Node.js 中将 const 添加到 await page.$x? xpath 中的常量

puppeteer / node.js - 进入页面,点击加载更多直到所有评论加载,将页面保存为mhtml