如何在puppeter中打印页面的控制台输出,就像在浏览器中一样?

gma*_*man 5 javascript puppeteer

我一直看到这个错误代码

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

失败

console.log('Hello %s', 'World');
Run Code Online (Sandbox Code Playgroud)

产生

Hello World     // browser
Hello %s World  // puppeteer
Run Code Online (Sandbox Code Playgroud)

好,所以我想也许我可以做到

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

NOPE:那倒掉了一些巨大的JSHandle东西。

好吧,也许

page.on('console', msg => console.log(...msg.args().map(a => a.toString());
Run Code Online (Sandbox Code Playgroud)

NOPE:打印

JSHandle: Hello %s JSHandle: World
Run Code Online (Sandbox Code Playgroud)

我想我可以通过删除前9个字符来破解它。

我也试过

page.on('console', msg => console.log(...msg.args().map(a => a.jsonValue())));
Run Code Online (Sandbox Code Playgroud)

NOPE:打印

Promise { <pending> } Promise { <pending> }
Run Code Online (Sandbox Code Playgroud)

好吧

page.on('console', async(msg) => {
  const args = Promise.all(msg.args().map(a => a.jsonValue()));
  console.log(...args);
});
Run Code Online (Sandbox Code Playgroud)

不,那是打印

UnhandledPromiseRejectionWarning: TypeError: Found non-callable @@iterator
UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 95)
Run Code Online (Sandbox Code Playgroud)

另一个去

page.on('console', async(msg) => {
  const args = Promise.all(msg.args().map(async(a) => {
    return await a.jsonValue();
  }));
  console.log(...args);
});
Run Code Online (Sandbox Code Playgroud)

和之前一样

UnhandledPromiseRejectionWarning: TypeError: Found non-callable @@iterator
UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a 
Run Code Online (Sandbox Code Playgroud)

我什至进行了跟踪,msg.text()但它所做的只是返回一个预制字符串,因此使用该字符串为时已晚。

如何获得与puppeteer中浏览器的console.log相同的输出?


PS:如上所述,此hack在puppeteer 1.20.0中有效

  page.on('console', (msg) => {
    console.log(...msg.args().map(v => v.toString().substr(9)));
  });
Run Code Online (Sandbox Code Playgroud)

但这显然是黑客,我希望它会在某个时候破解,因此需要寻找正确的解决方案。

gma*_*man 6

  page.on('console', async e => {
    const args = await Promise.all(e.args().map(a => a.jsonValue()));
    console.log(...args);
  });
Run Code Online (Sandbox Code Playgroud)

或者

  page.on('console', async e => {
    const args = await Promise.all(e.args().map(a => a.jsonValue()));
    console[e.type() === 'warning' ? 'warn' : e.type()](...args);
  });
Run Code Online (Sandbox Code Playgroud)

作品