能否将一个函数传递给Puppeteer的page.evaluate()方法?

7

我正在使用 Puppeteer 解析一个网页,但找不到确切的答案来回答我的问题。

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

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

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

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

在Puppeteer的page.evaluate()中,是否可以将函数作为参数传递?

1个回答

13

不,你不能这样传递函数。传递的数据需要通过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');

1
嘿!我刚试图暴露这个函数,但现在出现了"Uncaught (in promise) Error: this._pageBindings.get(...) is not a function", source: (2)的错误。 - Falko
1
“great example” 哈哈,我以为那是答案的一部分。就像“是的,这个答案是一个很好的例子”。 - Md. Abu Taher
2
@Md.AbuTaher “Great”这个词是从问题中来的,我只是顺着使用了它 ;) - Thomas Dondorf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接