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

Puppeteer无法捕获失败请求与JS错误的问题求助

解决Puppeteer无法捕获失败请求与未处理Promise错误的问题

我来帮你梳理代码里的问题,以及如何修复来捕获到你提到的404请求和JS错误:

你的代码存在的几个关键问题:

  1. 重复监听requestfailed事件:你连续两次调用page.on('requestfailed'),这不仅没必要,还可能导致事件处理逻辑混乱,而且事件监听不需要用await修饰。
  2. page.goto缺少足够的等待条件:默认的page.goto只会等待页面初始HTML加载完成,但目标站点的那个请求可能是页面加载后才发起的异步请求,所以需要设置waitUntil选项确保网络请求稳定后再结束等待。
  3. 未监听未处理的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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 06:48:21