首页 > 解决方案 > 使用无头运行的 Puppeteer 捕获崩溃事件

问题描述

有没有办法在无头模式下使用 Puppeteer 捕获 chromium 页面崩溃事件?

以下仅在非无头模式下有效?:

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

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

我正在使用无头参数来启动 puppeteer。(保持 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. 做更多的测试(比如创建一个新页面,重新加载页面......)

标签: javascriptpuppeteer

解决方案


你可以使用try/catch。您还可以设置 bool 变量以了解何时关闭/打开新页面。(例如重用PageInstance)

这是一个例子:

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()

})()


推荐阅读