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.