Can a har file be programmatically generated from headless chrome using Puppeteer?
There is no HAR generator helper in Puppeteer. But you can use chrome-har
to generate HAR file.
const fs = require('fs');const { promisify } = require('util');const puppeteer = require('puppeteer');const { harFromMessages } = require('chrome-har');// list of events for converting to HARconst events = [];// event types to observeconst 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 you can find an article about this solution.
Solution proposed by @Everettss is the only option (so far), but is not as good as HAR saved in browser. Look at this, in both cases I generated HAR for google.com page. At top you have HAR generated by puppeteer-har (which is using chrome-har). Too little requests here, no metrics for main document, strangely different timing.
Puppeteer is not a perfect option for HAR files. Therefore I am suggesting to use https://github.com/cyrus-and/chrome-har-capturer