среда, 13 апреля 2016 г.

Selenium + Browser proxy : куда уходят запросы?

Всем привет.
Не так давно в работе мне пришла задачка - нужно было смотреть, сколько определенных запросов уходит при открытии страницы и при некоторых действиях на ней. Как же сделать? Первое, что приходит на ум - прокси. Browser Proxy - библиотека, которая уже давно живет где-то по соседству с selenium, да вот только с недавних пор она притерпела небольшую "пластику" и теперь с ней нужно общаться немного по другому. Как именно - я сейчас расскажу и покажу. asdf


Итак. Для начала - ссылочка на гитхаб с библиотекой - https://github.com/lightbody/browsermob-proxy
Там в readme уже есть неплохое описание, какие-то основные вещи можно понять и оттуда. Но я всё же расскажу еще раз в разрезе решаемой задачи.

Первое, что мы делаем - правильно - подключаем библиотечку к нашему проекту с помощью любимого maven:

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


И собственно пишем код для работы с прокси:

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("Can't start proxy-server on port: " + proxyServer.getPort(), e);
        }

        Proxy proxy = null;
        try {
            proxy = createHttpProxy(proxyServer.getPort());
        } catch (UnknownHostException e) {
            e.printStackTrace();
        }
        createNewHar();
        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("Can't 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();
    }
}

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

Код, который получится у Вас в итоге:

public static void main(String[] args){
    BrowserProxy browserProxy = new BrowserProxy();
    DesiredCapabilities caps = getBrowserCapabilities(); //здесь мы в зависимости от браузера берем capabilities    browserProxy.startServer(caps);
    WebDriver webDriver = new RemoteWebDriver(caps);
    webDriver.get("http://yandex.ru");
    int callsCount = browserProxy.getCallsCountByContainsKey("coolUrl.com", false);
    assertTrue("Unexpected calls count",callsCount == 2);
    webDriver.quit();
}

Вот и всё. Проще простого!


8 комментариев:

  1. DesiredCapabilities caps = getBrowserCapabilities(); //здесь мы в зависимости от браузера берем capabilities browserProxy.startServer(caps)

    поясните пожалуйста

    ОтветитьУдалить
    Ответы
    1. Здесь должны браться capabilities в зависимости от используемого вами браузера.

      Удалить
  2. Подскажите, как работать с методом stopServer()?
    Когда он вызывается в нем все отрабатывает, но по факту интернет соединение остается активным.

    ОтветитьУдалить
    Ответы
    1. Этот метод стопает прокси. Траффик то может идти, но запись в har прекратится.

      Удалить
    2. Этот комментарий был удален автором.

      Удалить
    3. Понятно, спасибо за ответ.
      А как-то отключить интернет можно с помощью Browser proxy?

      Удалить
    4. Вы имеете в виду просто запросы чтоб не уходили?

      Удалить
    5. Я рассматривал Browser proxy с целью того чтобы симулировать на тестируемом сайте разрыв соединения с сервером, возможно ли это сделать с его помощью?

      Удалить