Захватите HAR из BrowserStack, используя webdriverio и browsermob - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь использовать прокси-сервер BrowserMob для захвата HAR для тестов, выполняемых на BrowserStack с использованием WebdriverIO

Пока у меня есть следующий код

conf / local.conf.js

const browserstack = require('browserstack-local');
const Proxy = require('browsermob-proxy').Proxy;
const fs = require('fs');

exports.config = {
    user: process.env.BROWSERSTACK_USERNAME || 'shubhamjindal2',
    key: process.env.BROWSERSTACK_ACCESS_KEY || 'PyNWYKCcnwxt4XMCP52s',
    proxyHost: process.env.PROXY_HOST || 'localhost',
    proxyPort: process.env.PROXY_PORT || '9090',

    updateJob: false,
    specs: [
        './test/specs/localTest.js'
    ],
    exclude: [],

    capabilities: [{
        'os': 'Windows',
        'os_version': '10',
        'browserName': 'Chrome',
        'browserVersion': '62.0',
        'browserstack.local': 'true',
        'browserstack.video': 'false',
        'seleniumProtocol': 'WebDriver'
    }],
    logLevel: 'warn',
    coloredLogs: true,
    screenshotPath: './errorShots/',
    baseUrl: '',
    waitforTimeout: 10000,
    connectionRetryTimeout: 90000,
    connectionRetryCount: 3,
    host: 'hub.browserstack.com',

    before: function() {
        const chai = require('chai');
        global.expect = chai.expect;
        chai.Should();
    },
    framework: 'mocha',
    mochaOpts: {
        ui: 'bdd',
        timeout: 60000
    },

    // Code to start browserstack local before start of test
    onPrepare: function(config, capabilities) {
        console.log("Connecting local");
        exports.proxy = new Proxy();

        exports.proxy.start(exports.config.proxyPort, function(err, data) {
            if (!err) {
                exports.proxy.startHAR(exports.config.proxyPort, 'dummy', true, true);
            } else {
                console.error(err);
            }
        });

        capabilities['proxy'] = {
            httpProxy: exports.proxy,
        };

        const bsLocalArgs = {
            'key': exports.config.key,
            'forcelocal': true,
            'forceproxy': true,
            'force': true,
            'v': true,
            '-local-proxy-host': exports.config.proxyHost,
            '-local-proxy-port': exports.config.proxyPort,
        };

        return new Promise(function(resolve, reject) {
            exports.bsLocal = new browserstack.Local();
            exports.bsLocal.start(bsLocalArgs, function(error) {
                if (error) return reject(error);

                console.log('Connected. Now testing...');
                resolve();
            });
        });
    },

    // Code to stop browserstack local after end of test
    onComplete: function(exitCode, config, capabilities, results) {
        exports.bsLocal.stop();

        exports.proxy.getHAR(exports.config.proxyPort, function(err, resp) {
            console.log(err, resp);
            if (!err) {
                console.log('har saved at output.har');
                fs.writeFileSync('test/diagnostics/output.har', resp, 'utf8');
            } else {
                console.err('Error getting HAR file: ' + err);
            }
            exports.proxy.stop(exports.config.proxyPort);
        });
    },
}

tests / spec / localTest.js

describe('BrowserStack Local Testing', function() {
    it('can check tunnel working', function() {
        browser.url('http://localhost:8083');
    });
});

Я застрял при получении HAR от прокси в ловушке onComplete, но я не могу придумать способ получитьHAR.

Это правильная конфигурация?Как мне завершить браузер обратным вызовом, чтобы прокси мог захватить HAR?

Я запускаю тест с использованием wdio cli

. / Node_modules / .bin /wdio conf / local.conf.js

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Если я правильно понимаю, вам необходимо собрать HAR по некоторым причинам для сеансов, запущенных в BrowserStack. Если это так, то BrowserStack предоставляет эту функцию сетевых журналов, которую вы можете получить в виде файла HAR и которая содержит всю информацию о сети, которую вы получите от browser-mob. Вы можете получить сетевые журналы, используя их API.

Извлечение автоматизации сетевых журналов

Сетевые журналы для каждого сеанса доступны в формате HAR (HTTP-архив), и их можно получить с помощью REST API.

curl -u "USERNAME:ACCESS_KEY" https://api.browserstack.com/automate/builds/<build-id>/sessions/<session-id>/networklogs

и FYI, пожалуйста, отредактируйте свое имя пользователя BrowserStack и ключ доступа из кода, который вы опубликовали.

0 голосов
/ 22 мая 2019

Я понимаю, что вы используете Webdriver IO для выполнения тестов. Вы можете обратиться к примеру проекта по BrowserStack: https://github.com/browserstack/webdriverio-browserstack

Внесите изменения в файл local.conf.js следующим образом, заменив функцию onPrepare на общую, представленную ниже.

Я использую Charles Proxy для захвата сетевого трафика, и он работает для меня. Обязательно выполните шаги, указанные в файле Readme.md.

onPrepare: function (config, capabilities) {
    console.log("Connecting local");
    return new Promise(function(resolve, reject){
      exports.bs_local = new browserstack.Local();
      exports.bs_local.start({'key': exports.config.key,'forcelocal': true, 'verbose': 'true','force':'true','proxyHost': '127.0.0.1', 'proxyPort': '8888','forceProxy': true }, function(error) {
        if (error) return reject(error);
        console.log('Connected. Now testing...');

        resolve();
      });
    });
  },
...