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 файл содержит JSON данные, которые можно использовать как текстовую информацию, либо просмотреть в удобном представлении, используя один из существующих онлайн инструментов, например, HTTP Archive Viewer 2.0.15:
Получить интересующую Вас информацию и поместить ее в собственный отчет можно и без сохранения 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(); } }
УРА!! Татьяна снова пишет в своем блоге!)) Спасибо за полезные статьи!
+1 к предыдущему комментарию!
Большое спасибо за статью!
P.S. Может это и не важно, но у меня еклипс ругался по поводу содержания депенденси в пом файле из-за того что буква «i» в нижнем регистре в таких тегах как groupid и т.д.
В общем, если это важно, то нужно подправить.
Да, это важно. Спасибо, что обратили внимание.
Добрый день!
Скопипастил Ваш пример, получил 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
Подскажите пожалуйста, в чем проблема ?
Добрый день, такая ошибка возникает очень часто для HAR, сгенерированных в BrowserMob. К сожалению, решение проблемы не всегда одинаково для всех.
Очень многим помогает установка нескольких секунд ожидания после вызова
webdriver.get()
.Спасибо за ответ, но не помогло. 🙁
День добрый. Используем BrowserMod + WebDriver 2 для тестирования Web аналитики, столкнулись с тем, что в har не попадает https трафик. Есть ли какие-то решения что бы записывать https c помощью BrowserMob? (Вариант с Fiddler не очень удобен для нас)
Спасибо.
Добрый день, для Selenium нужно устанавливать два прокси: и http, и https
Это если Вы используете BrowserMob отдельно.
А при использовании метода seleniumProxy() все должно работать и так, он возвращает уже корректно настроенный прокси.
Спасибо за ответ. Столкнулись с такой ситуацией. Мы используем такой код:
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»);
Возможно проблема с сертификатами, тяжело так сказать почему не работает. Я пробовала открывать gmail (тоже https) — все открывается нормально и трафик записывается в har.
Возможно.
Я так понимаю что selenium использует Cybervilian сертификат для работы с https. Могли бы вы уточнить какую версию selenium-server-standalone вы использовали для проверки?
Да 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 Вы используете устаревшую версию селениума, попробуйте обновиться до последней версии
Ребята ктонить может объяснить в онлайн режиме с этим , я уже просто заманался искать вариант хоть один рабочий, и этот тоже соответвенно не работает и не запускает ничего (((
Татьяна, добрый день. Не могли бы вы подсказать — вот эти операции?
server.newHar(«somw har»);
Har har = server.getHar();
Надо выполнять для каждой страницы которая открывается в тесте?
Зависит от того, что Вы хотите получить в результате. Совсем не обязательно создавать новый Har для каждой страницы, но тогда Вы получите все данные в одном отчете.
Фреймворки семейства xUnit — это основа основ автоматизированного тестирования. Они используются для организации и запуска тестов и сбора информации о результатах тестирования, то есть решают одну из ключевых задач автоматизации тестирования.
Добрый день, скажите пожалуйста каким образом можно вытащить контент из респонса? в har файл записывается все но не само тело ответа, есть информация о размере ответа но как вытащить сам контент не пойму.. нашел там методы getContent() но возвращает null. я пробовал делать так —
for (HarEntry entry : har.getLog().getEntries()) {
System.out.println(entry.getResponse().getContent());
}
А как с помощью этой утилиты можно узнать время за которое была загружена страница?