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

Fal*_*lko 5 javascript puppeteer

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

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

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

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

await page.evaluate((obj, function)=>{
 const thing = myfunction;
},(obj, function));
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*orf 6

不,你不能传递这样的函数。传递的数据需要通过 序列化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');
Run Code Online (Sandbox Code Playgroud)

替代方法:在里面定义函数 page.evaluate

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

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

  • @Md.AbuTaher 这个“伟大”来自这个问题,我就同意了;) (2认同)