public void DisplayResults()
            {
                SeleniumLog log = SeleniumLog.Instance();

                foreach (Result result in Results)
                {
                    if (result.result == true)
                    {
                        log.Green().Pass().WriteLine(result.cummulative_xpath + "  - XPath Found - " + result.matches + " matches.");
                    }
                    else
                    {
                        log.Red().Fail().WriteLine(result.cummulative_xpath + "  - XPath Not Found!");
                    }
                }
            }
        public SeleniumLogEventListener(IWebDriver driver)
            : base(driver)
        {
            SeleniumLog log = SeleniumLog.Instance();

            FindingElement += new EventHandler <FindElementEventArgs>((sender, findElementEventArgs) =>
            {
                log.Indent();
                log.WriteLine("Finding Element: " + findElementEventArgs.FindMethod);

                string[] FindMethodStr = findElementEventArgs.FindMethod.ToString().Split(':');
                _by      = FindMethodStr[0].Split('.')[1].Trim();
                _locator = FindMethodStr[1].Trim();

                if (_by == "XPath")
                {
                    XPathTest.Test(driver, _locator);
                }

                log.Unindent();
            });

            FindElementCompleted += new EventHandler <FindElementEventArgs>((sender, findElementEventArgs) =>
            {
                log.Indent();
                log.Green().WriteLine("... Element Found! Elapsed time 10 msec.");
                log.Unindent();
            });

            ElementClicking += new EventHandler <WebElementEventArgs>((sender, webElementEventArgs) =>
            {
                //string nameOfParam1 = MemberInfoGetting.GetMemberName(() => webElementEventArgs.Element);

                log.Indent();
                //log.Orange().WriteLine("Clicking Element: " + webElementEventArgs.Element);
                log.WriteLine("Clicking Element: " + _by + " " + _locator);
                log.Unindent();
            });

            ElementClicked += new EventHandler <WebElementEventArgs>((sender, webElementEventArgs) =>
            {
                //string nameOfParam1 = MemberInfoGetting.GetMemberName(() => webElementEventArgs.Element);
                log.Indent();
                log.Green().WriteLine("... Click Success!  Elapsed time: 10 msec ");
                log.Unindent();
            });


            ElementValueChanging += new EventHandler <WebElementEventArgs>((sender, webElementEventArgs) =>
            {
                int level = log.IndentLevel;
                log.Indent();
                log.WriteLine("Typing in Edit box ...");

                if (!string.IsNullOrEmpty(_keyInput))
                {
                    log.WriteLine(" [" + _keyInput + "]");
                }
                log.Unindent();
            });

            ElementValueChanged += new EventHandler <WebElementEventArgs>((sender, webElementEventArgs) =>
            {
                log.Indent();
                log.Green().WriteLine("... Successfully entered in Edit box [" + webElementEventArgs.Element.GetAttribute("value") + "]");
                log.Indent();

                if (!string.IsNullOrEmpty(_keyInput))
                {
                    //log.WriteLine("Input was: " + _keyInput);
                }
            });



            ExceptionThrown += new EventHandler <WebDriverExceptionEventArgs>((sender, webDriverExceptionEventArgs) =>
            {
                log.Indent();
                log.Red().WriteLine("Exception Thrown: " + webDriverExceptionEventArgs.ThrownException);

                log.Red().WriteLine("Diagnostics: Expand to see which part of XPath failed.");
                log.Indent();
                XPathTest.DisplayResults();
                log.Unindent();
                log.Unindent();
            });


            Navigating += new EventHandler <WebDriverNavigationEventArgs>((sender, webDriverNavigationEventArgs) =>
            {
                log.Indent();
                log.WriteLine("Navigating To: " + webDriverNavigationEventArgs.Url);
                log.Unindent();
            });

            Navigated += new EventHandler <WebDriverNavigationEventArgs>((sender, webDriverNavigationEventArgs) =>
            {
                log.Indent();
                log.Green().WriteLine("... Navigation Success! Elapsed time 30 msec");
                log.Unindent();
            });



            NavigatingBack += new EventHandler <WebDriverNavigationEventArgs>((sender, webDriverNavigationEventArgs) =>
            {
                log.Indent();
                log.WriteLine("Navigating Back: " + webDriverNavigationEventArgs.Url);
                log.Unindent();
            });

            NavigatedBack += new EventHandler <WebDriverNavigationEventArgs>((sender, webDriverNavigationEventArgs) =>
            {
                log.Indent();
                log.Green().WriteLine("... Navigate Back Success! Elapsed time 20 msec");
                log.Unindent();
            });

            NavigatingForward += new EventHandler <WebDriverNavigationEventArgs>((sender, webDriverNavigationEventArgs) =>
            {
                log.Indent();
                log.WriteLine("Navigating Forward: " + webDriverNavigationEventArgs.Url);
                log.Unindent();
            });

            NavigatedForward += new EventHandler <WebDriverNavigationEventArgs>((sender, webDriverNavigationEventArgs) =>
            {
                log.Indent();
                log.Green().WriteLine("... Navigate Forward Success! Elapsed time 30 msec.");
                log.Unindent();
            });


            ScriptExecuting += new EventHandler <WebDriverScriptEventArgs>((sender, webDriverScriptEventArgs) =>
            {
                log.Indent();
                log.WriteLine("Script Executing: " + webDriverScriptEventArgs.Script);
                log.Unindent();
            });


            ScriptExecuted += new EventHandler <WebDriverScriptEventArgs>((sender, webDriverScriptEventArgs) =>
            {
                log.Indent();
                log.Green().WriteLine("... Script Executed Successfully! Elapsed time 10 msec");
                log.Unindent();
            });
        }
        private bool ManageCustomDataStructure(string argumentName, object arg, int elem_counter = -1, int type = -1, string comment = "")
        {
            SeleniumLog log = SeleniumLog.Instance();

            log.SaveIndent("ManageCustomDataStructure");
            //log.Purple().WriteLine("ManageCustomDataStructure()");
            //log.Indent();

            // Display Dictionary and Sorted List values
            if (arg == null)
            {
                if (log.Config.FunctionTrace_DisplayNullInputs == true)
                {
                    log.Gray().WriteLine(string.Format("{0} {1} : [NULL]", argumentName, elem_counter));
                }
                log.RestoreIndent("ManageCustomDataStructure");
                return(false);
            }

            if (CheckParameterType.CheckIfDictionary(arg) || CheckParameterType.CheckIfSortedList(arg))
            {
                DispalyInformation(argumentName: argumentName, elem_counter: elem_counter, arg: arg);
                log.RestoreIndent("ManageCustomDataStructure");
                return(true);
            }
            // Display HashTable values
            else if (CheckParameterType.CheckIfHashTable(arg))
            {
                DispalyInformation(argumentName: argumentName, elem_counter: elem_counter, arg: arg);
                log.RestoreIndent("ManageCustomDataStructure");
                return(true);
            }
            // Display Enumerable values
            else if (CheckParameterType.CheckIfEnumerable(arg))
            {
                DispalyInformation(argumentName: argumentName, elem_counter: elem_counter, arg: arg);
                log.RestoreIndent("ManageCustomDataStructure");
                return(true);
            }
            else if (CheckParameterType.CheckIfCustomType(arg.GetType()))
            {
                var properties = CheckParameterType.GetPublicProperties(arg);

                //Console.WriteLine(argumentName + ":");

                //log.SaveIndent("_______CustomType1________");
                //log.Red().WriteLine("type: " + type + " argumentName - " + argumentName + " : count = " + elem_counter);
                if (type == 4)
                {
                    //log.Red().WriteLine("30 type 4 : " + comment);
                    log.Purple().WriteLine(comment);
                    log.Indent();
                }

                //log.Indent();
                if (properties.Any())
                {
                    log.SaveIndent("_______CustomType1________");

                    //log.Green("type " + type + "  properties.Any(): " + argumentName + " " + elem_counter + " :");
                    log.Green(argumentName + " " + elem_counter + " :");
                    int m = 0;
                    foreach (PropertyInfo property in properties)
                    {
                        //log.SaveIndent("_______CustomType1________");
                        //log.Blue().WriteLine(argumentName + ":");
                        //log.Indent();

                        var propertyValue = property.GetValue(arg, null) ?? "null";
                        //DispalyInformation(property.Name, propertyValue);
                        DispalyInformation(argumentName: property.Name, elem_counter: m, arg: propertyValue);
                        m++;

                        //log.RestoreIndent("_______CustomType1________");
                    }
                    log.RestoreIndent("_______CustomType1________");
                }

                var fields = CheckParameterType.GetPublicFields(arg);

                if (fields.Any())
                {
                    if (debug)
                    {
                        log.Green("37 type " + type + "  fields.Any(): " + argumentName + " " + elem_counter + " :");
                    }
                    else
                    {
                        log.Purple(argumentName + " " + elem_counter + " :");
                    }

                    log.SaveIndent("_______FieldsAny______");
                    log.Indent();
                    int k = 0;
                    foreach (FieldInfo field in fields)
                    {
                        log.SaveIndent("_______CustomType2________");
                        //log.Indent();

                        var fieldValue = field.GetValue(arg) ?? "null";
                        //DispalyInformation(field.Name, fieldValue);
                        DispalyInformation(argumentName: field.Name, elem_counter: k, arg: fieldValue);
                        k++;
                        log.RestoreIndent("_______CustomType2________");
                    }
                    //log.Red().WriteLine("loop 2 done");
                    log.RestoreIndent("_______FieldsAny______");
                }
                log.RestoreIndent("ManageCustomDataStructure");
                return(true);
            }

            //Console.WriteLine(string.Format("{0}:{1}", argumentName, arg));
            if (type == 1)
            {
                if (debug)
                {
                    log.Purple().WriteLine(string.Format("100 type" + type + " {0} [{1}]", argumentName, arg));
                }
                else
                {
                    log.Purple().WriteLine(string.Format("{0} [{1}]", argumentName, arg));
                }
            }
            else if (type == 2)
            {
                if (debug)
                {
                    log.Purple().WriteLine(string.Format("101 type {0}: key [{1}] value [{2}]", type, argumentName, arg));
                }
                else
                {
                    log.Purple().WriteLine(string.Format("key [{1}] value [{2}]", type, argumentName, arg));
                }
            }
            else if (type == 3)
            {
                if (debug)
                {
                    log.Purple().WriteLine(string.Format("102 type" + type + " [{0}]", arg));
                }
                else
                {
                    log.Purple().WriteLine(string.Format("[{0}]", arg));
                }
            }
            else if (type == 4)
            {
                // not a data structure, so don't parse
                if (debug)
                {
                    log.Purple().WriteLine(string.Format("103 type" + type + " {0} [{1}]", argumentName, arg));
                }
                else
                {
                    log.Purple().WriteLine(string.Format("{0} [{1}]", argumentName, arg));
                }
                //return false;
            }
            log.RestoreIndent("ManageCustomDataStructure");
            return(false);
        }