When testing XPages or other web applications, you may want to have more control about the requests and responses during the JUnit testing. For example, if you want to test if a specific HTTP header exists in the response, or if it is required to add some HTTP headers to the request. But you cannot doe this out of the box with Selenium. Instead, you have to add a proxy to the Firefox controller, which then gives you a handle to the HTTP data and allows you to control the flow.
An good solution for this is BrowserMob Proxy, which can be used by adding the required dependency to your Maven pom.xml:
<dependency>
<groupId>net.lightbody.bmp</groupId>
<artifactId>browsermob-proxy</artifactId>
<version>2.0.0</version>
</dependency>
[This is version 2.0.0, the latest stable version]
The proxy runs locally on the specified port as soon the JUnit test starts and ends automatically after finishing the tests. In order to accomplish this, the setUp method has to be modified:
// start the proxy (listens on port 4444)
server = new ProxyServer(4444);
server.start();
// get the Selenium proxy object
Proxy proxy = server.seleniumProxy();
// configure it as a desired capability
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.PROXY, proxy);
Now, the proxy setting must be added to the Firefox driver:
driver = new FirefoxDriver(capabilities);
In the test class, three global variables must be defined; these are giving you access to the proxy server and latest the request and response during testing:
private ProxyServer server; private BrowserMobHttpResponse httpResponse;
private BrowserMobHttpRequest httpRequest;
With the help of a ResponseInterceptor, the httpResponse property is always filled with the latest response. To initialize it, an anonymous class in the setUp method has to be created:
// add a response interceptor
ResponseInterceptor interceptor = new ResponseInterceptor() {
public void process(BrowserMobHttpResponse response, Har har) {
httpResponse = response;
}
};
// add the interceptor to the server
server.addResponseInterceptor(interceptor);
For the RequestInterceptor it is the same procedure:
// add a request interceptor
RequestInterceptor requestInterceptor = new RequestInterceptor() {
public void process(BrowserMobHttpRequest request, Har har) {
httpRequest = request;
}
};
server.addRequestInterceptor(requestInterceptor);
Now, it is possible to use it in a JUnit test:
@Test
public void testDemo() throws Exception {
// add a request header
server.addHeader("X-FOO", "BAR");
// load the page
reloadPage();
// TEST RESPONSE STATUS
HttpResponse httpRawResponse = httpResponse.getRawResponse();
assertTrue("HTTP/1.1 200 OK".equals(httpRawResponse.getStatusLine()
.toString()));
// TEST SERVER HEADER
assertTrue( "Lotus-Domino".equals( httpResponse.getHeader("Server")) );
}
The Browsermob-proxy has a lot of additional features: You can modify the allowed speed for up- and downstreams, use basic authentication, upload files, etc.