您如何记录电子`webContents`会话的`.har`?

时间:2019-04-19 20:35:53

标签: node.js electron har

我有一个Javascript应用程序,该应用程序产生了Electron并在其中进行了很多工作。

我正在尝试调试一个奇怪的网络问题,为此,我想使用一个HAR文件来存储Electron发出的所有HTTP请求的日志。

这可能吗?

1 个答案:

答案 0 :(得分:0)

是的,可以使用chrome-har-capturer完成-您可以传递webContents.debugger中的一堆事件,然后chrome-har-capturer会为您将它们转换为HAR。

示例代码:

const chromeHarCapturer = require('chrome-har-capturer')

let log = []
const webContents = browserWindow.webContents

webContents.debugger.on("message", function(event, method, params) {
  // https://github.com/cyrus-and/chrome-har-capturer#fromlogurl-log-options
  if (!["Page.domContentEventFired", "Page.loadEventFired", "Network.requestWillBeSent", "Network.dataReceived", 
        "Network.responseReceived", "Network.resourceChangedPriority", "Network.loadingFinished", 
        "Network.loadingFailed"].includes(method)) {
    // not relevant to us
    return
  }
  log.push({method, params})

  if (method === 'Network.responseReceived') { // the chrome events don't include the body, attach it manually if we want it in the HAR
    webContents.debugger.sendCommand('Network.getResponseBody', {
      requestId: params.requestId
    }, function(err, result) {
      result.requestId = params.requestId
      log.push({
        method: 'Network.getResponseBody',
        params: result
      })
    })
  }
})

webContents.debugger.once("detach", function() {
  // on detach, write out the HAR
  return chromeHarCapturer.fromLog("http://dummy-url-for-whole-session", log).then(function(har) {
    const path = `/tmp/${Number(new Date())}-har.json`

    fs.writeJson(path, log)

    log = []
  })
})

// subscribe to the required events
webContents.debugger.attach()
webContents.debugger.sendCommand('Network.enable')
webContents.debugger.sendCommand('Page.enable')