Поймать события аварии с Puppeteer работает без головы - PullRequest
0 голосов
/ 05 июля 2018

Есть ли способ отловить события сбоя страницы хрома, используя Puppeteer в режиме без головы?

Следующее работает только если не в режиме без головы?:

page.once("error", async () => {
   //Do something
});

await page.goto('about:crash');

Я использую безголовый аргумент, чтобы начать кукловод. (Чтобы активировать WebGL)

browser = await puppeteer.launch({
    headless: false,
    args: [
        `--window-size=${width},${height}`,
        '--headless'
    ]
}); 

Добавлены детали: Моя цель - проверить поведение моего приложения после сбоя.

Следующее не улавливает ошибку:

const puppeteer = require('puppeteer');

const width = 1920;
const height = 1080;

(async () => {
    browser = await puppeteer.launch({
        headless: false,
        args: [
            `--window-size=${width},${height}`,
            '--headless'
        ]
    });

    page = await browser.newPage();
    await page.goto('https://www.google.com/', { waitUntil: 'networkidle2', timeout: 10000 });
    console.log('page loaded');

    try {
        //page.goto('about:crash');
        page.goto('chrome://crash/')

    } catch (e) {
        console.log(`crash has been catched`)
    };
})();

И это так, но я получаю отказ от обещания, который делает мой тест Jest неудачным

const puppeteer = require('puppeteer');

const width = 1920;
const height = 1080;

(async () => {
    browser = await puppeteer.launch({
        headless: false,
        args: [
            `--window-size=${width},${height}`,
            '--headless'
        ]
    });

    page = await browser.newPage();
    await page.goto('https://www.google.com/', { waitUntil: 'networkidle2', timeout: 10000 });
    console.log('page loaded');

    page.once("error", async () => {
        console.log('crash has been catched')
    })

    //page.goto('about:crash');
    page.goto('chrome://crash/')

})();

Как я могу

  1. сбой страницы,
  2. поймать ошибку сбоя
  3. сделать еще несколько тестов (например, создание новой страницы, перезагрузка страницы ...)

1 Ответ

0 голосов
/ 06 июля 2018

Вы можете использовать try / catch. Вы также можете установить переменную bool, чтобы знать, когда закрывать / открывать новую страницу. (например, reusePageInstance)

Вот пример:

const puppeteer = require('puppeteer');

var reusePageInstance = true;

(async() => {
  const args = [
    "--disable-setuid-sandbox",
    "--no-sandbox",
  ];
  const options = {
    args,
    headless: true,
    ignoreHTTPSErrors: true,
  };

  const browser = await puppeteer.launch(options);

  let page

  if (!reusePageInstance) {
    page = await browser.newPage()
  }

  var q = ['http://www.stackoverfllow.com']

  while (q.length > 0) {

    let url = q.shift()
    console.log('Loading Page: ' +' - ' + url)

    try {
      if (reusePageInstance) {
        page = await browser.newPage()
      }

      await page.goto(url, {
        timeout: 10000,
        waitUntil: 'networkidle2'
      })
      console.log('Page Loaded')

      const html = await page.content();
      // do something

      if (reusePageInstance) {
        await page.close()
      }
      console.log('Page closed')
    } catch (e) {
      console.log('**** FAIL ****')
      console.log('Page Load Failed', url)
      console.error(e)
      await page.close()
    }
  }
  await browser.close()

})()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...