首页 > 解决方案 > Puppeteer 有时会抛出“UnhandledPromiseRejectionWarning: TimeoutError: Navigation Timeout Exceeded”

问题描述

我正在使用 Puppeteer 测试 Headless Chrome,所以我正在阅读文档并运行此代码*:

const puppeteer = require('puppeteer');

(async() => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://www.github.com', {waitUntil: 'networkidle2'});
    await page.screenshot({ path: 'screenshot.png' });

    await browser.close();
})();

(*来自Docs-Usage 的片段)。

我更改了“example.com”,因为可以正常工作并尝试与其他站点一起使用,但是使用“github.com”脚本会在该行中返回超时异常await page.goto()

(node:7840) UnhandledPromiseRejectionWarning: TimeoutError: Navigation Timeout Exceeded: 30000ms exceeded
    at Promise.then (C:\_test\headless\node_modules\puppeteer\lib\LifecycleWatcher.js:142:21)
    at <anonymous>
  -- ASYNC --
    at Frame.<anonymous> (C:\_test\headless\node_modules\puppeteer\lib\helper.js:111:15)
    at Page.goto (C:\_test\headless\node_modules\puppeteer\lib\Page.js:629:49)
    at Page.<anonymous> (C:\_test\headless\node_modules\puppeteer\lib\helper.js:112:23)
    at C:\_test\headless\index.js:7:16
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
(node:7840) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:7840) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

如果我使用常规浏览器访问 github.com,则可以正常连接,因此我的互联网连接不是问题。

我添加了下一行,两分钟后代码运行良好:

page.setDefaultNavigationTimeout(0);

但是如果我设置puppeteer.launch({headless:false})代码在几秒钟内运行完美

我正在运行我的测试:

标签: javascriptnode.jspuppeteer

解决方案


我遇到了同样的问题,但通过更换解决了

{waitUntil: 'networkidle2'}

和:

  {waitUntil: 'domcontentloaded'}

更多信息在这里:

[ https://github.com/puppeteer/puppeteer/issues/2482][1]

只是为了添加更多信息,一些网站有很多内容,因此页面可能没有在默认的 30 秒超时内加载。所以取消这个,你可以通过这样做完全消除超时:

 await page.setDefaultNavigationTimeout(0)

所以这看起来像这样:

const puppeteer = require('puppeteer');

(async () => {

const browser = await puppeteer.launch({ headless: false });
const page = await browser.newPage();
await page.setDefaultNavigationTimeout(0);
await page.goto('https://www.example.com/', {
waitUntil: 'networkidle2'
});
  ...

推荐阅读