Digging into
WebDriver today an interesting question popped up. How does
WebDriver interact with browser?! Only thing I knew that it was using
JNI to connect to native DLL’s.
So I decided to attach my Eclipse debugger to WebDriver sources and execute a WebDriver Hello World test. The first thing I noticed was this interesting packet being sent:
{
"response": "Unable to locate element: {"method":"id","selector":"q"}",
"context": "{711c552c-4fac-473c-83ce-dc767ff37ff2} ",
"commandName": "findElement",
"isError": true
}
Which is nothing else but JSON. This increased even more my curiosity. Well, JSON being used by WebDriver to sent messages to browser, then who is the server and who is the client? What is the protocol? I ended up finding the answer here
JsonWireProtocol.
And the FirefoxDriver source class too:
public class FirefoxDriver implements WebDriver ... {
protected Object executeCommand(Class<RuntimeException> throwOnFailure,
Command command) {
Response response = extension.sendMessageAndWaitForResponse(
throwOnFailure, command);
context = response.getContext();
response.ifNecessaryThrow(throwOnFailure);
......
So what is actually happening is:
1. When a WebDriver test is being created and executed.
2. This test makes an HTTP call to Firefox (or any browser) using JNI (I am still puzzled here how this exactly works)
2. And the listener (the server) is the actual browser. Quite confusing eh?
3. The listener(the browser) receives the HTTP request from WebDriver and responds back with a JSON HTTP packet.
4. WebDriver digest the response packet and either calls back the command OR fails the execution.
2 Comments until now
JNA (and, before that, JNI) is only used with the IE driver in webdriver. The HTTP requests are sent to Firefox (and any instance of webdriver which isn’t running in the same process as your test) using the Jakarta HTTP Client as UTF-8 encoded JSON. If we wanted to, we could use an HttpConnection from the JDK, but the httpclient is used elsewhere and is far more robust.
The reason for this design is that it allows us to support other languages (such as Ruby, Python and C#) with minimal effort. After all, almost every language has libraries for both HTTP and JSON
Out of curiosity, could you elaborate why didn’t you use HTTP/JSON protocol for IE, but JNA was preferred?
Add your Comment!