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?
使用Puppeteer将Node悬停在Node.js中的element和getComputedStyle上?
如何在 puppeteer Node.js 中将 const 添加到 await page.$x? xpath 中的常量