是否可以将函数传递给Puppeteer的page.evaluate()

时间:2019-09-21 12:18:35

标签: javascript puppeteer

我正在使用Puppeteer解析网页,但找不到针对我问题的明确答案。

我正在尝试将函数作为参数传递给page.evaluate(),虽然可以传递对象,但似乎无法传递函数。这是一个人为的例子:

const obj = {
 thing: 'thing1',
};

const myfunction = () => {
 return `great ${stuff}`;
};

await page.evaluate((obj, function)=>{
 const thing = myfunction;
},(obj, function));

是否可以将函数作为参数传递给伪造者page.evaluate()?

1 个答案:

答案 0 :(得分:1)

不,您不能传递类似的功能。传递的数据需要通过JSON.stringify进行序列化,这对于函数是不可能的。

替代方法:公开功能

要在页面内的Node.js环境中使用函数,您需要通过page.exposeFunction公开它。当调用该函数时,将在您的Node.js环境中执行

await page.exposeFunction('myfunction', text => `great ${text}`);
await page.evaluate(async (object) => {
  return await window.myfunction(object); // 'great example'
}, 'example');

替代方法:在page.evaluate

中定义函数

要在页面上下文中使用函数,可以在上下文中定义它。这样,该函数将无法访问您的Node.js变量。

await page.evaluate((obj) => {
  const myfunction = (stuff) => `great ${stuff}`;
  return myfunction(obj); // 'great example'
}, 'example');