BrowserMob Proxy is an open source tools which is used to capture performance data for a web applications in an HAR format. It also allows to manipulate browser behavior and traffic, such as simulating network traffic, rewriting HTTP requests and responses etc.
Manually, we can monitor performance of a web application by using browser tools like Firebug or Developers Tools etc. BrowserMob proxy helps us to capture client side performance data for a web application using Selenium WebDriver automated tests. In this example, we will configure BrowserMob proxy for Selenium WebDriver and capture the performance data in HAR format.
HTTP Archive format or HAR is a JSON-formatted archive file format for logging of a web browser's interaction with a web application.
In the below example, we will be taking TestNG annotations help to start and stop proxy server before the tests and close after all tests completes execution. BrowserMob Proxy makes it easy to use a proxy in Selenium tests. You can look at the sample snippet provided by BrowserMob GitHub.
// start the proxy
BrowserMobProxy proxy = new BrowserMobProxyServer();
proxy.start(0);
// get the Selenium proxy object
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
// configure it as a desired capability
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
// start the browser up
WebDriver driver = new FirefoxDriver(capabilities);
// enable more detailed HAR capture, if desired (see CaptureType for the complete list)
proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
// create a new HAR with the label "yahoo.com"
proxy.newHar("yahoo.com");
// open yahoo.com
driver.get("http://yahoo.com");
// get the HAR data
Har har = proxy.getHar();
Below are the methods that we use to start and stop BrowserMobProxy server. If you want to start server on specific port, we need to pass the port value
proxy.start() - Starts the proxy on port 0.
proxy.start(int port) - Starts the proxy on the specified port. Ff the specified proxy has already been started, it throws 'java.lang.IllegalStateException'.
proxy.stop() - shutdown the proxy server gracefully
We can use any of the below methods to collect performance data in an HAR format based on the requirement
Har newHar() - Creates a new HAR file with the default page name.
Har newHar(String initialPageRef) - Creates a new HAR file with the specified 'initialPageRef' as the page name and page title.
Har newHar(String initialPageRef, String initialPageTitle) - Creates a new HAR file with the specified 'initialPageRef' page name and 'initialPageTitle' page title.
You have to download BrowserMob Proxy and make sure that all the dependencies are imported in to the project along with selenium server. Once you unzip browsermob zip folder, Navigate to the lib directory and add. Latest released version is 2.1.2 (July 23, 2016). For more information on the new release, you can visit the BrowserMob Proxy page on Github
package com.easy;
import java.io.File;
import java.io.IOException;
import org.openqa.selenium.By;
import org.openqa.selenium.Proxy;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
import org.testng.annotations.AfterTest;
import org.testng.annotations.BeforeTest;
import org.testng.annotations.Test;
import net.lightbody.bmp.BrowserMobProxy;
import net.lightbody.bmp.BrowserMobProxyServer;
import net.lightbody.bmp.client.ClientUtil;
import net.lightbody.bmp.core.har.Har;
import net.lightbody.bmp.proxy.CaptureType;
public class BrowserMobExample {
String driverPath = "F:/drivers/chromedriver/";
String sFileName = "F:/SeleniumEasy.har";
public WebDriver driver;
public BrowserMobProxy proxy;
@BeforeTest
public void setUp() {
// start the proxy
proxy = new BrowserMobProxyServer();
proxy.start(0);
//get the Selenium proxy object - org.openqa.selenium.Proxy;
Proxy seleniumProxy = ClientUtil.createSeleniumProxy(proxy);
// configure it as a desired capability
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, seleniumProxy);
//set chromedriver system property
System.setProperty("webdriver.chrome.driver", driverPath+"chromedriver.exe");
driver = new ChromeDriver(capabilities);
// enable more detailed HAR capture, if desired (see CaptureType for the complete list)
proxy.enableHarCaptureTypes(CaptureType.REQUEST_CONTENT, CaptureType.RESPONSE_CONTENT);
// create a new HAR with the label "seleniumeasy.com"
proxy.newHar("seleniumeasy.com");
// open seleniumeasy.com
driver.get("https://seleniumeasy.com/");
}
@Test
public void testCaseOne() {
System.out.println("Navigate to selenium tutorials page");
driver.findElement(By.linkText("Selenium"));
}
@AfterTest
public void tearDown() {
// get the HAR data
Har har = proxy.getHar();
// Write HAR Data in a File
File harFile = new File(sFileName);
try {
har.writeTo(harFile);
} catch (IOException ex) {
System.out.println (ex.toString());
System.out.println("Could not find file " + sFileName);
}
if (driver != null) {
proxy.stop();
driver.quit();
}
}
}
If you're using Maven, add below dependency to your pom.xml file along with Selenium and TestNG dependencies. MVNRepository - BrowserMob Proxy Parent Project
<dependency>
<groupId>net.lightbody.bmp</groupId>
<artifactId>browsermob-core</artifactId>
<version>2.1.2</version>
<scope>test</scope>
</dependency>
All the network traffic during this test will be captured and saved to the seleniumeasy.har file (specified location) and can be viewed by a HAR Viewer, some of the har viewer links are provided below.
Below is the HAR file generated :
Har Viewer By Software is hard Har Viewer
Har Viewer by Ericduran.github
By Google Chrome Ad on HTTP Archive Viewer
Hope this helps you. Let me know if you face any issues configuring BrowserMob Proxy with Selenium.
- ‹ Working with Shadow DOM Elements using Webdriver
- Execute your Automation Tests in the Cloud using Selenium ›
Comments
Reply
I got your script where i can get those scripts and if you have newsletter sign up, it can be useful for me to know about the concepts of selenium.
Manipulating browser behavior & trafic
Hello,
How can we Manipulate browser behavior & traffic by using BrowserMob Proxy ?
Not able to run Browsermob+selenium tests in cloud
Hi,
With the above setup i was able to capture content in HAR format when i run my tests locally but when tried to run tests on a VM or on cloud, the browser opens up but does not load anything because there will be no internet connection for that session. Reason being, i am opening up a port locally and since tests are running in cloud, it will try to access this port on cloud which will be connected to a different network. How do we resolve this ?
browsermobproxy in TESTNG in @BeforeSuite, @AfterSuite
I want to you browsermobproxy in TESTNG such that in @BeforeSuite annotation/method , it will get started and in @AfterSuite annotation/ method, it will get closed.
How can I meet my requirement ?
Add new comment