【问题标题】:Close Browser after Navigation Timeout导航超时后关闭浏览器
【发布时间】:2019-08-14 22:46:11
【问题描述】:

我用nodejs + puppeteer制作了下面的这段代码,其目标是截取用户站点的屏幕截图:

const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('http://MY_WEBSITE/try/slowURL',{timeout: 30000, waitUntil: 'networkidle0' });//timeout 30 seconds
await page.setViewport({width: 1920, height: 1080});
await page.screenshot({path: pathUpload});
await browser.close();

它的操作非常简单,但为了测试超时,我创建了一个页面 (http://MY_WEBSITE/try/slowURL),需要 200 秒才能加载。

根据 puppeteer 超时 (timeout: 30000),有 100% 的可能性发生 Navigation Timeout Exceeded: 30000ms exceeded 错误,尤其是因为我在强制它。

问题

通过htop命令(在linux中使用),即使在系统崩溃并显示“TimeoutError”之后,我也可以看到浏览器并没有关闭。

如果浏览器没有关闭,当扫描完成时,服务器很有可能会耗尽内存,我不希望这样。

我该如何解决这个问题?

【问题讨论】:

    标签: node.js puppeteer


    【解决方案1】:

    您希望将代码包装到 try..catch..finally 语句中以处理错误并关闭浏览器。

    代码示例

    const browser = await puppeteer.launch();
    try {
        const page = await browser.newPage();
        await page.goto(/* ... */);
        // more code which might throw...
    } catch (err) {
        console.error('error', err.message);
    } finally {
        await browser.close();
    }
    

    您的主要代码在 try 块内执行。 catch 块显示可能发生的任何类型的错误。 finally 部分是脚本中始终执行的部分,不仅在抛出错误时。这样,无论是否发生错误,您的脚本都会调用browser.close 函数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-04-09
      • 1970-01-01
      • 2020-12-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多