Прокси BrowserMob и минимальный Webdriverio, пустой файл HAR - PullRequest
0 голосов
/ 28 августа 2018

Мне было интересно, есть ли у кого-нибудь представление о том, в чем может быть проблема, или о дополнительных шагах, которые я могу предпринять для решения следующей проблемы.

У меня есть требование перехватывать сетевой трафик, чтобы я мог написать несколько тестов селена, проверяющих определенные заголовки запросов.

Проблема заключается в том, что при попытке использовать прокси-сервер Webdriver.io + Browsermob созданный файл HAR содержит очень мало информации.

Я попытался использовать привязки C # прокси, и это привело к той же проблеме, что и Javascript. Единственные привязки, которые я получил, которые возвращали данные в файле HAR, были Java. Однако есть деловое требование, что я должен использовать Webdriver.io для реализации этого.

Я проверил ряд других Вопросов и Ответов по переполнению стека, но безрезультатно. На большинство из них не было получено ответа, а те, которые были, еще не сработали для меня.

Код, который я сейчас выполняю, очень похож на этот , с той разницей, что это URL, с которого я пытаюсь получить информацию.

Разница между моим работающим кодом Java и кодами Javascript и C # заключалась в том, что один Java программно настраивает прокси, а два других ожидают, что прокси уже запущен, и просто подключаются к нему.

Даже с учетом этого, когда я запускаю тесты C # или Javascript, прокси-сервер регистрирует новое соединение. Селен сервер также запускается нормально. Обе очистки без проблем в соответствии с их соответствующими консолями после завершения испытаний.

Есть ли другие способы отладки? Или даже альтернативы для захвата сетевого трафика (Должен работать через браузер - уже есть решение, которое работает для chrome с использованием chrome-remote-interface, но мы видели предложения использовать прокси-сервер browsermob для захвата сети через браузер).

Спасибо за ваше время

Что-то, что я забыл упомянуть, и это очень важно. Ниже приведен пакет npm, который я использую для browsermob-proxy :

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

1 Ответ

0 голосов
/ 05 сентября 2018

Хорошо, я понял, почему я не получаю никаких данных. Я надеюсь, что это сэкономит другим время и нервы.

Проблема в том, как прокси-сервер 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));
}
...