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

时间:2018-09-04 09:52:18

标签: javascript node.js puppeteer

我正在使用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'});

const records = await page.evaluate( () =>
{
  const page = document.createElement( 'html' );
  const page_content = document.body.textContent;

  page.innerHTML = page_content;

    return {
        'valueA' : Array.from( page.getElementsByTagName( 'valueA' ), e => e.textContent ),
        'valueB' : Array.from( page.getElementsByTagName( 'valueB' ), e => e.textContent ),
        'valueC' : Array.from( page.getElementsByTagName( 'valueC' ), e => e.textContent ),
        'valueD' : Array.from( page.getElementsByTagName( 'valueD' ), e => e.textContent )
    };
});

7 个答案:

答案 0 :(得分:11)

如果要加载大量页面,可以使用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.

答案 1 :(得分:3)

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

networkidle2对于进行长轮询或其他任何附带活动的页面非常有用。

选中https://github.com/puppeteer/puppeteer/issues/1552#issuecomment-350954419

答案 2 :(得分:2)

您可以这样设置超时时间

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

答案 3 :(得分: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

答案 4 :(得分:2)

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

a) page.setDefaultNavigationTimeout(timeoutInMiliseconds)

它会影响与Navegation相关的功能:

•   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

答案 5 :(得分:1)

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

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

const DEFAULT_TIMEOUT = 30000

答案 6 :(得分:0)

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

await page.setDefaultNavigationTimeout(60000);

例如

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

传递 0 以禁用超时

await page.setDefaultNavigationTimeout(0);