Как получить все сообщения консоли с кукловодом? включая ошибки, нарушения CSP, отказавшие ресурсы и т. д.

Я получаю страницу с кукловодом, на которой есть некоторые ошибки в консоли браузера, но событие консоли кукловода не запускается всеми сообщениями консоли.

Браузер кукольника Chrome показывает несколько консольных сообщений

несколько сообщений консоли

Однако консоль кукловода регистрирует только одну вещь в узле.

консоль регистрирует одну вещь в узле

Вот сценарий, который я сейчас использую:

const puppeteer = require('puppeteer');

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();
  page.on('console', msg => console.log('PAGE LOG:', msg.text));
  await page.goto('https://pagewithsomeconsoleerrors.com');
  await browser.close();
})();

Изменить: как указано в моем комментарии ниже, я попробовал команду page.waitFor (5000), которую рекомендовал Эвереттсс, но это не сработало.

Edit2: удален оператор распространения из msg.text, поскольку он был там случайно.

Edit3: я открыл проблему на github по этому поводу с похожими, но разными примерами снимков экрана: https://github.com/GoogleChrome/puppeteer/issues/1512


person Carlos E Silva    schedule 28.11.2017    source источник
comment
Если эта ошибка появляется позже во время выполнения, попробуйте тайм-аут до await browser.close();, например: await page.waitFor(5000);   -  person Everettss    schedule 29.11.2017
comment
Я пробовал использовать page.waitFor, но это не помогло = /   -  person Carlos E Silva    schedule 01.12.2017
comment
@CarlosESilva Я в одной лодке. Судя по проблеме с GitHub, у вас все работает, но я все еще не могу заставить его работать. Не хотите ли ответить на свой вопрос здесь с помощью примера кода вместе с версией кукловода и узла, которые вы используете? Спасибо!   -  person Ashish Kumar - Ashfame    schedule 31.01.2018
comment
у вас когда-нибудь это работало?   -  person randomguy04    schedule 03.09.2018


Ответы (4)


Проблема GitHub, связанная с захватом ошибок консоли, включает отличный комментарий о прослушивании консольных и сетевых событий. Например, вы можете зарегистрироваться для вывода на консоль и сетевых ответов и сбоев, как это:

  page
    .on('console', message =>
      console.log(`${message.type().substr(0, 3).toUpperCase()} ${message.text()}`))
    .on('pageerror', ({ message }) => console.log(message))
    .on('response', response =>
      console.log(`${response.status()} ${response.url()}`))
    .on('requestfailed', request =>
      console.log(`${request.failure().errorText} ${request.url()}`))

И получите, например, такой вывод:

200 'http://do.carlosesilva.com/puppeteer/'
LOG This is a standard console.log message
Error: This is an error we are forcibly throwing
    at http://do.carlosesilva.com/puppeteer/:22:11
net::ERR_CONNECTION_REFUSED https://do.carlosesilva.com/http-only/sample.png
404 'http://do.carlosesilva.com/puppeteer/this-image-does-not-exist.png'
ERR Failed to load resource: the server responded with a status of 404 (Not Found)

См. Также типы полученных консольных сообщений с помощью console и _ 4_, _ 5_ и _ 6_ объекты, полученные с другими событиями.

Если вы хотите дополнить свой вывод некоторыми цветами, вы можете добавить Мел:

  const chalk = require('chalk')
  page
    .on('console', message => {
      const type = message.type().substr(0, 3).toUpperCase()
      const colors = {
        LOG: text => text,
        ERR: chalk.red,
        WAR: chalk.yellow,
        INF: chalk.cyan
      }
      const color = colors[type] || chalk.blue
      console.log(color(`${type} ${message.text()}`))
    })
    .on('pageerror', ({ message }) => console.log(chalk.red(message)))
    .on('response', response =>
      console.log(chalk.green(`${response.status()} ${response.url()}`)))
    .on('requestfailed', request =>
      console.log(chalk.magenta(`${request.failure().errorText} ${request.url()}`)))

В приведенных выше примерах используется Puppeteer API v2.0.0.

person Ferdinand Prantl    schedule 26.01.2020

Самый простой способ захватить все сообщения консоли - передать аргумент dumpio в puppeteer.launch().

Из документации API Puppeteer:

dumpio: ‹boolean› Указывает, передавать ли браузерный процесс stdout и stderr в process.stdout и process.stderr. По умолчанию false.

Пример кода:

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch({
         dumpio: true
    });

    ...

})();
person Eneko    schedule 18.03.2020
comment
Я не видел консоль браузера в процессе stdout, также похоже, что ссылка на документ не работает. - person Sergiy Ostrovsky; 13.07.2020
comment
Исправлена ​​битая ссылка, спасибо! Какую версию вы используете? В документации по-прежнему упоминается аргумент dumpio, но я не тестировал последнюю версию. - person Eneko; 15.07.2020
comment
Я использовал версию 2.0.0. Может это я что-то не так делаю, позже проверю еще раз. Спасибо! - person Sergiy Ostrovsky; 24.07.2020

Вам нужно установить несколько слушателей, если вы хотите все уловить. Событие console генерируется, когда javascript на странице вызывает сообщение API консоли (например, console.log).

Полный список API консоли см. В документации для консоли на MDN: https://developer.mozilla.org/en-US/docs/Web/API/Console

Причина, по которой вам нужно несколько слушателей, заключается в том, что часть того, что записывается в опубликованном вами изображении, не происходит на странице.

Так, например, чтобы поймать первую ошибку в изображении net:: ERR_CONNECTION_REFUSED, вы должны установить слушателя следующим образом: page.on('requestfailed', err => console.log(err));

Документация кукловода содержит полный список событий. Вам следует взглянуть на документацию к используемой вами версии и посмотреть на различные события, которые будет выдавать класс Page, а также на то, что эти события будут возвращать. Пример, который я написал выше, вернет экземпляр класса запроса Puppeteer.

https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#class-page

person tjc0090    schedule 24.03.2018

Я расширил отличный код комментария Фердинанда описательным текстом ошибок из объекта JSHandle consoleMessage в следующем комментарии. Таким образом, вы можете поймать все ошибки в браузере и прочитать все описание, как в консоли браузера.

Проверьте это здесь https://stackoverflow.com/a/66801550/9026103

person Kurkov Igor    schedule 25.03.2021