请考虑以下代码:
let foo = await page.evaluate(
() => {
let bar = [...document.querySelectorAll(".foobar")];
return bar.map( (u) => u.textContent.trim() );
}
);
foo.forEach( (u) => { console.log(u); });
现在考虑这种变化:
let bar = await page.evaluate(
() => {
return [...document.querySelectorAll(".foobar")];
}
);
let foo = bar.map((u) => u.textContent.trim());
bar.forEach( (u) => { console.log(u); } );
我希望两者都记录相同的结果,但是实际上前者运行良好,而后者抛出
无法读取未定义的属性“地图”
有人可以解释为什么我不能从map()
中取出page.evaluate()
吗?
FWIW,page
是puppeteer
NewPage()
。
答案 0 :(得分:2)
传递给page.evaluate
的函数被序列化并通过网络发送到浏览器,然后在其中执行。这意味着返回值也必须通过网络发送,因此serialisable。元素列表不可序列化。
与mentioned in the documentation一样,如果函数的返回值不可序列化,则返回undefined。