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

Puppeteer中page.evaluate内打印内容异常问题求助

问题分析与解决方法

可能原因

  • page.exposeFunction 通过IPC在浏览器和Node.js环境间传递调用,若暴露的函数未明确返回Promise,可能引发异步处理异常,导致输出异常。
  • 复杂页面环境可能干扰参数序列化,导致传递的参数不符合预期。
  • 旧版Puppeteer与Node.js v20存在兼容性问题。

解决方法

1. 确保暴露的函数返回Promise

修改page.exposeFunction的定义,显式返回Promise,避免异步处理异常:

await page.exposeFunction("logInNodeJs", async (value) => {
  console.log(value);
});

或者:

await page.exposeFunction("logInNodeJs", (value) => {
  console.log(value);
  return Promise.resolve();
});

2. 改用页面console事件监听

放弃exposeFunction,直接监听页面的console输出,这种方式更稳定:

// 在page.newPage后添加监听
page.on('console', async (msg) => {
  const args = await Promise.all(msg.args().map(arg => arg.jsonValue()));
  console.log(...args);
});

// 在page.evaluate中直接使用console.log
var el = await page.evaluate(async () => {
  console.log('test 1'); // 该日志会被Node端捕获输出
  
  var el = document.querySelector("div[class='paging']");
  pages = el.querySelectorAll('a');
  return pages.length - 1;
});

3. 升级Puppeteer到最新版本

确保使用与Node.js v20兼容的版本:

npm install puppeteer@latest

调试建议

可以先在logInNodeJs中打印参数的类型和内容,确认参数是否正确传递:

await page.exposeFunction("logInNodeJs", (value) => {
  console.log("参数类型:", typeof value);
  console.log("参数内容:", value);
});

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 17:21:00