public static void WriteResponse(ChromeResponse response)
        {
            string value = "null";
            if (response.Value != null)
                value = response.Value.ToString();
            string formattedMessage = string.Format("({0}) Response: Status Code: {1} - Value: ( {2} )\n", 
                DateTime.Now.ToString(), response.StatusCode.ToString(), value);
            
#if DEBUG
            //Console.WriteLine(formattedMessage);
#endif

            Debug.WriteLine(formattedMessage);
        }
        public ChromeResponse HandleResponse(ChromeCommand command, bool printConsoleMessages)
        {
            // Wait for a POST request to be pending from the Chrome extension.
            // Note that we need to leave the packet in the queue for the next
            // send message.

            DateTime timeout = DateTime.Now.AddSeconds(PacketTimeoutSeconds);
            browser.DialogInterrupted = false;

            using (DialogWatcher watcher = new DialogWatcher(browser))
            {
                while (DateTime.Now < timeout)
                {
                    lock (responseLock)
                    {
                        if (watcher.FoundDialog)
                        {
                            browser.DialogInterrupted = true;
                            break;
                        }

                        if (receivedResponse)
                            break;
                    }
                }
            }

            ChromeResponse response = new ChromeResponse();

            if (browser.DialogInterrupted)
            {
                response.StatusCode = StatusCode.SUCCESS;
                response.Value = "A JSDialog caused a timeout.";
                return response;
            }

            if (!receivedResponse)
            {
                throw new ChromeCommandTimedOutException(command.Command, PacketTimeoutSeconds);
            }

            // ExtensionRequestPacket packet = pendingRequestQueue.Peek();
            // If the page cannot be found, this gets index out of bounds
            ExtensionRequestPacket packet = pendingRequestQueue[0];

            // Parse the packet content, and deserialize from a JSON object.
            string responseString = ParseResponse(packet.Content);

            if (!string.IsNullOrEmpty(responseString))
            {
                response = JsonConvert.DeserializeObject<ChromeResponse>(responseString);

                if (response == null)
                    throw new ChromeException("No response was returned by the extension.");

                response.Value = response.Value ?? "";
            }

            string valueAsString = response.Value as string;
            if (valueAsString != null)
            {
                // First, collapse all \r\n pairs to \n, then replace all \n with
                // System.Environment.NewLine. This ensures the consistency of 
                // the values.
                response.Value = valueAsString.Replace("\r\n", "\n").Replace("\n", System.Environment.NewLine);
            }
            //Utilities.WriteToConsole(string.Format("Response was {0}", response.ToString()));

            if (printConsoleMessages)
            {
                Utilities.WriteResponse(response);
            }

            switch (response.StatusCode)
            {
                case StatusCode.BADCOMMAND:
                case StatusCode.BADJAVASCRIPT:
                case StatusCode.CONTENTSCRIPTCONNECTFAIL:
                case StatusCode.CONTENTSCRIPTERROR:
                case StatusCode.ELEMENTNOTVISIBLE:
                case StatusCode.INVALIDELEMENTSTATE:
                case StatusCode.NOSUCHFRAME:
                case StatusCode.STALEELEMENTREFERENCE:
                case StatusCode.UNHANDLEDERROR:
                    throw new ChromeException(response.Value.ToString());
            }

            return response;
        }