Javascript 无法读取属性';地图';未定义的外部页的值。evaluate()

Javascript 无法读取属性';地图';未定义的外部页的值。evaluate(),javascript,node.js,undefined,puppeteer,Javascript,Node.js,Undefined,Puppeteer,考虑以下代码: let foo = await page.evaluate( () => { let bar = [...document.querySelectorAll(".foobar")]; return bar.map( (u) => u.textContent.trim() ); } ); foo.forEach( (u) => { console.log(u); }); 现在考虑这个变化:< /P> let bar = await pag

考虑以下代码:

let foo = await page.evaluate(
  () => {
    let bar = [...document.querySelectorAll(".foobar")];
    return bar.map( (u) => u.textContent.trim() );
  }
);
foo.forEach( (u) => { console.log(u); });

现在考虑这个变化:< /P>

let bar = await page.evaluate(
  () => {
    return [...document.querySelectorAll(".foobar")];
  }
);
let foo = bar.map((u) => u.textContent.trim());
bar.forEach( (u) => { console.log(u); } );
我希望两者都记录相同的结果,但实际上前者运行良好,后者抛出错误

无法读取未定义的属性“map”

有人能解释一下为什么我不能把
map()
page.evaluate()中取出吗


FWIW,
page
是一个
puppeter
NewPage()
传递到
页面的函数。evaluate
被序列化并通过网络发送到浏览器,然后在那里执行。这意味着返回值也必须通过网络发送,因此。元素列表不可序列化


同样,如果函数的返回值不可序列化,则返回undefined。

第二个问题:您真的可以将DOM元素从页面上下文传递到Puppeter中测试代码的上下文吗?(对不起,我不太了解这个工具。)这是两个代码块的一个很大区别,第一个代码块只是在上下文之间传递字符串。@t.J.Crowder这确实是一个打字错误,经过编辑。很好。始终最好使用“复制和粘贴”。:-)啊,当时是对的。它实际上只能交换可以是JSON的东西。stringify
d?是的,它在
evaluate
:“DevTools协议还支持传输一些JSON无法序列化的附加值:-0、NaN、Infinity、-Infinity和bigint文本。”不是特别清楚,但是…@CameronMartin抱歉,英语不是我的母语,我甚至没有想到可能会有一个不同的英国/美国公约。所有(和)文档似乎都使用了“z”,因此我认为这是一个打字错误(实际上我认为这是一个计算新词)。@Skippipel Grandgourou在开始时提到,它使用与浏览器通信。这是。消息是否确实通过网络发送实际上无关紧要,尽管通常情况下是这样-关键是使用此协议时,所有消息都必须可序列化。@此外,如果您想知道序列化函数(返回函数的源代码)意味着什么,请跳过此步骤。