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

