Javascript Puppeter page.evaluate无法使用参数公开函数

Javascript Puppeter page.evaluate无法使用参数公开函数,javascript,puppeteer,Javascript,Puppeteer,正如我在文档()中所看到的,我们可以像这样向页面公开js函数 函数执行许多操作(elem){ 设rect=elem.getBoundingClientRect(); 返回矩形; } 异步函数dummy_fn1(第页){ //在此公开函数 等待page.exposeFunction(“do_many_操作”,do_many_操作); 让temp=wait page.evaluate(异步(a,b)=>{ 设elems=document.queryselectoral(“p”); //在这里使用函数

正如我在文档()中所看到的,我们可以像这样向页面公开js函数

函数执行许多操作(elem){
设rect=elem.getBoundingClientRect();
返回矩形;
}
异步函数dummy_fn1(第页){
//在此公开函数
等待page.exposeFunction(“do_many_操作”,do_many_操作);
让temp=wait page.evaluate(异步(a,b)=>{
设elems=document.queryselectoral(“p”);
//在这里使用函数
设rect=wait做许多运算(elems[0]);
}, 1, 2);
}
但是,代码中断,错误消息是

Error: Evaluation failed: TypeError: elem.getBoundingClientRect is not a function
这意味着
elem
arg to
do\u many\u operation
不是有效的元素或节点,为什么


另一个问题是,我们可以将函数注入浏览器上下文吗?这样我们就不必为创建的新页面一次又一次地注入函数。

当您调用在exposeFunction注册的函数时,会有一个序列化过程。 当您调用
时,执行许多操作(元素[0])
elems[0]
被序列化(JSON.stringify)并传递给节点中的函数。在节点端,该对象将没有
getBoundingClientRect
函数。 如果要重用代码,可以使用
evaluate
在浏览器端创建函数:

await page.evaluate(() => {
  window.do_many_operations = function(elem) {
    let rect = elem.getBoundingClientRect();
    return rect;
  }
});

顺便说一句,
addScriptTag
很好地解决了我上面的问题,但我仍然想知道推荐的方法是什么。但是在浏览器端创建函数不是我想要的,因为我有很多现有函数在做这项工作,我只想在我的新项目中重用它们,而不是在代码中再次复制和定义它们。因此,您将无法将元素传递给这些函数。