You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Puppeteer无法截图:已尝试异步函数、try-catch等方案仍未解决求助

解决Puppeteer截图时的Unhandled Promise Rejection错误

之前我在使用Puppeteer截取网页截图时,碰到了一大堆*Unhandled Promise Rejection(未处理的Promise拒绝)*错误,折腾了好一阵子才搞定。我翻了不少技术论坛和主题,试了各种方案——从改用async/await函数到添加try-catch块,终于优化出了一个稳定的版本,分享给大家:

const puppeteer = require('puppeteer');

async function getPic() {
  let browser;
  try {
    // 启动浏览器,调试时可以打开headless模式(去掉注释即可)
    browser = await puppeteer.launch(/*{headless: false}*/);
    const page = await browser.newPage();
    
    // 配置页面视口,按需调整尺寸
    await page.setViewport({ width: 1280, height: 720 });
    
    // 跳转到目标页面,等待网络空闲后再继续
    await page.goto('https://example.com', { waitUntil: 'networkidle2' });
    
    // 执行截图,可选fullPage参数截取整页
    await page.screenshot({ path: 'page-screenshot.png', fullPage: true });
    
    console.log('截图成功!已保存为page-screenshot.png');
  } catch (error) {
    // 捕获并输出所有可能的错误,方便排查
    console.error('截图过程出错:', error);
  } finally {
    // 确保浏览器实例无论成功失败都会关闭,避免资源泄漏
    if (browser) {
      await browser.close();
    }
  }
}

// 调用截图函数
getPic();

核心优化点说明:

  • try-catch-finally全流程包裹:既能捕获所有异步操作的Promise rejection错误,又能保证浏览器资源在任何情况下都能被正确释放,避免内存泄漏。
  • 提前声明browser变量:把变量放在try块外部,确保finally块能访问到它,防止因浏览器初始化失败导致无法关闭实例。
  • 明确页面加载等待条件:page.goto里指定networkidle2,确保页面基本加载完成后再执行截图,避免因页面未就绪引发的错误。
  • 保留调试开关:注释掉的{headless: false}可以在调试时打开,直观看到浏览器内的页面状态,方便排查问题。

之前踩的坑大多是没妥善处理异步错误,也没做好资源回收。用这个结构之后,基本就不会再出现未处理的Promise拒绝错误了。

内容的提问来源于stack exchange,提问作者user1584421

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:02:11