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
相关产品推荐
相关产品推荐

