Блог вебразработчика
  • ГЛАВНАЯ
  • ПОДПИСКА

BrowserMob Proxy + Selenium: автоматизация сбора данных о производительности

Окт22
2013
Написал Tatyana

Selenium Driver
BrowserMob Proxy это бесплатная утилита, которая позволяет собирать данные о производительности веб-сайтов и браузеров. Обычно используется вместе с инструментальными средствами автоматизации, такими как Selenium или Watir. Proxy позволяет управлять поведением браузера, имитировать сетевой трафик и задержки, изменять HTTP запросы и ответы. К востребованной функциональности также можно отнести использование «черного» и «белого» списков, что позволяет, например, блокировать загрузку сторонних сайтов, не относящихся к тестированию Вашего веб-приложения, и тем самым повысить скорость тестов.
Также довольно часто BrowserMob используется для автоматизации доступа к сайтам, требующим Basic авторизацию.

Управлять прокси-сервером можно напрямую через Java интерфейс или через REST API. В этой статье мы будем рассматривать только интересующий нас Java интерфейс. Для того, чтобы подключить BrowserMob в проект нужно скачать библиотеку и добавить ее в проект, либо добавить соответствующую зависимость в pom.xml, если вы используете Maven:

		<dependency>
			<groupId>net.lightbody.bmp</groupId>
			<artifactId>browsermob-proxy</artifactId>
			<version>2.0-beta-8</version>
			<scope>test</scope>
		</dependency>

Если у Вас уже имеется подключенная в проект библиотека Selenium, то лучше исключить использование Selenium API, встроенного в BrowserMob. Но при этом учитывайте возможные несоответствия версий Selemium и BrowserMob:

		<dependency>
			<groupId>net.lightbody.bmp</groupId>
			<artifactId>browsermob-proxy</artifactId>
			<version>2.0-beta-8</version>
			<scope>test</scope>
			<exclusions>
				<exclusion>
					<groupId>org.seleniumhq.selenium</groupId>
					<artifactId>selenium-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

Java реализация BrowserMob представлена в виде набора классов, основной из которых net.lightbody.bmp.proxy.ProxyServer.
Пример запуска прокси-сервера с FirefoxDriver и сбора данных загрузки страницы:

import net.lightbody.bmp.core.har.Har;
import net.lightbody.bmp.proxy.ProxyServer;

import org.junit.Test;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;

public class ProxyServerTest {

    @Test
    public void testMobProxyServer() throws Exception {
        // запуск прокси сервера
        ProxyServer server = new ProxyServer(4444);
        server.start();

        // получение Selenium proxy
        Proxy proxy = server.seleniumProxy();

        // конфигурация FirefoxDriver для использования прокси
        DesiredCapabilities capabilities = new DesiredCapabilities();
        capabilities.setCapability(CapabilityType.PROXY, proxy);

        WebDriver driver = new FirefoxDriver(capabilities);

        // создание HAR с меткой "yandex.ru"
        server.newHar("yandex.ru");

        // открытие страницы
        driver.get("http://yandex.ru");

        // получение данных HAR
        Har har = server.getHar();

        // здесь будет обработка полученных данных

        driver.quit();
        server.stop();
    }
}

Вывод в консоль свидетельствует об успешном запуске и остановке прокси-сервера на 4444 порту:

HttpSer~ - Version Jetty/5.1.x
Contain~ - Started HttpContext[/,/]
SocketL~ - Started SocketListener on 0.0.0.0:4444
Contain~ - Started net.lightbody.bmp.proxy.jetty.jetty.Server@133321d6
Threade~ - Stopping Acceptor ServerSocket[addr=0.0.0.0/0.0.0.0,port=0,localport=4444]
SocketL~ - Stopped SocketListener on 0.0.0.0:4444
Contain~ - Stopped HttpContext[/,/]
Contain~ - Stopped net.lightbody.bmp.proxy.jetty.jetty.Server@133321d6
HAR

BrowserMob Proxy предоставляет полученную им информацию в HAR (HTTP Archive) формате. Этот формат используется инструментами мониторинга HTTP для выгрузки собранных данных. Фактически HAR формат представляет из себя JSON структуру данных в кодировке UTF-8, которую можно просматривать и анализировать использую различные HAR визуализаторы.

После того как в тесте мы получили данные HAR их можно сохранить физически в виде файла:

        // получение данных HAR
        Har har = server.getHar();

        // обработка полученных данных
        try {
            File file = new File("results\\Test.har");
            if (!file.exists()) {
                file.createNewFile();
            }
            FileOutputStream fos = new FileOutputStream(file);
            try {
                har.writeTo(fos);
            }
            finally {
                fos.close();
            }
        }
        catch (IOException e) {
            // обработка ошибки
            e.printStackTrace();
        }
        finally {
            driver.quit();
            server.stop();
        }

Обновив проект Вы увидите сохраненный файл Test.har в папке results (папка была предварительно создана перед запуском).
HAR file example
Полученный HAR файл содержит JSON данные, которые можно использовать как текстовую информацию, либо просмотреть в удобном представлении, используя один из существующих онлайн инструментов, например, HTTP Archive Viewer 2.0.15:
Web Perfomance Analyzer
Получить интересующую Вас информацию и поместить ее в собственный отчет можно и без сохранения HAR файла. Java класс net.lightbody.bmp.core.har.HarLog предоставляет набор методов для выборочного получения нужной информации:

        Har har = server.getHar();

        // получить информацию о браузере
        System.out.println(har.getLog().getBrowser().getName());
        System.out.println(har.getLog().getBrowser().getVersion());

        // список всех обработанных запросов
        for (HarEntry entry : har.getLog().getEntries()) {

            System.out.println(entry.getRequest().getUrl());
            // время ожидания ответа от сервера в миллисекундах
            System.out.println(entry.getTimings().getWait());
            // время чтения ответа от сервера в миллисекундах
            System.out.println(entry.getTimings().getReceive());
        }

Помимо сбора информации net.lightbody.bmp.proxy.ProxyServer позволяет манипулировать запросами и полученными ответами с помощью добавления интерсепторов запросов и ответов соответственно:

public void addRequestInterceptor(RequestInterceptor interceptor)
public void addResponseInterceptor(ResponseInterceptor interceptor)

Пример интеграции BrowserMob с драйверами ChromeDriver и InternetExplorerDriver:

public class ProxyServerTest {

    private static ProxyServer server;
    private static Proxy proxy;

    @BeforeClass
    public static void setUpProxy() throws Exception {
        server = new ProxyServer(4444);
        server.start();
        proxy = server.seleniumProxy();
    }

    @Before
    public void createNewHar() {
        server.newHar("yandex.ru");
    }

    /**
     * ChromeDriver
     */
    @Test
    public void testChromeDriver() throws Exception {
        ChromeOptions option = new ChromeOptions();
        option.addArguments("--proxy-server=localhost:" 
                                                + server.getPort());
        WebDriver driver = new ChromeDriver(option);

        driver.get("http://yandex.ru");

        driver.quit();
    }

    /**
     * InternetExplorerDriver
     */
    @Test
    public void testIEDriver() throws Exception {
        DesiredCapabilities capabilities = 
                                DesiredCapabilities.internetExplorer();
        capabilities.setCapability(CapabilityType.PROXY, proxy);
        capabilities.setCapability("ie.setProxyByServer", true);
        WebDriver driver = new InternetExplorerDriver(capabilities);

        driver.get("http://yandex.ru");

        driver.quit();
    }

    @After
    public void saveHAR() throws Exception {
        Har har = server.getHar();
        File file = new File("results\\" 
                         + har.getLog().getBrowser().getName() + ".har");
        if (!file.exists()) {
            file.createNewFile();
        }
        FileOutputStream fos = new FileOutputStream(file);
        try {
            har.writeTo(fos);
        }
        finally {
            fos.close();
        }
    }

    @AfterClass
    public static void stopProxyServer() throws Exception {
        server.stop();
    }
}
  • Нравится
  • Tweet

Опубликовано в Selenium - Помечено Selenium WebDriver
Рассказать всем Twitter Facebook Delicious StumbleUpon E-Mail
← Hibernate 4: UserType пользовательский тип данных (часть 2)
Selenium WebDriver: basic авторизация →

18 комментариев

  1. Vladislav's Gravatar Vladislav
    23.10.2013 at 10:35 | Permalink

    УРА!! Татьяна снова пишет в своем блоге!)) Спасибо за полезные статьи!

  2. Vitaliy's Gravatar Vitaliy
    06.01.2014 at 13:02 | Permalink

    +1 к предыдущему комментарию!
    Большое спасибо за статью!

    P.S. Может это и не важно, но у меня еклипс ругался по поводу содержания депенденси в пом файле из-за того что буква «i» в нижнем регистре в таких тегах как groupid и т.д.
    В общем, если это важно, то нужно подправить.

    • Tatyana's Gravatar Tatyana
      09.01.2014 at 09:41 | Permalink

      Да, это важно. Спасибо, что обратили внимание.

  3. Vitalik's Gravatar Vitalik
    15.01.2014 at 09:24 | Permalink

    Добрый день!
    Скопипастил Ваш пример, получил HAR, но вставив его в HTTP Archive Viewer 2.0.15 — вместо статистики по запросу во вкладке Preview получил:
    HAR Validation Sum of request timings doesn’t correspond to the total value: http://www.yandex.ru/ (request.time: 78 vs. sum: 79), request#: 1, parent page: yandex.ru
    HAR Validation Sum of request timings doesn’t correspond to the total value: http://yandex.st/lego/_/La6qi18Z8LwgnZdsAr1qy1GwCwo.gif (request.time: 73 vs. sum: 74), request#: 6, parent page: yandex.ru

    Подскажите пожалуйста, в чем проблема ?

    • Tatyana's Gravatar Tatyana
      15.01.2014 at 12:25 | Permalink

      Добрый день, такая ошибка возникает очень часто для HAR, сгенерированных в BrowserMob. К сожалению, решение проблемы не всегда одинаково для всех.
      Очень многим помогает установка нескольких секунд ожидания после вызова webdriver.get().

      • Vitalik's Gravatar Vitalik
        15.01.2014 at 13:27 | Permalink

        Спасибо за ответ, но не помогло. 🙁

  4. Dmitry's Gravatar Dmitry
    08.05.2014 at 10:27 | Permalink

    День добрый. Используем BrowserMod + WebDriver 2 для тестирования Web аналитики, столкнулись с тем, что в har не попадает https трафик. Есть ли какие-то решения что бы записывать https c помощью BrowserMob? (Вариант с Fiddler не очень удобен для нас)
    Спасибо.

    • Tatyana's Gravatar Tatyana
      13.05.2014 at 14:19 | Permalink

      Добрый день, для Selenium нужно устанавливать два прокси: и http, и https

      Proxy proxy = new Proxy();
      proxy.setHttpProxy(...);
      proxy.setSslProxy(...);
      

      Это если Вы используете BrowserMob отдельно.

      А при использовании метода seleniumProxy() все должно работать и так, он возвращает уже корректно настроенный прокси.

      • Dmitry's Gravatar Dmitry
        15.05.2014 at 11:32 | Permalink

        Спасибо за ответ. Столкнулись с такой ситуацией. Мы используем такой код:

        ProxyServer server = new ProxyServer(5015);
        server.start();
        server.setLocalHost(InetAddress.getByName(«127.0.0.1»));
        proxy = server.seleniumProxy();

        В данном случае в настройках браузера прописывается правильный хост и порт для Http/SSL.

        После этого Http страницы открываются нормально — трафик попадает в Har и его можно анализировать, но открыть Https страницы браузеру не удается , даже если принудительно указать:

        proxy.setHttpsProxy(«127.0.0.1:5015»);

        • Tatyana's Gravatar Tatyana
          16.05.2014 at 14:57 | Permalink

          Возможно проблема с сертификатами, тяжело так сказать почему не работает. Я пробовала открывать gmail (тоже https) — все открывается нормально и трафик записывается в har.

          • Dmitry's Gravatar Dmitry
            21.05.2014 at 12:13 | Permalink

            Возможно.
            Я так понимаю что selenium использует Cybervilian сертификат для работы с https. Могли бы вы уточнить какую версию selenium-server-standalone вы использовали для проверки?

          • Tatyana's Gravatar Tatyana
            27.05.2014 at 10:09 | Permalink

            Да Cybervilian используется как промежуточный сертификат.

            При использовании selenium api 2.41.0 проверка сертификатов работает через прокси для всех браузеров.

            А вот с удаленным запуском действительно есть некоторые проблемы (selenium-server-standalone 2.41.0). Remote firefox через прокси открывает большинство https сайтов, но некоторые выдают ошибку «К сертификату нет доверия, так как отсутствует цепочка сертификатов издателя» (Error code: sec_error_unknown_issuer). Remote chrome вроде бы работает с https более стабильно.

            Учитывая, что у вас доступен метод proxy.setHttpsProxy Вы используете устаревшую версию селениума, попробуйте обновиться до последней версии

  5. Alex's Gravatar Alex
    14.05.2014 at 14:56 | Permalink

    Ребята ктонить может объяснить в онлайн режиме с этим , я уже просто заманался искать вариант хоть один рабочий, и этот тоже соответвенно не работает и не запускает ничего (((

  6. Alexandr's Gravatar Alexandr
    05.03.2015 at 14:31 | Permalink

    Татьяна, добрый день. Не могли бы вы подсказать — вот эти операции?
    server.newHar(«somw har»);
    Har har = server.getHar();
    Надо выполнять для каждой страницы которая открывается в тесте?

    • Tatyana's Gravatar Tatyana
      14.03.2015 at 15:29 | Permalink

      Зависит от того, что Вы хотите получить в результате. Совсем не обязательно создавать новый Har для каждой страницы, но тогда Вы получите все данные в одном отчете.

  7. Александр's Gravatar Александр
    02.12.2015 at 12:17 | Permalink

    Фреймворки семейства xUnit — это основа основ автоматизированного тестирования. Они используются для организации и запуска тестов и сбора информации о результатах тестирования, то есть решают одну из ключевых задач автоматизации тестирования.

  8. Руслан's Gravatar Руслан
    04.12.2015 at 10:40 | Permalink

    Добрый день, скажите пожалуйста каким образом можно вытащить контент из респонса? в har файл записывается все но не само тело ответа, есть информация о размере ответа но как вытащить сам контент не пойму.. нашел там методы getContent() но возвращает null. я пробовал делать так —

    for (HarEntry entry : har.getLog().getEntries()) {
    System.out.println(entry.getResponse().getContent());
    }

  9. Алексей's Gravatar Алексей
    22.12.2015 at 11:36 | Permalink

    А как с помощью этой утилиты можно узнать время за которое была загружена страница?

Свежие записи

  • WebDriver и SSL Untrusted certificate
  • Видеозапись выполнения тестов Selenium
  • Selenium WebDriver: basic авторизация
  • BrowserMob Proxy + Selenium: автоматизация сбора данных о производительности
  • Hibernate 4: UserType пользовательский тип данных (часть 2)

Поиск

Рубрики

  • Hibernate ORM
  • SEO
  • Разное
  • Тестирование
    • JUnit
    • Selenium
    • Thucydides

Метки

Actions AJAX Alert AutoIt ChromeDriver Exceptions ExpectedConditions FindElement FirefoxDriver Hibernate InternetExplorerDriver Java Javascript Jenkins JUnit4 Maven PageFactory Page Object RemoteWebDriver Select Selenium IDE Selenium Server Selenium WebDriver switchTo Thucydides WebDriverWait XPath Автоматизированное тестирование база данных заработок в сети сеть Интернет скорость продвижения сайта статейное продвижение услуги продвижения

Реклама


Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.
Donec in mi a arcu cursus commodo non ut metus. Nunc id eros ut augue consequat tempus ut non ligula. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia Curae; Integer pretium, erat sit amet scelerisque euismod, purus lectus convallis dui, eget imperdiet sapien est ut magna. Nullam elementum, tortor vitae pulvinar mattis, orci neque porta tortor, a feugiat nisi lacus quis diam. Ut gravida augue id est rutrum elementum. Mauris eget felis dolor. Phasellus ante ante, porttitor sit amet lobortis ut, suscipit id neque. Fusce hendrerit dolor nec odio eleifend in auctor enim cursus. Nullam fermentum pretium risus, in hendrerit nulla cursus sit amet. Fusce eu tempus elit. Ut tortor velit, aliquam in ornare vel, feugiat sed nibh. Donec fringilla est id odio lacinia vulputate. Donec nulla urna, congue sit amet pretium non, dictum at orci. Fusce neque sem, fermentum eu tempus nec, mattis venenatis sem. Proin scelerisque velit tristique urna mattis adipiscing. Proin mattis faucibus facilisis. Integer non lacus ac ligula accumsan convallis quis molestie erat. Curabitur imperdiet vestibulum vulputate. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Mauris lacus ligula, hendrerit eget suscipit in, sollicitudin nec dui. Suspendisse euismod, lorem pretium gravida rhoncus, enim quam facilisis orci, nec volutpat nisi dolor id lacus. Proin dolor arcu, rutrum eget hendrerit vel, pharetra id elit. Nullam porta euismod suscipit. Pellentesque malesuada consequat sem, et auctor magna aliquam gravida. Nullam blandit dignissim iaculis. Suspendisse non diam nec augue scelerisque iaculis. Nam id dui sed lorem vulputate rhoncus eget eu tellus. In sit amet nisi nunc. Fusce sed aliquet sem. Aliquam sit amet metus metus.

Блог вебразработчика
Функциональное тестирование и продвижение сайтов

Яндекс.Метрика