Puppeteer无法捕获失败请求与JS错误的问题求助
解决Puppeteer无法捕获失败请求与未处理Promise错误的问题
我来帮你梳理代码里的问题,以及如何修复来捕获到你提到的404请求和JS错误:
你的代码存在的几个关键问题:
- 重复监听
requestfailed事件:你连续两次调用page.on('requestfailed'),这不仅没必要,还可能导致事件处理逻辑混乱,而且事件监听不需要用await修饰。 page.goto缺少足够的等待条件:默认的page.goto只会等待页面初始HTML加载完成,但目标站点的那个请求可能是页面加载后才发起的异步请求,所以需要设置waitUntil选项确保网络请求稳定后再结束等待。- 未监听未处理的Promise拒绝事件:你遇到的
Uncaught (in promise) Fetch did not succeed属于未处理的Promise拒绝,pageerror事件主要捕获同步的JS错误,需要额外监听unhandledrejection事件才能捕获这类异步错误。
修正后的完整代码:
const puppeteer = require('puppeteer'); function wait(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } const run = async () => { const browser = await puppeteer.launch({ headless: false, args: ['--start-fullscreen'] }); const page = await browser.newPage(); // 捕获页面同步JS错误 page.on('pageerror', pageErr => { console.log('页面同步错误:', pageErr); }); // 捕获未处理的Promise拒绝(就是你遇到的那个错误) page.on('unhandledrejection', rejection => { console.log('未处理的Promise拒绝:', rejection.reason); }); // 捕获失败的请求 page.on('requestfailed', failedReq => { console.log('请求失败:', failedReq.url(), '状态码:', failedReq.response()?.status()); }); // 可选:监听所有响应,方便排查请求状态 page.on('response', response => { const url = response.url(); const status = response.status(); if (status >= 400) { console.log('异常响应:', url, '状态码:', status); } }); await page.setViewport({ width: 1920, height: 1080 }); // 设置waitUntil确保页面所有异步请求完成后再继续 await page.goto('https://nitzani1.wixsite.com/marketing-automation/3rd-page', { waitUntil: 'networkidle0', // 等待网络空闲(没有新请求持续500ms) timeout: 60000 // 延长超时时间,避免页面加载慢导致超时 }); // 额外等待几秒,确保所有异步请求都有机会发起 await wait(3000); // 记得关闭浏览器,否则会残留进程 // await browser.close(); }; run().catch(err => console.log('运行错误:', err));
关键修改点说明:
- 移除了重复的
requestfailed监听,并且去掉了不必要的await(事件监听是同步注册的,不需要等待)。 - 添加了
unhandledrejection事件监听,专门捕获Promise未处理的拒绝错误,这正是你提到的Fetch did not succeed错误的来源。 - 给
page.goto设置了waitUntil: 'networkidle0',确保页面所有网络请求完成后再结束等待,避免漏掉后续发起的异步请求。 - 增加了超时时间
timeout: 60000,防止页面加载过慢导致提前终止。 - 给
requestfailed的处理逻辑补充了打印请求URL和状态码,方便你确认是不是目标的api.fixer.io请求。 - 在代码末尾添加了
catch捕获run函数的全局错误,避免未处理的Promise拒绝导致进程崩溃。
这样修改后,你应该能成功捕获到目标的404请求和对应的JS错误了。
内容的提问来源于stack exchange,提问作者Captain_Meow_Meow
相关产品推荐
相关产品推荐

