【问题标题】:Log `console` calls made in client-side code from the Puppeteer Node.js process记录来自 Puppeteer Node.js 进程的客户端代码中的“控制台”调用
【发布时间】:2019-01-25 05:19:21
【问题描述】:

在以下代码示例中,作为参数传递给page.evaluate() 的函数内部的日志语句不会打印到节点控制台(终端)。此函数之外的日志语句(最后)正在按预期打印。

另一位程序员建议,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 环境作为它们的上下文,还是我唯一的选择是启用浏览器头并从浏览器控制台读取语句?

【问题讨论】:

    标签: javascript node.js puppeteer


    【解决方案1】:

    另一位程序员建议 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 等)、参数是什么(args())等。

    【讨论】:

    • 要记住一点,由于参数需要通过 HTTP 从浏览器传输到 Node,Puppeteer 需要序列化它们,而我上次检查它未能序列化递归对象,例如window,因此最好在浏览器中自定义实现console.log,类似于util.inspect,将所有参数字符串化,然后调用本机console.log
    • @AlexeyLebedev - 哦,好玩。感谢您举报。
    • 如果您有兴趣获取记录对象的 JSON 数据,请参阅 this thread
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-12
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 2020-01-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多