【发布时间】:2018-08-27 19:37:02
【问题描述】:
我知道这是一个菜鸟问题,但我想知道什么时候应该使用 page.evaluate
我也知道文档存在,但还是不明白
谁能给我解释一下在使用 puppeteer 创建刮板时如何以及何时使用此功能?
【问题讨论】:
我知道这是一个菜鸟问题,但我想知道什么时候应该使用 page.evaluate
我也知道文档存在,但还是不明白
谁能给我解释一下在使用 puppeteer 创建刮板时如何以及何时使用此功能?
【问题讨论】:
首先,重要的是要了解有两种主要环境:
当您试图通过传递函数并返回 <Promise<Serializable>> 来直接在页面 DOM 环境中与页面交互时,您应该使用 page.evaluate(),它解析为传递函数的返回值。
否则,如果您不使用page.evaluate(),您将在Node.js(Puppeteer)环境中将元素作为ElementHandle 对象处理。
示例用法:
const example = await page.evaluate(() => {
const elements = document.getElementsByClassName('example');
const result = [];
document.title = 'New Title';
for (let i = 0; i < elements.length; i++) {
result.push(elements[i].textContent);
}
return JSON.stringify(result);
});
请看下面的简图:
【讨论】:
page.evaluate 的函数在 Page DOM 环境中进行评估,基本上就像您打开了开发人员工具控制台并从那里运行代码一样。在那里,document 可用 - 但如果你试图到达外面并使用 Puppeteer 脚本其余部分中的其他东西,它就不会在那里。