public static DirectUIControl GetDirectUIControl(Control control, string dynamicVariable, int waitTime)
 {
     if (control.ParentControl == "AppWindow")
     {
         DirectUIControl directUIControl = new DirectUIControl(xamlAppWindow);
         foreach (string key in control.SearchProperties.Keys)
         {
             directUIControl.SearchProperties.Add(key, control.SearchProperties[key]);
         }
         directUIControl.WindowTitles.Add(windowName);
         return directUIControl;
     }
     else
     {
         DirectUIControl directUIControl = new DirectUIControl(GetDirectUIControl(PopulateControl(control.ViewName, control.ParentControl, dynamicVariable), dynamicVariable, waitTime));
         foreach (string key in control.SearchProperties.Keys)
         {
             directUIControl.SearchProperties.Add(key, control.SearchProperties[key]);
         }
         directUIControl.WindowTitles.Add(windowName);
         return directUIControl;
     }
 }
 /// <summary>
 /// Gets text of available control on screen
 /// </summary>
 /// <param name="viewName"></param>
 /// <param name="controlName"></param>
 /// <param name="waitTime"></param>
 /// <param name="dynamicVariable"></param>
 /// <returns>string:control text</returns>
 public static string GetControlText(string viewName, string controlName, int waitTime = WaitTime.DefaultWaitTime, string dynamicVariable = "")
 {
     Logger.InsertLogLine("Get Control text - Control: " + controlName + " in View : " + viewName);
     Control control = PopulateControl(viewName, controlName, dynamicVariable);
     if (control.ControlZone == "Native")
     {
         xamlControl = GetXamlControl(control, dynamicVariable, waitTime);
         return xamlControl.GetProperty(XamlControl.PropertyNames.Name).ToString();
     }
     else if (control.ControlZone == "Web")
     {
         htmlControl = GetHtmlControl(control, dynamicVariable, waitTime);
         return htmlControl.GetProperty(HtmlControl.PropertyNames.InnerText).ToString();
     }
     else if (control.ControlZone == "DirectUI")
     {
         directUIControl = GetDirectUIControl(control, dynamicVariable, waitTime);
         directUIControl.WaitForControlExist(waitTime);
         return directUIControl.GetProperty(DirectUIControl.PropertyNames.Name).ToString();
     }
     else
     {
         return "controlzone is not identified";
     }
 }
        /// <summary>
        /// Get width of particular control
        /// </summary>
        /// <param name="viewName"></param>
        /// <param name="controlName"></param>
        /// <param name="waitTime"></param>
        /// <param name="dynamicVariable"></param>
        /// <returns>int control width</returns>
        public static int GetControlWidth(string viewName, string controlName, int waitTime = WaitTime.DefaultWaitTime, string dynamicVariable = "")
        {
            Logger.InsertLogLine("Get Control Width - Control: " + controlName + " in View : " + viewName);
            int ControlWidth = 0;
            Control control = PopulateControl(viewName, controlName, dynamicVariable);
            if (control.ControlZone == "Native")
            {
                xamlControl = GetXamlControl(control, dynamicVariable, waitTime);
                xamlControl.WaitForControlExist(waitTime);
                ControlWidth = xamlControl.Width;
            }

            else if (control.ControlZone == "Web")
            {
                htmlControl = GetHtmlControl(control, dynamicVariable, waitTime);
                ControlWidth = htmlControl.Width;
            }
            else if (control.ControlZone == "DirectUI")
            {
                directUIControl = GetDirectUIControl(control, dynamicVariable, waitTime);
                ControlWidth = directUIControl.Width;
            }
            return ControlWidth;
        }
        /// <summary>
        /// Gets controls in bitmap for comparison
        /// </summary>
        /// <param name="viewName"></param>
        /// <param name="controlName"></param>
        /// <param name="waitTime"></param>
        /// <param name="dynamicVariable"></param>
        /// <returns></returns>
        public static Bitmap GetControlBitmap(string viewName, string controlName, int waitTime = WaitTime.DefaultWaitTime, string dynamicVariable = "")
        {
            Logger.InsertLogLine("Get Control bitmap - Control: " + controlName + " in View : " + viewName);

            Control control = PopulateControl(viewName, controlName, dynamicVariable);
            if (control.ControlZone == "Native")
            {
                xamlControl = GetXamlControl(control, dynamicVariable, waitTime);
                xamlControl.WaitForControlExist(waitTime);
                return GetControlBitmap(xamlControl);
            }

            else if (control.ControlZone == "Web")
            {
                htmlControl = GetHtmlControl(control, dynamicVariable, waitTime);
                return GetControlBitmap(htmlControl);
            }
            else if (control.ControlZone == "DirectUI")
            {
                directUIControl = GetDirectUIControl(control, dynamicVariable, waitTime);
                directUIControl.WaitForControlExist(waitTime);
                return GetControlBitmap(directUIControl);
            }
            else
            {
                return GetControlBitmap(xamlAppWindow);
            }
        }
 /// <summary>
 /// Clicks available control
 /// </summary>
 /// <param name="viewName">from control.xml</param>
 /// <param name="controlName">from control.xml</param>
 /// <param name="waitTime"></param>
 /// <param name="dynamicVariable"></param>
 public static void Click(string viewName, string controlName, int waitTime = WaitTime.DefaultWaitTime, string dynamicVariable = "")
 {
     Control control = PopulateControl(viewName, controlName, dynamicVariable);
     Logger.InsertLogLine("Click on control: " + control.ControlName + " in View : " + viewName);
     if (control.ControlZone == "Native")
     {
         xamlControl = GetXamlControl(control, dynamicVariable, waitTime);
         xamlControl.WaitForControlExist(waitTime);
         Gesture.Tap(new Point(xamlControl.BoundingRectangle.X + xamlControl.BoundingRectangle.Width / 2, xamlControl.BoundingRectangle.Y + xamlControl.BoundingRectangle.Height / 2));
     }
     else if (control.ControlZone == "Web")
     {
         htmlControl = GetHtmlControl(control, dynamicVariable, waitTime);
         htmlControl.WaitForControlExist(waitTime);
         Gesture.Tap(new Point(htmlControl.BoundingRectangle.X + htmlControl.BoundingRectangle.Width / 2, htmlControl.BoundingRectangle.Y + htmlControl.BoundingRectangle.Height / 2));
         //Gesture.Tap(htmlControl);
     }
     else if (control.ControlZone == "DirectUI")
     {
         directUIControl = GetDirectUIControl(control, dynamicVariable, waitTime);
         Gesture.Tap(directUIControl);
     }
 }
        /// <summary>
        /// Compares Control Image colors
        /// </summary>
        /// <param name="viewName"></param>
        /// <param name="controlName"></param>
        /// <param name="controlColor"></param>
        /// <param name="waitTime"></param>
        /// <param name="dynamicVariable"></param>
        /// <returns>true:if color matches; false:color mismatch</returns>
        public static bool CompareControlImageColor(string viewName, string controlName, Color controlColor, int waitTime = WaitTime.DefaultWaitTime, string dynamicVariable = "")
        {
            Logger.InsertLogLine("Compare Control Image color - Control: " + controlName + " in View : " + viewName + "Color" + controlColor.ToString());

            Control control = PopulateControl(viewName, controlName, dynamicVariable);
            UITestControl uiControl;
            if (control.ControlZone == "Native")
            {
                xamlControl = GetXamlControl(control, dynamicVariable, waitTime);
                xamlControl.WaitForControlExist(waitTime);
                uiControl = xamlControl;
            }

            else if (control.ControlZone == "Web")
            {
                htmlControl = GetHtmlControl(control, dynamicVariable, waitTime);
                uiControl = htmlControl;
            }
            else if (control.ControlZone == "DirectUI")
            {
                directUIControl = GetDirectUIControl(control, dynamicVariable, waitTime);
                directUIControl.WaitForControlExist(waitTime);
                uiControl = directUIControl;
            }
            else
            {
                uiControl = xamlAppWindow;
            }
            return CompareControlImageColor(uiControl, controlColor);
        }
        /// <summary>
        /// Gets children count of parent control
        /// </summary>
        /// <param name="viewName"></param>
        /// <param name="controlName"></param>
        /// <param name="waitTime"></param>
        /// <param name="dynamicVariable"></param>
        /// <returns></returns>
        public static string[] GetChildrenControlNames(string viewName, string controlName, int waitTime = WaitTime.DefaultWaitTime, string dynamicVariable = "")
        {
            Logger.InsertLogLine("Get Childreh controls Name- Control: " + controlName + " in View : " + viewName);
            UITestControlCollection children = new UITestControlCollection();
            Control control = PopulateControl(viewName, controlName, dynamicVariable);
            if (control.ControlZone == "Native")
            {
                xamlControl = GetXamlControl(control, dynamicVariable, waitTime);
                xamlControl.WaitForControlExist(waitTime);
                children = xamlControl.GetChildren();
            }

            else if (control.ControlZone == "Web")
            {
                htmlControl = GetHtmlControl(control, dynamicVariable, waitTime);
                children = htmlControl.GetChildren();
            }
            else if (control.ControlZone == "DirectUI")
            {
                directUIControl = GetDirectUIControl(control, dynamicVariable, waitTime);
                directUIControl.WaitForControlExist(waitTime);
                children = directUIControl.GetChildren();
            }

            string[] myList = new string[50];
            for (int i = 0; i < children.Count; i++)
            {
                myList[i] = children[i].Name;
            }
            return myList;
        }
        public static void ClickChildrensChildByNameAtFirstLevel(string viewName, string controlName, int waitTime = WaitTime.DefaultWaitTime, string dynamicVariable = "", string ChildName = "")
        {
            Control control = PopulateControl(viewName, controlName, dynamicVariable);
            Logger.InsertLogLine("Get Childreh control count- Control: " + controlName + " in View : " + viewName);
            Logger.InsertLogLine("Click on children's child: " + ChildName + "in control: " + control.ControlName + " in View : " + viewName);
            UITestControlCollection children = new UITestControlCollection();
            if (control.ControlZone == "Native")
            {
                xamlControl = GetXamlControl(control, dynamicVariable, waitTime);
                xamlControl.WaitForControlExist(waitTime);
                children = xamlControl.GetChildren();
            }

            else if (control.ControlZone == "Web")
            {
                htmlControl = GetHtmlControl(control, dynamicVariable, waitTime);
                children = htmlControl.GetChildren();
            }
            else if (control.ControlZone == "DirectUI")
            {
                directUIControl = GetDirectUIControl(control, dynamicVariable, waitTime);
                directUIControl.WaitForControlExist(waitTime);
                children = directUIControl.GetChildren();
            }

            for (int j = 0; j < children.Count; j++)
            {
                string chname = children[j].Name;

                if (children[j].Name.Contains(ChildName))
                {
                    Gesture.Tap(new Point(children[j].BoundingRectangle.X + children[j].BoundingRectangle.Width / 2, children[j].BoundingRectangle.Y + children[j].BoundingRectangle.Height / 2));
                }
            }
        }
        /// <summary>
        /// 
        /// </summary>
        /// <param name="viewName"></param>
        /// <param name="controlName"></param>
        /// <param name="waitTime"></param>
        /// <param name="dynamicVariable"></param>
        /// <returns></returns>
        public static bool VerifyControlHighlighted(string viewName, string controlName, int waitTime = WaitTime.DefaultWaitTime, string dynamicVariable = "")
        {
            Logger.InsertLogLine("Verify Control highlighted - Control: " + controlName + " in View : " + viewName);
            bool ControlHasFocus = false;
            Control control = PopulateControl(viewName, controlName, dynamicVariable);
            if (control.ControlZone == "Native")
            {
                xamlControl = GetXamlControl(control, dynamicVariable, waitTime);
                xamlControl.WaitForControlExist(waitTime);
                ControlHasFocus = xamlControl.HasFocus;
            }

            else if (control.ControlZone == "Web")
            {
                htmlControl = GetHtmlControl(control, dynamicVariable, waitTime);
                ControlHasFocus = htmlControl.HasFocus;
            }
            else if (control.ControlZone == "DirectUI")
            {
                directUIControl = GetDirectUIControl(control, dynamicVariable, waitTime);
                directUIControl.WaitForControlExist(waitTime);
                ControlHasFocus = directUIControl.HasFocus;
            }
            return ControlHasFocus;
        }
        public static bool VerifyChildrensChildControlByName(string viewName, string controlName, int waitTime = WaitTime.DefaultWaitTime, string dynamicVariable = "", string ChildName = "")
        {
            Logger.InsertLogLine("Get Childreh control count- Control: " + controlName + " in View : " + viewName);
            UITestControlCollection children = new UITestControlCollection();
            Control control = PopulateControl(viewName, controlName, dynamicVariable);
            if (control.ControlZone == "Native")
            {
                xamlControl = GetXamlControl(control, dynamicVariable, waitTime);
                xamlControl.WaitForControlExist(waitTime);
                children = xamlControl.GetChildren();
            }

            else if (control.ControlZone == "Web")
            {
                htmlControl = GetHtmlControl(control, dynamicVariable, waitTime);
                children = htmlControl.GetChildren();
            }
            else if (control.ControlZone == "DirectUI")
            {
                directUIControl = GetDirectUIControl(control, dynamicVariable, waitTime);
                directUIControl.WaitForControlExist(waitTime);
                children = directUIControl.GetChildren();
            }

            for (int i = 0; i < children.Count; i++)
            {
                string chname = children[i].Name;

                UITestControlCollection children1 = new UITestControlCollection();

                children1 = children[i].GetChildren();

                for (int j = 0; j < children.Count; j++)
                {
                    string chchname = children1[j].Name;
                    if (children1[j].Name.Contains(ChildName))
                    {
                        return true;
                    }
                }
            }

            return false;
        }
        public static bool VerifyChildByName(string viewName, string controlName, string childName, int waitTime = WaitTime.DefaultWaitTime, string dynamicVariable = "")
        {
            bool exists = false;
            UITestControlCollection children = null;
            UITestControl child = null;
            Control control = PopulateControl(viewName, controlName, dynamicVariable);
            if (control.ControlZone == "Native")
            {
                xamlControl = GetXamlControl(control, dynamicVariable, waitTime);
                xamlControl.WaitForControlExist(waitTime);
                children = xamlControl.GetChildren();
            }

            else if (control.ControlZone == "Web")
            {
                htmlControl = GetHtmlControl(control, dynamicVariable, waitTime);
                children = htmlControl.GetChildren();
            }
            else if (control.ControlZone == "DirectUI")
            {
                directUIControl = GetDirectUIControl(control, dynamicVariable, waitTime);
                directUIControl.WaitForControlExist(waitTime);
                children = directUIControl.GetChildren();
            }
            for (int i = 0; i < children.Count; i++)
            {
                child = children[i];
                string name = child.GetProperty("Name").ToString();
                if (name.Contains(childName))
                {
                    exists = true;
                }
            }
            return exists;
        }
        public static void ClickAndVerifyColorOfChildrenByInstance(string viewName, string controlName, Color samplecolor, out bool ColorCompareResult, int waitTime = WaitTime.DefaultWaitTime, string dynamicVariable = "", int ChildInstance = 1)
        {
            ColorCompareResult = false;
            Control control = PopulateControl(viewName, controlName, dynamicVariable);
            Logger.InsertLogLine("Get Childreh control count- Control: " + controlName + " in View : " + viewName);
            Logger.InsertLogLine("Click on children's child: " + ChildInstance.ToString() + "in control: " + control.ControlName + " in View : " + viewName);
            UITestControlCollection children = new UITestControlCollection();
            if (control.ControlZone == "Native")
            {
                xamlControl = GetXamlControl(control, dynamicVariable, waitTime);
                xamlControl.WaitForControlExist(waitTime);
                children = xamlControl.GetChildren();
            }

            else if (control.ControlZone == "Web")
            {
                htmlControl = GetHtmlControl(control, dynamicVariable, waitTime);
                children = htmlControl.GetChildren();
            }
            else if (control.ControlZone == "DirectUI")
            {
                directUIControl = GetDirectUIControl(control, dynamicVariable, waitTime);
                directUIControl.WaitForControlExist(waitTime);
                children = directUIControl.GetChildren();
            }

            for (int j = 0; j < children.Count; j++)
            {
                if (j == ChildInstance - 1)
                {
                    UITestControl uicontrol = children[j];
                    ColorCompareResult = CompareControlImageColor(uicontrol, samplecolor);
                    Gesture.Tap(new Point(children[j].BoundingRectangle.X + children[j].BoundingRectangle.Width / 2, children[j].BoundingRectangle.Y + children[j].BoundingRectangle.Height / 2));
                }
            }
        }