Javascript 木偶师日志在page.evaluate内

Javascript 木偶师日志在page.evaluate内,javascript,node.js,puppeteer,Javascript,Node.js,Puppeteer,如何在page.evaluate中进行console.log操作,将其传递给node,并在评估页面时使用它 我实际上想记录页面的进度。请在控制台上进行评估,并向用户显示一些结果 在此代码示例中实现notifyUi功能: const page = await browser.newPage(); page.on('console', (...args) => { this.notifyUi('[chrome] ' + args[0]); }); await page.goto(url

如何在page.evaluate中进行console.log操作,将其传递给node,并在评估页面时使用它


我实际上想记录页面的进度。请在控制台上进行评估,并向用户显示一些结果

在此代码示例中实现
notifyUi
功能:

const page = await browser.newPage();
page.on('console', (...args) => {
    this.notifyUi('[chrome] ' + args[0]);
});
await page.goto(url);
const result = await page.evaluate(() => {
    console.log('I am alive');
    return Promise.resolve(true);
});
this.notifyUi('Evaluation returned with ' + result);

**更新为与Puppeter v1.4.x一起使用

如果您想要的只是“将页面的进度记录到控制台上。评估”,那么只需

const page = await browser.newPage();

page.on('console', consoleObj => console.log(consoleObj.text()));
并使用
控制台。在
页面中记录
。像往常一样评估
,不需要更多依赖项

另请参阅从日志中删除多个恼人的警告。

我喜欢@的答案,但当您可能只需要文本时,您将记录整个ConsoleMessage对象。因此,我个人使用以下方法:

const EOL = require('os').EOL;
const _page = await browser.newPage();

_page.on('console', _fCleanLog);

function _fCleanLog(ConsoleMessage) {
    console.log(ConsoleMessage.text + EOL);
}

让它完全按照您的预期工作的最简单方法

const page = await browser.newPage();
page.on('console', (log) => console[log._type](log._text));

以前提供的许多答案今天不再适用。还有一件事在某些页面上可能非常恼人,那就是“警告”消息污染了输出。解决此问题的一种方法是筛选消息的类型。以下代码有助于降低噪音,并适用于当前版本的木偶演员:

const browser = await puppeteer.launch();
const page = await browser.newPage();
page.on('console', consoleMessageObject => function (consoleMessageObject) {
    if (consoleMessageObject._type !== 'warning') {
        console.debug(consoleMessageObject._text)
    }
});

await page.goto('https://google.com');
const result = await page.evaluate(() => {
    console.log('Browser scope.');
    return 'Normal scope.';
});
console.log(result)
const page=wait browser.newPage();
第页(“控制台”,msg=>{
for(设i=0;i

如果以上都不起作用,试试这个。没有显示错误日志,只显示我创建的日志。

更新版本1.15.x及以上版本-2020年1月

在最新版本中,args已替换为_args

因此,当您使用
page.evaluate()
page.evaluateHandle()
并希望将
console.log()
文本从浏览器上下文返回到节点时,请使用以下代码并确保在任何
console.log()调用之前设置侦听器:

代码:

    // First we register our listener.
    page.on('console', msg => {
    for (let i = 0; i < msg._args.length; ++i)
        console.log(`${i}: ${msg._args[i]}`);
    });

    // Then we call the log.
    page.evaluate(() => console.log('Hello World'));
//首先我们注册我们的侦听器。
第页('console',msg=>{
for(设i=0;iconsole.log('helloworld'));
说明:

您无法在节点控制台中看到
console.log()
文本,也无法在
page.evaluate()或
page.evaluateHandle()中设置节点断点,因为这些函数中的代码仅在浏览器上下文中运行。如果您要在无头模式下启动Puppeter,您将在浏览器中看到
console.log()
消息

旁注:


在大多数情况下,您实际上不需要登录到浏览器上下文中,您可以在浏览器“开发人员工具”部分的“控制台”选项卡中执行相同的工作。

如果我的解决方案对将来的任何人都有帮助,我将尝试与大家分享

  • 将所有控制台输出打印到标准输出,包括警告、错误、日志:

    page = await browser.newPage();
    page.on("console", (consoleObj) => console.log(consoleObj.text()));
    
  • 打印除警告以外的所有内容:

    page.on('console', consoleObj => {
        if (consoleObj.type() !== 'warning') {
            console.log(consoleObj.text());
        }
    })
    
  • 仅打印日志(例如:
    console.logs

  • 最后一个帮助我更有效地调试

    我与未来的读者分享,他们更想知道如何获得评估的返回值

    const element = await page.$("a selector");
    const text = await page.evaluate(element => element.textContent);
    

    2021年的今天,木偶演员8.x.x的主要答案并没有向我们展示控制台对象的完整描述。例如,您无法获取所有错误堆栈跟踪文本,message.text()只包含一些关于js错误的信息


    在这里的另一条评论中,我建议使用consoleObj.text()而不是“text”,因为“text”表示使用私有variable@Colin嗨,你知道除了.text()还有其他属性吗?如果我想得到一个打印到控制台的arraybuffer呢?当你说“用户”时,你是指木偶演员/节点上下文还是浏览器上下文?如果您指的是木偶演员/节点,请参阅,了解如何将对象打印到控制台。
    page.on('console', consoleObj => {
        if (consoleObj.type() !== 'warning') {
            console.log(consoleObj.text());
        }
    })
    
    page.on('console', consoleObj => {
        if (consoleObj.type() === 'log') {
            console.log(consoleObj.text());
        }
    })
    
    const element = await page.$("a selector");
    const text = await page.evaluate(element => element.textContent);
    
    await page.evaluate(()=>{
          var string = 'I want to print this';
          return string;
    }).then(console.log);