javascript - 记录 Puppeteer Node.js 进程中客户端代码中进行的 `console` 调用

标签 javascript node.js puppeteer

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

另一位程序员建议,page.evaluate 上下文可能是 headless 浏览器环境,而不是 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 环境作为上下文,或者是我启用浏览器头并从浏览器控制台读取语句的唯一选择?

最佳答案

Another programmer suggested that maybe the page.evaluate context is the headless browser environment and not Node.js.

对,这是 Puppeteer 的关键之一,evaluate 回调中的代码是在浏览器中计算的,而不是在 Node 进程中(尽管从源代码来看这并不明显)使用 Puppeteer 编写代码)。

您可以回复console event Page 对象的,当调用任何 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()),等等

关于javascript - 记录 Puppeteer Node.js 进程中客户端代码中进行的 `console` 调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51907677/

相关文章:

javascript - google.maps.places.Autocomplete 调用模糊,导致 "Cannot read property ' 未定义的几何图形”

node.js - ZMQ 发布/订阅订阅

javascript - 如何在 NodeJs 中使用 .pfx 证书和密码验证 Bearer token ?

node.js - Puppeteer 浏览器内时间加速

Electron - 不能在工作线程中使用 puppeteer

javascript - 如何将一个新元素添加到另一个JS中

javascript - 如何为触摸和鼠标(拖动)事件制作可拖动元素

javascript - wordpress移动检测加载特定JS

javascript - Cloudflare SSL 错误 522 Express

javascript - 使用 Puppeteer、Mocha 和 Chai 断言 html 标签属性中存在文本