无法读取 page.evaluate() 之外未定义的 属性 'map'
Cannot read property 'map' of undefined outside page.evaluate()
考虑以下代码:
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); } );
我希望两者都记录相同的结果,但实际上前者运行良好,后者抛出
Cannot read property 'map' of undefined
有人可以解释为什么我不能从 page.evaluate()
中取出 map()
吗?
FWIW,page
是 puppeteer
NewPage()
。
传递给 page.evaluate
的函数被序列化并通过网络发送到浏览器,然后在浏览器中执行。这意味着 return 值也必须通过网络发送,因此 serialisable。元素列表不可序列化。
与 mentioned in the documentation 一样,如果函数的 return 值不可序列化,则改为 returned 未定义。
考虑以下代码:
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); } );
我希望两者都记录相同的结果,但实际上前者运行良好,后者抛出
Cannot read property 'map' of undefined
有人可以解释为什么我不能从 page.evaluate()
中取出 map()
吗?
FWIW,page
是 puppeteer
NewPage()
。
传递给 page.evaluate
的函数被序列化并通过网络发送到浏览器,然后在浏览器中执行。这意味着 return 值也必须通过网络发送,因此 serialisable。元素列表不可序列化。
与 mentioned in the documentation 一样,如果函数的 return 值不可序列化,则改为 returned 未定义。