BrowserMob Proxy is a utility which is used for capturing HTTP traffic and performance data from the browser. BrowserMob-Proxy adds in essential missing capabilities such as checking HTTP status codes and injecting headers for HTTP Basic Auth. Web Perfomance data can be manually captured by other tools like Firebug or Developers Tools. Using BrowserMob Proxy we can capture perfonace data in HAR format while running automated tests. There is lots of food to learn about BrowserMob on thier official website.
In this article, we will see how to integrate BrowserMob Proxy with Behat. In order to get started we need to install PHPBrowserMob package.
PHPBrowserMob
1 2 3 |
$ sudo pear channel-discover element-34.github.com/pear $ sudo pear install -f element-34/PHPBrowserMobProxy $ sudo pear install -f element-34/Requests |
Download latest version of the BrowserMob Proxy from the site. You can launch BrowserMob proxy like this
1 2 3 |
$ cd browsermob-proxy-2.0-beta-6/ $ cd bin $ sh browsermob-proxy -port 9090 |
You will see something like this:
1 2 3 4 5 |
$ sh browsermob-proxy -port 9090 INFO 10/30 21:29:50 o.b.p.Main - Starting BrowserMob Proxy version 2.0-beta-6 INFO 10/30 21:29:51 o.e.j.u.log - jetty-7.3.0.v20110203 INFO 10/30 21:29:51 o.e.j.u.log - started o.e.j.s.ServletContextHandler{/,null} INFO 10/30 21:29:52 o.e.j.u.log - Started SelectChannelConnector@0.0.0.0:9090 |
This means, BrowserMob Proxy is running correcrtly.
Download and start selenium version 2.25.0. Note that, proxy won’t work for some version of selenium server. Better Download latest.
1 |
$ java -jar selenium-server-standalone-2.25.0.jar |
Now, We need to install Behat by following official doc Or just follow my previous post on Behat installtion with composer.
1 2 3 4 |
$ sudo mkdir Behat-BrowserMob $ sudo chmod -R 777 Behat-BrowserMob $ cd Behat-BrowserMob/ $ behat --init |
Now create a feature file for exporting the performance data in the HAR format.
1 2 3 4 5 6 7 8 9 10 11 12 |
$ sudo vim BehatBrowserMob.feature Feature: BrowserMob Proxy with Behat In order to check website performance As a automated tester I need to see network traffic captured in the HAR format @javascript Scenario: Behat Bowsermob Given I setup BrowserMobProxy And I Navigate to "http://www.facebook.com/" When I export HAR Then I should see network traffic in the HAR file |
You need to include ‘PHPWebDriver‘ and ‘PHPBrowserMobProxy‘
We can implement the feature using following code :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 |
<?php use BehatBehatContextClosuredContextInterface, BehatBehatContextTranslatedContextInterface, BehatBehatContextBehatContext, BehatBehatExceptionPendingException; use BehatGherkinNodePyStringNode, BehatGherkinNodeTableNode; use BehatMinkExtensionContextMinkContext; require_once __DIR__ . '/PHPBrowserMobProxy/Client.php'; require_once __DIR__ . '/php-webdriver/PHPWebDriver/WebDriver.php'; require_once __DIR__ . '/php-webdriver/PHPWebDriver/WebDriverProxy.php'; require_once 'PHPUnit/Framework/Assert/Functions.php'; require_once 'PHPUnit/Autoload.php'; /** * Features context. */ class FeatureContext extends BehatContext { protected static $driver; protected static $BrowserMob; protected static $BrowserMobSession; public $data; /** * Initializes context. * Every scenario gets it's own context object. * * @param array $parameters context parameters (set them up through behat.yml) */ public function __construct(array $parameters) { } /** * @BeforeScenario */ public function cleanup() { $HARFile = "/tmp/BROWSERMOBHAR.php"; if (file_exists($HARFile)) { echo "The file $HARFile exists, I am going to delete it n"; unlink($HARFile); } } /** * @Given /^I setup BrowserMobProxy$/ */ public function iSetupBrowsermobproxy() { self::$driver = new PHPWebDriver_WebDriver(); self::$BrowserMob = new PHPBrowserMobProxy_Client("localhost:9090"); $additional_capabilities = array(); $webDriverProxy = new PHPWebDriver_WebDriverProxy(); self::$BrowserMob->new_har("google"); $webDriverProxy->httpProxy = self::$BrowserMob->url; $webDriverProxy->add_to_capabilities($additional_capabilities); $this->session = self::$driver->session('firefox', $additional_capabilities); } /** * @Given /^I Navigate to "([^"]*)"$/ */ public function iNavigateTo($url) { $this->session->open($url); } /** * @When /^I export HAR$/ */ public function iExportHar() { file_put_contents("/tmp/BROWSERMOBHAR.php", var_export(self::$BrowserMob->har, true)); } /** * @Then /^I should see network traffic in the HAR file$/ */ public function iShouldSeeNetworkTrafficInTheHarFile() { assertFileExists('/tmp/BROWSERMOBHAR.php'); } } |
Now, run ‘behat’ and watch the test running in the Browser. You will find data stored in the ‘/tmp/BROWSERMOBHAR’ file. You can use HAR viewer to see performance data in fancy way !
There are number of possibilities you can use this data. Here is best article which describe use of HAR file.
- Calculate Load time.
- Set/Get HTTP Headers during your tests
- Capture performance data with HAR files.
- Simulate network traffic and latency
- Rewrite HTTP requests and respones
SourcCode on GitHub:
Source Code is available on GitHub repo ‘Behat-BrowserMobProxy‘ . Just give it a try !
Final Thoughts:
Combination of Behat, WebDriver and BrowserMob Proxy can be used for capturing the network trafic while running automated tests. We can use HAR files as per our need eg. Calculate Page load times, Page performance analysis etc etc..