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

如何在Puppeteer中用async/await等待页面加载后读取内容?

解决Puppeteer跟踪PHP分段任务获取不到'Done'文本的问题

我明白你的困扰——测试环境里只做重定向的场景能正常跑,但实际处理数据的页面就拿不到body文本,element和text全是undefined。核心问题出在你只执行了一次page.goto,然后立刻去取文本,但实际场景中PHP脚本会多次重定向,第一次goto后页面还在跳转到下一个任务片段,根本没到最终的'Done'页面。

给你两个靠谱的解决方案,适配长时间运行的分段任务:

方案一:用waitForFunction等待目标文本出现

这个方法最直接,持续检查页面body的文本内容,直到它等于'Done',不管中间有多少次重定向都能跟踪到最终结果:

const puppeteer = require('puppeteer');
(async () => {
  const browser = await puppeteer.launch({args:['--no-sandbox']});
  const page = await browser.newPage();

  // 可选:监听导航事件,方便调试重定向流程
  page.on('framenavigated', (frame) => {
    console.log(`当前导航到: ${frame.url()}`);
  });

  try {
    // 初始访问任务入口,禁用超时(适配长时间任务)
    await page.goto('https://example.com/Test/', {
      waitUntil: 'networkidle2',
      timeout: 0 
    });

    // 等待body文本严格等于'Done',无限等待直到条件满足
    await page.waitForFunction(
      () => document.body && document.body.textContent.trim() === 'Done',
      { timeout: 0 }
    );

    console.log('任务执行完成,已获取到"Done"');
  } catch (error) {
    console.error('等待过程中出现错误:', error);
  } finally {
    await browser.close();
  }
})();

方案二:循环等待导航直到最终页面

如果你的PHP重定向是通过header('Location: ...')实现的,也可以用waitForNavigation循环等待,直到页面不再跳转且出现目标文本:

const puppeteer = require('puppeteer');
(async () => {
  const browser = await puppeteer.launch({args:['--no-sandbox']});
  const page = await browser.newPage();
  let isDone = false;

  await page.goto('https://example.com/Test/', {waitUntil: 'networkidle2', timeout: 0});

  while (!isDone) {
    try {
      // 等待下一次导航完成
      await page.waitForNavigation({waitUntil: 'networkidle2', timeout: 0});
      // 检查当前页面是否是Done页面
      const text = await page.evaluate(() => document.body?.textContent.trim());
      isDone = text === 'Done';
    } catch (e) {
      // 如果没有更多导航,直接检查当前页面
      const text = await page.evaluate(() => document.body?.textContent.trim());
      isDone = text === 'Done';
      break;
    }
  }

  console.log('任务完成');
  await browser.close();
})();

关键注意点

  1. 禁用超时:因为你的任务是长时间运行的,一定要设置timeout: 0,避免Puppeteer中途因超时抛出错误。
  2. 等待页面稳定:用networkidle2确保页面资源加载完成后再检查内容,避免因页面未加载完全导致获取不到元素。
  3. 调试辅助:添加framenavigated事件监听,可以清晰看到每次重定向的URL,帮你排查任务流程是否正常。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 07:07:48