【问题标题】:Node.js puppeteer - How to set navigation timeout?Node.js puppeteer - 如何设置导航超时?
【发布时间】: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'});

【问题讨论】:

标签: javascript node.js puppeteer


【解决方案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 这可能不是一个合适的解决方案,但它在我的情况下有效。
          猜你喜欢
          • 2023-03-04
          • 2011-05-06
          • 1970-01-01
          • 2018-11-28
          • 1970-01-01
          • 2014-07-01
          • 1970-01-01
          • 2011-09-02
          • 2022-12-29
          相关资源
          最近更新 更多