Как отслеживать HTTP-вызовы с помощью browsermob-proxy и nightwatch.js?

Я пишу тестовые примеры, используя фреймворк Nightwatch.js для приложения SPA. Здесь появилось требование отслеживать HTTP-вызовы и получать результаты производительности сайта. Поскольку этого можно легко добиться с помощью JMeter.

Используя инструмент автоматического тестирования, мы можем сделать это с помощью browsermob-proxy и селена.

Можно ли сделать то же самое, используя Nightwatch.js и browsermob-proxy?

Также какие шаги нужно сделать для того же.


person vibhor    schedule 25.05.2015    source источник


Ответы (3)


Для совместного использования Nightwatchjs и browsermob-proxy ознакомьтесь с этим репозиторием, в котором содержится информация о привязках NodeJS. для browsermob-proxy и программной генерации файлов HAR (HTTP-архив).

Если вас устраивает просто использование Nightwatchjs, в этом репозитории есть код в тестах< /em> каталог для следующего:

  • Пользовательская команда для получения запросов, сделанных до сих пор
  • Пользовательское утверждение для проверки существования запроса с учетом параметров фильтра и строки запроса.

Возможно, вам придется освежить в памяти, как добавлять пользовательские команды и утверждения в ваш проект Nightwatch, но после этого вы должны быть готовы к работе!

person EricM    schedule 10.04.2016

Вы можете использовать browsermob-proxy-api, просто скачав сервер browsermob-proxy, а затем установите его с помощью команды npm:

'test_settings': {
    'default': {
      'launch_url': 'http://localhost:3000',
      'screenshots': {
        'enabled': true, // if you want to keep screenshots
        'path': './screenshots' // save screenshots here
      },
      'globals': {
        'waitForConditionTimeout': 30000 // sometimes internet is slow so wait.
      },
      'desiredCapabilities': { // use Chrome as the default browser for tests
        'browserName': 'chrome',
        'proxy': {
          'proxyType': 'manual',
          'httpProxy': 'localhost:10800'
        },
        'acceptSslCerts': true,
        'javascriptEnabled': true, // turn off to test progressive enhancement

      }
    },

затем загрузите index.js отсюда: https://github.com/jmangs/node-browsermob-proxy-api и добавьте код из примера в свой step_definitions, если вы используете корнишон или describe шаг

person Hikaryu    schedule 28.04.2017

Поздновато танцевать. Мне удалось интегрировать браузермоб в nightwatch. Вот подробные шаги

  1. Скачать прокси для браузера https://bmp.lightbody.net/
  2. Откройте ваш cmd и перейдите в папку bin, а затем запустите browsermob, используя «browsermob-proxy».
  3. Я предполагаю, что у вас есть базовые настройки ночного дозора. Также вам понадобится мобпрокси. Установите его из "npm i browsermob-proxy-api"

  4. Создайте глобальный хук в nightwatch. Скажите «globalmodule.js» и укажите путь к этому файлу в globals_path в nightwatch.json.

  5. В globalmodule создайте глобальные хуки, как описано в http://nightwatchjs.org/guide#external-globals

  6. В хуке beforeEach добавьте следующий код: //если вы не используете корпоративный прокси и вам не нужно связываться с вышестоящим прокси

    var MobProxy = require('browsermob-proxy-api');
    var proxyObj = new MobProxy({'host': 'localhost', 'port': '8080'});

//при условии, что вы запустили browsermob на порту 8080. То есть на шаге 2.

//если вы работаете под корпоративным прокси, возможно, вам придется связать свой запрос. Это требует редактирования в пакете browsermob-proxy-api. Следуйте инструкциям, приведенным в конце этого раздела.

  1. Запустить прокси на новом порту

    proxyObj.startPort (порт, функция (ошибка, данные) { if (ошибка) { console.log (ошибка); } else { console.log («Новый порт запущен») } })

  2. Как только у нас появится новый порт, мы должны запустить наш браузер Chrome на указанном выше порту, чтобы все запросы браузера пересылались через прокси-сервер browsermob.

    proxyObj.startPort (порт, функция (ошибка, данные) { if (ошибка) { console.log (ошибка); } else { console.log («Новый порт запущен») var dataInJson = JSON.parse (данные);

//Шаг 8:

this.test_settings.desiredCapabilities =  {
"browserName": "chrome",
"proxyObj": proxyObj, //for future use
"proxyport": dataInJson.port, //for future use
"proxy": {
"proxyType": "manual",
"httpProxy": "127.0.0.1:" + dataInJson.port,
"sslProxy": "127.0.0.1:" + dataInJson.port //important is you have https site
},
"javascriptEnabled": true,
"acceptSslCerts": true,
"loggingPrefs": {
"browser": "ALL"
}
}
}
}) 
  1. Попробуйте запустить с указанными выше настройками, вы можете проверить, идет ли cmd [созданный на шаге 2 для подтверждения запроса через указанный выше порт. Будет немного активности]

  2. Для создания HAR и получения созданного HAR browsermob-proxy-api предоставляет отличный API.

    добавьте createHAR.js в любой путь и укажите этот путь в nightwatch.json[раздел custom_commands]

    exports.command = функция (обратный вызов) { var self = this;

    if (!self.options.desiredCapabilities.proxyObj) { console.error('Нет настройки прокси - вы вызывали setupProxy() ?'); }

    this.options.desiredCapabilities.proxyObj.createHAR(this.options.desiredCapabilities.proxyport, { 'captureHeaders': 'true', 'captureContent': 'true', 'captureBinaryContent': 'true', 'initialPageRef': 'homepage' }, function (err, result){ if(err){ console.log(err) }else{ console.log(result) if (typeof callback === "function") { console.log(this.options.desiredCapabilities .proxyObj); console.log(this.options.desiredCapabilities.proxyport); // console.log(result); callback.call(self, result); } } });

    вернуть это; };

затем, чтобы получитьHAR, добавьте getHAR.js, добавьте код ниже.

var parsedData;
exports.command = function(callback) {
var self = this;
if (!self.options.desiredCapabilities.proxy) {
console.error('No proxy setup - did you call setupProxy() ?');
}

self.options.desiredCapabilities.proxyObj.getHAR(self.options.desiredCapabilities.proxyport, function (err, data) {
console.log(self.options.desiredCapabilities.proxyObj);
console.log(self.options.desiredCapabilities.proxyport);
//console.log(result);
if(err){
console.log(err)
}else{
parsedData = JSON.parse(data)
console.log(parsedData.log.entries)
}
if (typeof callback === "function") {
console.log(self.options.desiredCapabilities.proxyObj);
console.log(self.options.desiredCapabilities.proxyport);
callback.call(self, parsedData);
}
});

return this;
};
  1. В начале теста createHAR не будет иметь proxyObj, поэтому этот шаг должен выполняться синхронно. Оберните этот шаг с помощью browser.perform()

    browser.perform(function(){ browser.createHAR() }) ////некоторая навигация

    browser.perform(функция(){browser.getHAR()})

Примечание. Если вы работаете за корпоративным прокси, возможно, вам придется использовать цепочку прокси, которую предлагает browsermob. Согласно документации по прокси-серверу browsermob, перейдите в раздел API, -> /proxy может иметь параметры запроса «proxyUsername» и «proxyPassword».

В node_modules->browsermob-proxy-api->index.js добавьте следующую строку после строки 22:

this.proxyUsername  = cfg.proxyUsername || '';
this.proxyPassword = cfg.proxyPassword || '';
this.queryString = cfg.queryString || 'httpProxy=yourupstreamProxy:8080'; //you will get this from pac file

then at line 177, where package is making request '/proxy' to browser.
replace 
path: url
 to
path: url + '?proxyUsername=' +this.proxyUsername + '&proxyPassword=' +  this.proxyPassword + '&' + this.queryString
person Rajesh    schedule 18.01.2018
comment
Вы знаете, как этого можно добиться с помощью транспортира. Я тоже за корпоративным прокси. Как вы думаете, я добавил код, предложенный в вашей статье, в index.js? любая помощь будет оценена - person Monnie_tester; 13.03.2019