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

