将重击传递给伪造者的$ .eval

And*_*ano 2 javascript node.js google-chrome-headless puppeteer

该函数setValue接收一个值并返回一个函数。在第二个函数中,我尝试控制台记录log的值,value但是我得到了

Error: Evaluation failed: ReferenceError: value is not defined
Run Code Online (Sandbox Code Playgroud)

我的代码如下。可以在try-puppeteer上对其进行测试,只需复制并粘贴我的代码并删除该require语句即可。

const puppeteer = require('puppeteer');

(async () => {
  const USERNAME = 'helloworld';
  const setValue = (value) => (input) => { console.log(value) };

  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  await page.goto('http://example.com');
  await page.$eval('.selector', setValue(USERNAME));

  await browser.close();
})();
Run Code Online (Sandbox Code Playgroud)

Est*_*ask 5

对于在Node.js中执行并在浏览器中评估代码(量角器,TestCafe,噩梦等)的任何库,这都是一个常见的问题。函数被字符串化并作为字符串传递给浏览器。的原始范围(input) => { console.log(value) }已丢失,并且value可能是未定义的全局范围。

文档所述,应该将其他参数传递给$eval

它应该是:

await page.$eval('.selector', (el, value) => { console.log(value) }, USERNAME);
Run Code Online (Sandbox Code Playgroud)

console.log 可以使用,但显然不会在Node控制台中显示任何内容,因为它是指浏览器控制台。