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

如何实现Puppeteer脚本遇页面错误时自动重定向至目标URL

解决Puppeteer页面错误/连接问题时自动重试加载的方案

嘿,我清楚你的需求——当页面碰到连接失败、Chrome的"Aw Snap!"这类崩溃错误时,自动重新加载目标URL。你现在已经能在catch里打日志了,接下来咱们把重试逻辑补上,还要覆盖几种常见的错误场景:

核心实现思路

  • 封装一个带重试次数控制的导航函数,避免无限循环重试
  • 监听页面的崩溃/严重错误事件,触发时自动重新加载
  • 在page.goto()的catch块中处理加载失败的情况

完整代码示例

const puppeteer = require('puppeteer');

// 封装带重试逻辑的导航函数
async function navigateWithRetry(page, targetUrl, maxRetries = 3) {
  let retryCount = 0;
  while (retryCount < maxRetries) {
    try {
      console.log(`尝试加载页面(第 ${retryCount + 1} 次)`);
      await page.goto(targetUrl, {
        waitUntil: 'networkidle2', // 等待网络空闲,确保页面加载完成
        timeout: 30000 // 设置30秒超时,避免长时间卡住
      });
      console.log('页面加载成功!');
      return true; // 加载成功,退出循环
    } catch (error) {
      retryCount++;
      console.error(`第 ${retryCount} 次加载失败:`, error.message);
      if (retryCount >= maxRetries) {
        console.error('已达到最大重试次数,加载最终失败');
        return false;
      }
      // 重试前短暂延迟2秒,避免频繁请求
      await new Promise(resolve => setTimeout(resolve, 2000));
    }
  }
}

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();

  // 监听页面崩溃/严重错误事件(比如"Aw Snap!")
  page.on('error', async (error) => {
    console.error('页面发生崩溃或严重错误:', error.message);
    console.log('准备重新加载页面...');
    await navigateWithRetry(page, page.url()); // 重新加载当前页面
  });

  // 可选:监听页面内部的JavaScript错误,按需处理
  page.on('pageerror', (error) => {
    console.warn('页面内部出现JS错误:', error.message);
    // 如果需要,这里也可以触发重试逻辑
  });

  // 替换成你的目标URL
  const targetUrl = 'https://your-target-url.com';
  
  // 启动带重试的导航
  const loadSuccess = await navigateWithRetry(page, targetUrl);
  if (!loadSuccess) {
    // 最终加载失败时的处理,比如关闭浏览器
    await browser.close();
  }

  // 这里可以添加你后续的页面操作逻辑
  // ...

})();

关键细节说明

  1. navigateWithRetry函数:你可以通过maxRetries参数自定义最大重试次数,默认3次。每次失败后会延迟2秒再重试,避免给目标服务器造成过多请求压力。
  2. page.on('error')事件:这个事件会在页面崩溃、连接中断等严重错误时触发,比如Chrome显示"Aw Snap!"的时候,我们在这里调用重试函数重新加载页面。
  3. waitUntil与timeout:waitUntil: 'networkidle2'确保页面基本加载完成后才判定成功;timeout设置加载超时时间,防止脚本长时间卡在加载状态。
  4. 错误边界处理:当达到最大重试次数后,脚本会返回失败状态,你可以根据需求做后续处理(比如关闭浏览器)。

这样修改后,你的脚本就能在遇到页面错误或连接问题时自动尝试重新加载了。

内容的提问来源于stack exchange,提问作者putu oka warma k

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 07:08:07