Puppeteer登录页面.评估

Ale*_*dis 25 javascript node.js puppeteer

我怎样才能在page.log内部调度一些东西,将它传递给节点并评估页面时使用它?

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

Vav*_*off 43

**已更新,可与puppeteer v1.4.x配合使用

如果你想要的只是"记录页面的进度.评估到控制台",那么就是

const page = await browser.newPage();

page.on('console', consoleObj => console.log(consoleObj.text()));
Run Code Online (Sandbox Code Playgroud)

并使用console.logpage.evaluate如需要往常一样,没有更多的依赖关系.

另请参阅这个很好的调整,以从日志中删除多个恼人的警告.

  • @tim-montague 更新了最新的 pptr (2认同)

Jam*_*ser 8

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

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


Nic*_*tte 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)
Run Code Online (Sandbox Code Playgroud)


小智 5

1.15.x 及更高版本的更新 - 2020 年 1 月

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

因此,当您使用page.evaluate()orpage.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'));
Run Code Online (Sandbox Code Playgroud)

解释:

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

边注:

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