2 回答

TA贡献1804条经验 获得超2个赞
这里的问题是您传递给的函数page.evaluate是在浏览器上下文内(在浏览器页面内)运行的。要将结果从浏览器上下文发送到 Node.js 环境,结果将被序列化。
请参阅文档中的返回类型page.evaluate:
返回: Promise< Serializable > Promise,它解析为的返回值pageFunction
在Serializable这里意味着你的数据将通过传递给Node.js的环境JSON.stringify,并有自动解析为您服务。但是,此过程将删除对象的任何不可序列化的属性。这就是你最终得到许多空对象的原因。
在 puppeteer 中获取元素句柄
要获取页面上元素的句柄,您需要使用page.$,它会创建一个对象(在您的 Node.js 环境中),该对象链接到浏览器上下文中的元素。这些句柄也可以传递给page.evaluate调用。要查询多个元素,您可以使用函数page.$$。
代码示例
这是一个示例,它首先查询元素,然后将元素句柄传递给评估函数以读取属性。
const elementHandle = await page.$('a');
const result = await page.evaluate(el => el.href, elementHandle);
打字稿的使用
关于 TypeScript 的问题是,在这种情况下,TypeScript 无法正确预测类型。对于 TypeScript 编译器来说,这看起来像一个普通的函数调用,而实际上,函数被发送到客户端执行。因此,在这种情况下,您必须自己转换类型,否则 Typescript 将仅假定any为参数类型:
const elementHandle = await page.$('a');
const result = await page.evaluate((el: { href: string }) => el.href, elementHandle);
添加回答
举报