使用Puppeteer可以通过无头镀铬以编程方式生成har文件吗?

时间:2017-11-21 16:59:18

标签: google-chrome puppeteer har

我想使用puppeteer控制无头镀铬实例,拍摄快照并点击各种页面元素,同时捕获一个har文件。这可能吗?我看过API但没有发现任何有用的东西。

2 个答案:

答案 0 :(得分:3)

Puppeteer中没有HAR生成器助手。但您可以使用chrome-har生成HAR文件。

const fs = require('fs');
const { promisify } = require('util');

const puppeteer = require('puppeteer');
const { harFromMessages } = require('chrome-har');

// list of events for converting to HAR
const events = [];

// event types to observe
const observe = [
  'Page.loadEventFired',
  'Page.domContentEventFired',
  'Page.frameStartedLoading',
  'Page.frameAttached',
  'Network.requestWillBeSent',
  'Network.requestServedFromCache',
  'Network.dataReceived',
  'Network.responseReceived',
  'Network.resourceChangedPriority',
  'Network.loadingFinished',
  'Network.loadingFailed',
];

(async () => {
  const browser = await puppeteer.launch();
  const page = await browser.newPage();

  // register events listeners
  const client = await page.target().createCDPSession();
  await client.send('Page.enable');
  await client.send('Network.enable');
  observe.forEach(method => {
    client.on(method, params => {
      events.push({ method, params });
    });
  });

  // perform tests
  await page.goto('https://en.wikipedia.org');
  page.click('#n-help > a');
  await page.waitForNavigation({ waitUntil: 'networkidle2' });
  await browser.close();

  // convert events to HAR file
  const har = harFromMessages(events);
  await promisify(fs.writeFile)('en.wikipedia.org.har', JSON.stringify(har));
})();

Here您可以找到有关此解决方案的文章。

答案 1 :(得分:0)

@Everettss提出的解决方案(到目前为止)是唯一的选择,但不如保存在浏览器中的HAR那样好。看看这两种情况,我都为google.com页面生成了HAR。最上面的是puppeteer-har(使用chrome-har)生成的HAR。这里的请求太少,没有针对主要文档的指标,奇怪的是时间安排不同。

enter image description here

Puppeteer不是HAR文件的理想选择。因此,我建议使用https://github.com/cyrus-and/chrome-har-capturer