将一个thunk传递给puppeteer的$ .eval

时间:2018-06-02 14:18:33

标签: javascript node.js puppeteer google-chrome-headless

函数setValue接收一个值并返回一个函数。在第二个函数中,我正在尝试控制日志value的值,但我得到了

Error: Evaluation failed: ReferenceError: value is not defined

我的代码吼叫。它可以在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();
})();

1 个答案:

答案 0 :(得分:4)

这是在Node.js中执行的任何库都常见的问题,并在浏览器中评估代码(Protractor,TestCafe,Nightmare等)。函数被字符串化并作为字符串传递给浏览器。 (input) => { console.log(value) }的原始范围丢失,value应该是全局的,未定义。

the documentation所述,其他参数应该传递给$eval

应该是:

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

console.log可以正常工作但显然不会在Node控制台中显示任何内容,因为它引用了浏览器控制台。