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

Puppeteer遍历页面后无法关闭浏览器,出现TimeoutError问题排查

问题分析与解决

你的代码问题出在循环逻辑的顺序和判断时机上,具体来说:

  • 先等待下一页按钮再判断是否是最后一页:当走到最后一页时,页面上根本没有.pager .next a这个元素,page.waitForSelector会一直等待直到超时,直接抛出错误。
  • 判断完是最后一页仍执行点击操作:哪怕你判断出isLastPage为true,代码还是会执行await page.click(".pager .next a"),这时候元素不存在,一样会报错。

修正后的代码

const puppeteer = require("puppeteer");

(async () => {
  const browser = await puppeteer.launch({ headless: false });
  const page = await browser.newPage();
  await page.goto("http://books.toscrape.com/");

  let hasNextPage = true;

  while (hasNextPage) {
    // 先检查是否存在下一页按钮,不等待直接返回结果
    const nextButton = await page.$(".pager .next a");
    if (nextButton) {
      await nextButton.click();
      // 等待页面加载完成,可根据实际情况调整等待方式
      await page.waitForNavigation({ waitUntil: "networkidle2" });
    } else {
      // 没有下一页按钮,终止循环
      hasNextPage = false;
    }
  }

  console.log("done");
  await browser.close();
})();

关键调整点

  • 用page.$检查下一页按钮是否存在,这个方法不会等待,找不到元素直接返回null,避免超时问题。
  • 只有当按钮存在时才执行点击操作,同时加上page.waitForNavigation确保页面加载完成后再进入下一次循环,避免操作时机过早。
  • 用hasNextPage控制循环,逻辑更直观,当没有下一页按钮时直接设为false跳出循环。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 12:30:57