【问题标题】:How to define variables in a callback without parameters如何在没有参数的回调中定义变量
【发布时间】:2021-06-29 23:08:01
【问题描述】:

在 Puppeteer 的 evaluate 函数中,我可以访问似乎是预定义的变量,但仅限于函数范围内:

// Excerpt
page.evaluate(() => {
  alert("Hello world!!");
});

也没有任何参数传递给函数...

如果它不在evaluate 函数内,我就无法访问所有变量。更有趣的是evaluate里面的代码和外面的代码没有任何关系。

// Excerpt
page.evaluate(() => {
  console.log("Hello world!!");
});

以上代码不会在 Node.js 控制台中打印,而是在 Chromium 浏览器中打印。

这是如何工作的,我该如何做?

【问题讨论】:

  • 是的,回调被序列化并在浏览器上下文中执行。只需在回调中定义变量,就好像您在浏览器控制台中定义了它们一样。如果您想从 Node 中的控制台访问日志,请参阅How do print the console output of the page in puppeter as it would appear in the browser?。如果您想从 Node 向回调传递数据,请参阅How can I pass variable into an evaluate function?。您从回调返回的任何内容都必须是可序列化的。
  • @ggorlen 不,我没有问题。我已经知道该怎么做了。我在问 Puppeteer 如何为没有任何参数的回调定义变量...
  • 你的意思是什么变量? alertconsole.log 附加到浏览器的 window 对象。如果您确实将数据参数传递给回调,Puppeteer 只需在它们上调用一个花哨版本的JSON.stringify,然后一旦它在浏览器上下文中反序列化该函数,它就会在每个参数上调用一个花哨的JSON.parse,并使用项目调用您的回调.见the source

标签: javascript node.js puppeteer predefined-variables


【解决方案1】:

Puppeteer 使用 Function 构造函数和 Function#toString 包装您的函数,然后在自定义上下文中对其进行评估,如下所示:

let functionText = evaluateFunc.toString();

let newFunc = new Function(`
function alert() {...}

(${functionText})
`);

newFunc();

因此无法访问函数外的变量、函数等。

如果您想在 evaluate 函数中传递参数,请参阅 How can I pass variable into an evaluate function?

【讨论】:

    猜你喜欢
    • 2020-01-01
    • 2011-03-20
    • 1970-01-01
    • 2021-06-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 2020-04-27
    • 2011-12-17
    相关资源
    最近更新 更多