BrowserMob Proxy 和 Webdriverio 最小的空 HAR 文件

BrowserMob Proxy and Webdriverio minimal, empty HAR file

我想知道是否有人知道可能是什么问题或我可以采取其他步骤来解决以下问题。

我需要捕获网络流量,这样我就可以编写一些 selenium 测试来验证特定请求 headers。

问题是在尝试使用 Webdriver.io + Browsermob 代理时创建的 HAR 文件包含非常少的信息。

我曾尝试使用代理的 C# 绑定,结果导致了与 Java 脚本相同的问题。我开始工作并在 HAR 文件中返回数据的唯一绑定是 Java 绑定。虽然有一个业务需求,但我必须使用 Webdriver.io 来实现它。

我已经检查了一些来自堆栈溢出的其他问题和答案,但无济于事。大多数都没有得到回答,已经回答的那些对我来说还没有用。

我目前使用的代码 运行 与 非常相似,不同之处在于 URL 我正在尝试从中获取信息。

我的 Java 代码与 Java 脚本和 C# 代码之间的区别在于 Java 一个以编程方式设置代理,而另外两个期望代理已经 运行 并连接到它。

即使考虑到这一点,当我启动 C# 或 Java 脚本测试时,代理也会注册新连接。 selenium 服务器也可以正常启动。测试完成后,根据各自的控制台进行清理,没有任何问题。

是否有任何其他潜在调试方法?或者甚至是捕获网络流量的替代方案(必须跨浏览器工作 - 已经有一个解决方案适用于 chrome 使用 chrome-remote-interface 但我们看到了使用 browsermob 代理进行跨浏览器网络捕获的建议)。

感谢您的宝贵时间

有件事我忘记说了,这很重要。下面是我用于 browsermob-proxy 的 npm 包:

https://www.npmjs.com/package/browsermob-proxy

好的,我明白了为什么我没有收到任何数据。我希望这可以节省其他人一些时间和麻烦。

问题在于 browsermob 代理处理 localhost 的方式。相反,我将代理切换为使用我的 IPV4 地址,它开始捕获所有 HAR 数据。

查看下面的代码:

//BroswerMobProxy + webdriver.io
//npm package used https://www.npmjs.com/package/browsermob-proxy


var webdriverio = require('webdriverio');

//proxy settings, host is IPV4 address
var Proxy = require('browsermob-proxy').Proxy
, fs = require('fs')
, proxy = new Proxy({host: 'Put IPV4 Address Here', proxyPort: 8081 , selHost: 'Put IPV4 Address Here'});
;

//convenience method that 
proxy.cbHAR({captureHeaders: true, captureContent: true, captureBinaryContent: true }, doSeleniumStuff, function(err, data) {

  if (err) {
    console.error('ERR: ' + err);
  } else {

    /* Make sure har results are in the correct shape
    *  for any further processing
    */
    var harResultsString = JSON.stringify(data);
    var harResultsJson = JSON.parse(harResultsString);

    //Write HAR file
    fs.writeFileSync('DemoFile.json', harResultsJson, 'utf8');

    //Print to console
    console.log(harResultsJson);
  }
});

//webdriver.io options
const opts = {
  desiredCapabilities:{
    browserName: 'chrome',
    proxy: {
      proxyType: 'MANUAL',
        httpProxy: String(proxy.host)+":"+String(proxy.proxyPort),
        sslProxy:  String(proxy.host)+":"+String(proxy.proxyPort),
        socksProxy:String(proxy.host)+":"+String(proxy.proxyPort),
        socksVersion: 4,
      autodetect: false
     },
     acceptSslCerts: true,
     acceptInsecureCerts: true
  },
  host: 'Put IPV4 Address here',
  port: 4444,
  protocol: 'http',
  coloredLogs: true,
  proxy: 'http://'+String(proxy.host)+":"+String(proxy.proxyPort),
}

function doSeleniumStuff(proxy, cb) {
  var browser = webdriverio.remote(opts);
  // console.log(browser.options);
  browser
    .init()
    .url('http://yahoo.com.au')
    .getTitle().then(function(title) {
      console.log('Title was: ' + title);
    })
    .end().then(cb).catch(e => console.log(e));
}