Puppeteer登录页面。评估

时间:2017-09-13 13:11:07

标签: javascript node.js puppeteer

我怎样才能在page.elogate中调试一些内容,将其传递给节点并在>评估页面时使用

我实际上想将page.evaluate的进度记录到控制台并向用户显示一些结果。

12 个答案:

答案 0 :(得分:35)

**已更新,可与puppeteer v1.4.x一起使用

如果您想要的是"将页面的进度记录到控制台",那么只需

const page = await browser.newPage();

page.on('console', consoleObj => console.log(consoleObj.text()));

像往常一样在console.log中使用page.evaluate,不再需要依赖项。

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

答案 1 :(得分:6)

让它完全像你期望的那样工作的最简单方法

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

答案 2 :(得分:5)

以前提供的很多答案今天不再适用。另外一件在某些页面上非常烦人的事情是"警告"污染输出的消息。解决此问题的一种方法是过滤消息类型。以下代码有助于降低噪音并适用于当前版本的Puppeteer:

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)

答案 3 :(得分:2)

在此代码示例中实现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);

答案 4 :(得分:2)

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

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

_page.on('console', _fCleanLog);

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

答案 5 :(得分:1)

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

如果以上方法均无效,请尝试使用此方法。不显示错误日志,仅显示我创建的日志。

答案 6 :(得分:1)

更新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.log()文本,也无法在page.evaluate()page.evaluateHandle()内设置节点断点,因为这些函数中的代码仅在浏览器上下文中运行。如果您以无头模式启动人偶,您会在浏览器中看到console.log()消息。

旁注:

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

答案 7 :(得分:1)

如果将来有任何帮助,我会尝试分享我的解决方法。

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

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

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

    page.on('console', consoleObj => {
        if (consoleObj.type() === 'log') {
            console.log(consoleObj.text());
        }
    })
    

最后一个帮助我更有效地进行调试。

答案 8 :(得分:0)

我与this solution共享给将来的读者,这些读者更想知道如何获取评估的返回值。

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

答案 9 :(得分:0)

await page.evaluate(()=>{
      var string = 'I want to print this';
      return string;
}).then(console.log);
        

答案 10 :(得分:0)

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

我在此处的另一条评论中执行此操作的最佳方法https://stackoverflow.com/a/66801550/9026103

答案 11 :(得分:-1)

const page = await browser.newPage();
page.on('console', ConsoleMessage => console.log(ConsoleMessage.text));