Browsermob proxy + Java + WebDriver помогите запустить простейший тест

У littleproxy внутри dependency на jetty. К тому же, в BMP вшита еще и не самая свежая версия, где jetty еще 7.6.16.v20140903, как написали выше.

Да, BMP вроде как можно использовать без джетти. LittleProxy вроде как использует Netty.
Но в этом варианте у меня не получилось интерсептить ответы сервера. Вот не заходит LittleProxy в метод serverToProxyResponse(), как я ни бился.

У меня сейчас как раз работет сценарий с получением har и просмотром, какие уходят запросы. работаю как раз с последней версей little proxy.
Еще есть тесты, где перехватываются запросы и подменяются. Тоже с помощью прокси.
Если что - по конкретным вопросам могу дать примеры.

О, да, очень нужны примеры.
Достаточно самый простой: перехватывать и логировать все запросы и ответы.

Смотри, этот пример я использую у себя. Он на 80% стырен был откуда-то с гугла.
Мне в основном нужен был метод для получения кол-ва определенных запросов(метод getCallsCountByContainsKey). Ну думаю не составит труда разобраться, как вынуть нужную информацию.
Работает сейчас - каждый день запускается не по одному разу.

public class BrowserProxy {
    private BrowserMobProxy proxyServer;
    private boolean isServerStarted;

    public void startServer(DesiredCapabilities capabilities) {
        proxyServer = new BrowserMobProxyServer(0);
        try {
            proxyServer.start();
            isServerStarted = true;
        } catch (Exception e) {
            throw new RuntimeException("Cant start proxy-server on port: " + proxyServer.getPort(), e);
        }

        Proxy proxy = null;
        try {
            proxy = createHttpProxy(proxyServer.getPort());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        createNewHar();
        // configure it as a desired capability
        capabilities.setCapability(CapabilityType.PROXY, proxy);
    }

    private Proxy createHttpProxy(int port) throws UnknownHostException {
        Proxy proxy = new Proxy();
        proxy.setProxyType(Proxy.ProxyType.MANUAL);
        String proxyStr = String.format("%s:%d", InetAddress.getLocalHost().getCanonicalHostName(),  port);
        proxy.setHttpProxy(proxyStr);
        proxy.setSslProxy(proxyStr);
        return proxy;
    }

    public void createNewHar(){
        proxyServer.newHar();
    }

    public void stopServer() {
        if (isServerStarted) {
            try {
                proxyServer.stop();
            } catch (Exception e) {
                throw new RuntimeException("Cant stop proxy server", e);
            }

        }
    }


    public int getCallsCountByContainsKey(String key, boolean clearHistory) {
        int result = 0;
        Har har = proxyServer.getHar();
        if (har != null) {
            HarLog harLog = har.getLog();
            List<HarEntry> entries = harLog.getEntries();
            for (HarEntry entry : entries) {
                if (entry.getRequest().getUrl().contains(key)) {
                    result++;
                }

            }

        } else {
            return -1;
        }
        if(clearHistory) {
            createNewHar();
        }
        return result;
    }

    public Har getHar() {
        return proxyServer.getHar();
    }
}

Зависимость следующая:

<dependency>
     <groupId>net.lightbody.bmp</groupId>
     <artifactId>browsermob-core-littleproxy</artifactId>
     <version>2.1.0-beta-5</version>
</dependency>

Закинул в свой блог описание, как с этим всем работать. Думаю может кому-то будет полезным!

Спасибо!
Но у меня проблема. Когда через этот проекси открывают google.com, работает.
А когда открываю “https://127.0.0.1:48895/page_with_uploads.html” - не работает, Пишет “The site can’t be reached”. :frowning: А я все тесты именно на localhost запускаю.

@sidelnikovmike Хелп ниидед! Не получается использовать прокси с http://127.0.0.1
Беда прям, что делать-то?

А какая версия BMP? Вот тут описана опция контроля native dns resolution. Где-то читал, что без нее могут быть проблемы с определением localhost. Но в 2+ версиях она должна быть включена по дефолту.

П.С. Сам не тестил, т.к. использую remote BMP.

Да у меня эта проблема со всеми версиями BMP. Ок, спасибо, потыкаю эту настройку.

А ты используешь вместо BMP что-то другое?

ща подумаем, попробуем. Не пробовал сам, надо поглядеть

Нет, тот же BMP, просто remote версию. Поднимаю batch / sh и конекчусь рест клиентом. Пробовал даже в докер контейнере поднимать.

Сообщение перенесено в новую тему: Не удается зпустить локальный HAR Storage

Я запускаю прокси и читаю запросы с ответами так:
Единственное, что пока не решил (но вроде как не влияет), я получаю такой прокси (кстати из-за поиска решения с этими нулями я и попал сюда):

Starting proxy at address: 0.0.0.0/0.0.0.0:0
Proxy listening with TCP transport
Proxy started at address: /0:0:0:0:0:0:0:0:39998 (ну и порт каждый раз разный)

   BrowserMobProxy proxy = new BrowserMobProxyServer();
   proxy.start(0);

   Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);

  DesiredCapabilities capabilities = new DesiredCapabilities();
   capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);

   System.setProperty("webdriver.chrome.driver", getCfgValue("webdriver_place"));

   WebDriver driver = new ChromeDriver(capabilities);
   driver.manage().window().maximize();
   driver.manage().timeouts().implicitlyWait(15, TimeUnit.SECONDS);

   proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);

   proxy.newHar(getCfgValue("SITE_URL"));

   driver.get(getCfgValue("SITE_URL"));

   Har har = proxy.getHar();


    boolean isCSRFPresent = false;
    for (HarEntry entry : har.getLog().getEntries())
        if (entry.getRequest().getMethod().equals("POST")) {

            log.info("request code: " + entry.getRequest().getMethod()); // Output request type
            log.info("--> response url: " + entry.getRequest().getUrl()); // Output url of request
            log.info("--> response code: " + entry.getResponse().getStatus()); // Output the
            log.info(getCfgValue("line"));

            List<HarPostDataParam> params = entry.getRequest().getPostData().getParams();
            log.info("Reading POST parameters:");
            log.info(getCfgValue("line"));
            int element = 1;
            for (HarPostDataParam param : params) {

                String parameter = element + ". " + param.getName() + ": " + param.getValue();
                log.info(parameter);

                if(param.getName().contains("csrf")) {

                    if(!param.getValue().equals("") || !param.getValue().equals(" ") || param.getValue() != null) {

                        isCSRFPresent = true;
                    }
                }
                element++;
            }

            log.info(getCfgValue("line"));
            // время ожидания ответа от сервера в миллисекундах
            log.info("Time spent on receiving response from server: " + entry.getTimings().getWait() + " ms");
            // время чтения ответа от сервера в миллисекундах
            log.info("Time spent on reading received response: " + entry.getTimings().getReceive() + " ms");

            log.info(getCfgValue("line"));
            log.info(getCfgValue("line"));
        }

Вопрос ко всем, у кого проблемы с localhost, а чего вы не пропишетесь в hosts? Добавляете таргет на ваш хост+порт и вуаля.

@tymoschuk_jane Да, это помогло бы.
Но хочется сделать запуск текстов максимально простым. Чтобы любой мог зачекаутить проект и одной командой запустить тесты, и ему не пришлось бы прописывать миллион параметров в hosts, файлах, настройках, эксельках и пр.

ну, как минимум, такому человеку поднимать тестируемый энв у себя локально :wink:

Не-не. Ничего подобного.
На моём проекте так: любой человек может запустить тесты на своей машине, запустив всего лишь эти две команды:

  • git clone git://my-project
  • ./build.sh
  • ./run-tests.sh

Эти скрипты сами всё сделают. Запустят тестируемое приложение, прогонят тесты и остановят приложение.

1 лайк

ну тогда не вижу проблемы добавить в build.sh строку, которая прописывает локалхост в хосты

Не так-то просто.
Это нужно проанализировать: вдруг там уже есть такая трока? Вдруг она указывает на какой-то другой хост? Да и вообще, это требует от простого скрипта “build” SUDO прав…

В общем, можно, но не хотелось бы. Запускать на localhost гораздо проще.
Всё остальное обычно запускается.