记录来自Puppeteer Node.js进程的客户端代码中的“控制台”调用

时间:2018-08-18 10:36:01

标签: javascript node.js puppeteer

在以下代码示例中,未将作为参数传递给page.evaluate()的函数内部的log语句打印到Node控制台(终端)上。不过,此功能之外的日志语句(最后)正在按预期方式打印。

另一位程序员建议page.evaluate上下文是无头浏览器环境,而不是Node.js。

 const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.setExtraHTTPHeaders({Referer: 'https://sparktoro.com/'});

    await page.goto('https://sparktoro.com/trending');
    await page.waitForSelector('div.title > a');

    const stories = await page.evaluate(() => {
        const selection = document.querySelectorAll('div.title > a');
        console.log('selection', selection);
        const links_array = Array.from(selection);
        console.log('links_array', links_array);
        const hrefs = links_array.map(anchor => anchor.href)
        console.log('hrefs', hrefs);
        return hrefs
    });

    console.log(stories);
    await browser.close();
})();

是否有任何方法可以强制所有console.log语句使用Node环境作为其上下文,还是我唯一的启用浏览器头并从浏览器控制台读取语句的选项?

1 个答案:

答案 0 :(得分:3)

  

另一位程序员建议page.evaluate上下文是无头浏览器环境,而不是Node.js。

对,这是Puppeteer的关键之一,evaluate回调中的代码是在浏览器中评估的,而不是在Node进程中评估的(尽管使用Puppeteer查看代码源一点也不明显) )。

您可以响应Page对象的console event,当使用任何console方法(logerror等)时会引发该对象。在客户端代码中调用。通过该链接:

page.on('console', msg => {
  for (let i = 0; i < msg.args().length; ++i)
    console.log(`${i}: ${msg.args()[i]}`);
});

console事件收到一个ConsoleMessage object,它告诉您调用的类型(logerror等),参数是什么({ {1}})等。