Node.js / Puppeteer-导航超时错误

时间:2018-11-05 13:59:04

标签: javascript node.js puppeteer

出现这样的错误后,我可以恢复连接吗?

UnhandledPromiseRejectionWarning:    
TimeoutError: Navigation Timeout    
Exceeded: 1000ms exceeded

示例:

 let arg = [] //array with urls
 await page.goto(...args, {waitUntil: 'load', timeout: 1000 }); 

还是唯一的出路就是设置超时?

3 个答案:

答案 0 :(得分:0)

我相信您的问题来自您为goto的{​​{1}}方法提供的参数:

https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagegotourl-options

调用puppeteer时,它期望的是goto的URL,而不是string

答案 1 :(得分:0)

要回答原始问题:

否,page.goto()函数超时后,您将无法恢复连接。您只能处理异常,甚至可以重试。

另一方面,如果您要完成的任务是加载页面,

我建议对您的代码进行两项更改:

第一

page.goto()不接受ArrayObject作为第一个参数,它必须是一个单数字符串,例如:

page.goto('https://www.google.com')

See docs

第二:

除非您要加载的页面非常简单,否则timeout(1000毫秒)太低了。 Puppeteer的默认值为30000 ms,所以我建议您使用它或将超时设置为至少5000 ms:

page.goto('https://www.google.com', { timeout: 5000 })

由于这是默认值,因此也无需使用{ waitUntil: 'load' }

希望这会有所帮助。

答案 2 :(得分:0)

如果您要向args数组中的所有URL发出请求,而不会失败,如果一个失败了,则不会循环。

这是解决方法:

const async = require('async'); // npm i --save async

const urls = [... array of urls ...]; 
const execution = {
  total: urls.length,
  success: 0,
  failed: 0,
  results: []
};

async.eachLimit(
  urls, 
  10, 
  async (url, done) => {
    try {
      const data = await page.goto(url, {waitUntil: 'load', timeout: 1000});
      execution.success++;
      execution.results.push({url, data});
    }
    catch (error) {
      execution.failed++;
      execution.results.push({url, data: null, error: error.message});
    }
    finally {
      done();
    }
  },
  (errors) => {
    console.log('Finished:', execution);
  });