예제 #1
0
        public override void RunCommand(object sender)
        {
            var      engine     = (IAutomationEngineInstance)sender;
            string   windowName = v_WindowName.ConvertUserVariableToString(engine);
            int      timeout    = Int32.Parse(v_Timeout);
            DateTime timeToEnd  = DateTime.Now.AddSeconds(timeout);

            while (timeToEnd >= DateTime.Now)
            {
                try
                {
                    if (engine.IsCancellationPending)
                    {
                        break;
                    }
                    User32Functions.ActivateWindow(windowName);
                    if (!User32Functions.GetActiveWindowTitle().Equals(windowName))
                    {
                        throw new Exception($"Window '{windowName}' Not Yet Found... ");
                    }
                    break;
                }
                catch (Exception)
                {
                    engine.ReportProgress($"Window '{windowName}' Not Yet Found... " + (timeToEnd - DateTime.Now).Minutes + "m, " + (timeToEnd - DateTime.Now).Seconds + "s remain");
                    Thread.Sleep(500);
                }
            }
            if (!User32Functions.GetActiveWindowTitle().Equals(windowName))
            {
                throw new Exception($"Window '{windowName}' Not Found");
            }
        }
        public async override Task RunCommand(object sender)
        {
            var    engine     = (IAutomationEngineInstance)sender;
            string windowName = (string)await v_WindowName.EvaluateCode(engine);

            int timeout = (int)await v_Timeout.EvaluateCode(engine);

            DateTime timeToEnd = DateTime.Now.AddSeconds(timeout);

            while (timeToEnd >= DateTime.Now)
            {
                try
                {
                    if (engine.IsCancellationPending)
                    {
                        break;
                    }

                    User32Functions.ActivateWindow(windowName);

                    if (!User32Functions.GetActiveWindowTitle().Equals(windowName))
                    {
                        throw new Exception($"Window '{windowName}' Not Yet Found... ");
                    }

                    break;
                }
                catch (Exception)
                {
                    engine.ReportProgress($"Window '{windowName}' Not Yet Found... {(timeToEnd - DateTime.Now).Minutes}m, {(timeToEnd - DateTime.Now).Seconds}s remain");
                    Thread.Sleep(500);
                }
            }

            if (!User32Functions.GetActiveWindowTitle().Equals(windowName))
            {
                throw new Exception($"Window '{windowName}' Not Found");
            }
        }
예제 #3
0
        public override void RunCommand(object sender)
        {
            var engine = (Core.Automation.Engine.AutomationEngineInstance)sender;

            //create variable window name
            var variableWindowName = v_WindowName.ConvertToUserVariable(sender);

            if (variableWindowName == "Current Window")
            {
                variableWindowName = User32Functions.GetActiveWindowTitle();
            }

            var requiredHandle = SearchForGUIElement(sender, variableWindowName);


            //if element exists type
            if (v_AutomationType == "Check If Element Exists")
            {
                //apply to variable
                var applyToVariable = (from rw in v_UIAActionParameters.AsEnumerable()
                                       where rw.Field <string>("Parameter Name") == "Apply To Variable"
                                       select rw.Field <string>("Parameter Value")).FirstOrDefault();


                //remove brackets from variable
                applyToVariable = applyToVariable.Replace(engine.engineSettings.VariableStartMarker, "").Replace(engine.engineSettings.VariableEndMarker, "");

                //declare search result
                string searchResult;

                //determine search result
                if (requiredHandle == null)
                {
                    searchResult = "FALSE";
                }
                else
                {
                    searchResult = "TRUE";
                }

                //store data
                searchResult.StoreInUserVariable(sender, applyToVariable);
            }

            //determine element click type
            else if (v_AutomationType == "Click Element")
            {
                //if handle was not found
                if (requiredHandle == null)
                {
                    throw new Exception("Element was not found in window '" + variableWindowName + "'");
                }

                //create search params
                var clickType = (from rw in v_UIAActionParameters.AsEnumerable()
                                 where rw.Field <string>("Parameter Name") == "Click Type"
                                 select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //get x adjust
                var xAdjust = (from rw in v_UIAActionParameters.AsEnumerable()
                               where rw.Field <string>("Parameter Name") == "X Adjustment"
                               select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //get y adjust
                var yAdjust = (from rw in v_UIAActionParameters.AsEnumerable()
                               where rw.Field <string>("Parameter Name") == "Y Adjustment"
                               select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //convert potential variable
                var xAdjustVariable = xAdjust.ConvertToUserVariable(sender);
                var yAdjustVariable = yAdjust.ConvertToUserVariable(sender);

                //parse to int
                var xAdjustInt = int.Parse(xAdjustVariable);
                var yAdjustInt = int.Parse(yAdjustVariable);

                //get clickable point
                var newPoint = requiredHandle.GetClickablePoint();

                //send mousemove command
                var newMouseMove = new SendMouseMoveCommand
                {
                    v_XMousePosition = (newPoint.X + xAdjustInt).ToString(),
                    v_YMousePosition = (newPoint.Y + yAdjustInt).ToString(),
                    v_MouseClick     = clickType
                };

                //run commands
                newMouseMove.RunCommand(sender);
            }
            else if (v_AutomationType == "Get Value From Element")
            {
                //if handle was not found
                if (requiredHandle == null)
                {
                    throw new Exception("Element was not found in window '" + variableWindowName + "'");
                }
                //get value from property
                var propertyName = (from rw in v_UIAActionParameters.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "Get Value From"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //apply to variable
                var applyToVariable = (from rw in v_UIAActionParameters.AsEnumerable()
                                       where rw.Field <string>("Parameter Name") == "Apply To Variable"
                                       select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //remove brackets from variable
                applyToVariable = applyToVariable.Replace(engine.engineSettings.VariableStartMarker, "").Replace(engine.engineSettings.VariableEndMarker, "");

                //get required value
                var requiredValue = requiredHandle.Current.GetType().GetRuntimeProperty(propertyName)?.GetValue(requiredHandle.Current).ToString();

                //store into variable
                requiredValue.StoreInUserVariable(sender, applyToVariable);
            }
            else
            {
                throw new NotImplementedException("Automation type '" + v_AutomationType + "' not supported.");
            }
        }
        public override void RunCommand(object sender)
        {
            var engine = (AutomationEngineInstance)sender;
            //create variable window name
            var variableWindowName = v_WindowName.ConvertUserVariableToString(engine);

            if (variableWindowName == "Current Window")
            {
                variableWindowName = User32Functions.GetActiveWindowTitle();
            }

            dynamic requiredHandle = null;

            if (v_AutomationType != "Wait For Element To Exist")
            {
                requiredHandle = SearchForGUIElement(sender, variableWindowName);
            }

            switch (v_AutomationType)
            {
            //determine element click type
            case "Click Element":
                //if handle was not found
                if (requiredHandle == null)
                {
                    throw new Exception("Element was not found in window '" + variableWindowName + "'");
                }
                //create search params
                var clickType = (from rw in v_UIAActionParameters.AsEnumerable()
                                 where rw.Field <string>("Parameter Name") == "Click Type"
                                 select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //get x adjust
                var xAdjust = (from rw in v_UIAActionParameters.AsEnumerable()
                               where rw.Field <string>("Parameter Name") == "X Adjustment"
                               select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //get y adjust
                var yAdjust = (from rw in v_UIAActionParameters.AsEnumerable()
                               where rw.Field <string>("Parameter Name") == "Y Adjustment"
                               select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //convert potential variable
                var xAdjustVariable = xAdjust.ConvertUserVariableToString(engine);
                var yAdjustVariable = yAdjust.ConvertUserVariableToString(engine);

                //parse to int
                var xAdjustInt = int.Parse(xAdjustVariable);
                var yAdjustInt = int.Parse(yAdjustVariable);

                //get clickable point
                var newPoint = requiredHandle.GetClickablePoint();

                //send mousemove command
                var newMouseMove = new SendMouseMoveCommand
                {
                    v_XMousePosition = (newPoint.X + xAdjustInt).ToString(),
                    v_YMousePosition = (newPoint.Y + yAdjustInt).ToString(),
                    v_MouseClick     = clickType
                };

                //run commands
                newMouseMove.RunCommand(sender);
                break;

            case "Set Text":
                string textToSet = (from rw in v_UIAActionParameters.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "Text To Set"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault();


                string clearElement = (from rw in v_UIAActionParameters.AsEnumerable()
                                       where rw.Field <string>("Parameter Name") == "Clear Element Before Setting Text"
                                       select rw.Field <string>("Parameter Value")).FirstOrDefault();

                string encryptedData = (from rw in v_UIAActionParameters.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Encrypted Text"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault();
                if (clearElement == null)
                {
                    clearElement = "No";
                }
                if (encryptedData == "Encrypted")
                {
                    textToSet = EncryptionServices.DecryptString(textToSet, "TASKT");
                }
                textToSet = textToSet.ConvertUserVariableToString(engine);

                if (requiredHandle.Current.IsEnabled && requiredHandle.Current.IsKeyboardFocusable)
                {
                    object valuePattern = null;
                    if (!requiredHandle.TryGetCurrentPattern(ValuePattern.Pattern, out valuePattern))
                    {
                        //The control does not support ValuePattern Using keyboard input

                        // Set focus for input functionality and begin.
                        requiredHandle.SetFocus();

                        // Pause before sending keyboard input.
                        Thread.Sleep(100);

                        if (clearElement.ToLower() == "yes")
                        {
                            // Delete existing content in the control and insert new content.
                            SendKeys.SendWait("^{HOME}");       // Move to start of control
                            SendKeys.SendWait("^+{END}");       // Select everything
                            SendKeys.SendWait("{DEL}");         // Delete selection
                        }
                        SendKeys.SendWait(textToSet);
                    }
                    else
                    {
                        if (clearElement.ToLower() == "no")
                        {
                            string currentText;
                            object tPattern = null;
                            if (requiredHandle.TryGetCurrentPattern(TextPattern.Pattern, out tPattern))
                            {
                                var textPattern = (TextPattern)tPattern;
                                currentText = textPattern.DocumentRange.GetText(-1).TrimEnd('\r').ToString();     // often there is an extra '\r' hanging off the end.
                            }
                            else
                            {
                                currentText = requiredHandle.Current.Name.ToString();
                            }
                            textToSet = currentText + textToSet;
                        }
                        requiredHandle.SetFocus();
                        ((ValuePattern)valuePattern).SetValue(textToSet);
                    }
                }
                break;

            case "Set Secure Text":
                string secureString = (from rw in v_UIAActionParameters.AsEnumerable()
                                       where rw.Field <string>("Parameter Name") == "Secure String Variable"
                                       select rw.Field <string>("Parameter Value")).FirstOrDefault();

                string _clearElement = (from rw in v_UIAActionParameters.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Clear Element Before Setting Text"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault();

                var secureStrVariable = secureString.ConvertUserVariableToObject(engine);

                if (secureStrVariable is SecureString)
                {
                    secureString = ((SecureString)secureStrVariable).ConvertSecureStringToString();
                }
                else
                {
                    throw new ArgumentException("Provided Argument is not a 'Secure String'");
                }

                if (_clearElement == null)
                {
                    _clearElement = "No";
                }

                if (requiredHandle.Current.IsEnabled && requiredHandle.Current.IsKeyboardFocusable)
                {
                    object valuePattern = null;
                    if (!requiredHandle.TryGetCurrentPattern(ValuePattern.Pattern, out valuePattern))
                    {
                        //The control does not support ValuePattern Using keyboard input

                        // Set focus for input functionality and begin.
                        requiredHandle.SetFocus();

                        // Pause before sending keyboard input.
                        Thread.Sleep(100);

                        if (_clearElement.ToLower() == "yes")
                        {
                            // Delete existing content in the control and insert new content.
                            SendKeys.SendWait("^{HOME}");       // Move to start of control
                            SendKeys.SendWait("^+{END}");       // Select everything
                            SendKeys.SendWait("{DEL}");         // Delete selection
                        }
                        SendKeys.SendWait(secureString);
                    }
                    else
                    {
                        if (_clearElement.ToLower() == "no")
                        {
                            string currentText;
                            object tPattern = null;
                            if (requiredHandle.TryGetCurrentPattern(TextPattern.Pattern, out tPattern))
                            {
                                var textPattern = (TextPattern)tPattern;
                                currentText = textPattern.DocumentRange.GetText(-1).TrimEnd('\r').ToString();     // often there is an extra '\r' hanging off the end.
                            }
                            else
                            {
                                currentText = requiredHandle.Current.Name.ToString();
                            }
                            secureString = currentText + secureString;
                        }
                        requiredHandle.SetFocus();
                        ((ValuePattern)valuePattern).SetValue(secureString);
                    }
                }
                break;

            case "Clear Element":
                if (requiredHandle.Current.IsEnabled && requiredHandle.Current.IsKeyboardFocusable)
                {
                    object valuePattern = null;
                    if (!requiredHandle.TryGetCurrentPattern(ValuePattern.Pattern, out valuePattern))
                    {
                        //The control does not support ValuePattern Using keyboard input

                        // Set focus for input functionality and begin.
                        requiredHandle.SetFocus();

                        // Pause before sending keyboard input.
                        Thread.Sleep(100);

                        // Delete existing content in the control and insert new content.
                        SendKeys.SendWait("^{HOME}");       // Move to start of control
                        SendKeys.SendWait("^+{END}");       // Select everything
                        SendKeys.SendWait("{DEL}");         // Delete selection
                    }
                    else
                    {
                        requiredHandle.SetFocus();
                        ((ValuePattern)valuePattern).SetValue("");
                    }
                }
                break;

            case "Get Text":
            //if element exists type
            case "Check If Element Exists":
                //apply to variable
                var applyToVariable = (from rw in v_UIAActionParameters.AsEnumerable()
                                       where rw.Field <string>("Parameter Name") == "Apply To Variable"
                                       select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //declare search result
                string searchResult = "";
                if (v_AutomationType == "Get Text")
                {
                    //string currentText;
                    object tPattern = null;
                    if (requiredHandle.TryGetCurrentPattern(TextPattern.Pattern, out tPattern))
                    {
                        var textPattern = (TextPattern)tPattern;
                        searchResult = textPattern.DocumentRange.GetText(-1).TrimEnd('\r').ToString();     // often there is an extra '\r' hanging off the end.
                    }
                    else
                    {
                        searchResult = requiredHandle.Current.Name.ToString();
                    }
                }

                else if (v_AutomationType == "Check If Element Exists")
                {
                    //determine search result
                    if (requiredHandle == null)
                    {
                        searchResult = "False";
                    }
                    else
                    {
                        searchResult = "True";
                    }
                }
                //store data
                searchResult.StoreInUserVariable(engine, applyToVariable);
                break;

            case "Wait For Element To Exist":
                var timeoutText = (from rw in v_UIAActionParameters.AsEnumerable()
                                   where rw.Field <string>("Parameter Name") == "Timeout (Seconds)"
                                   select rw.Field <string>("Parameter Value")).FirstOrDefault();

                timeoutText = timeoutText.ConvertUserVariableToString(engine);

                int timeOut = Convert.ToInt32(timeoutText);

                var timeToEnd = DateTime.Now.AddSeconds(timeOut);
                while (timeToEnd >= DateTime.Now)
                {
                    try
                    {
                        requiredHandle = SearchForGUIElement(sender, variableWindowName);
                        break;
                    }
                    catch (Exception)
                    {
                        engine.ReportProgress("Element Not Yet Found... " + (timeToEnd - DateTime.Now).Seconds + "s remain");
                        Thread.Sleep(1000);
                    }
                }
                break;

            case "Get Value From Element":
                if (requiredHandle == null)
                {
                    throw new Exception("Element was not found in window '" + variableWindowName + "'");
                }
                //get value from property
                var propertyName = (from rw in v_UIAActionParameters.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "Get Value From"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //apply to variable
                var applyToVariable2 = (from rw in v_UIAActionParameters.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Apply To Variable"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //get required value
                var requiredValue = requiredHandle.Current.GetType().GetRuntimeProperty(propertyName)?.GetValue(requiredHandle.Current).ToString();

                //store into variable
                ((object)requiredValue).StoreInUserVariable(engine, applyToVariable2);
                break;

            default:
                throw new NotImplementedException("Automation type '" + v_AutomationType + "' not supported.");
            }
        }
예제 #5
0
        /// <summary>
        /// Returns a list of system-generated variables for use with automation.
        /// </summary>
        public static List <ScriptVariable> GenerateSystemVariables()
        {
            List <ScriptVariable> systemVariableList = new List <ScriptVariable>
            {
                new ScriptVariable {
                    VariableName = "Folder.Desktop", VariableValue = Environment.GetFolderPath(Environment.SpecialFolder.Desktop)
                },
                new ScriptVariable {
                    VariableName = "Folder.Documents", VariableValue = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
                },
                new ScriptVariable {
                    VariableName = "Folder.AppData", VariableValue = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)
                },
                new ScriptVariable {
                    VariableName = "Folder.ScriptPath", VariableValue = Folders.GetFolder(FolderType.ScriptsFolder)
                },
                new ScriptVariable {
                    VariableName = "Folder.RootPath", VariableValue = Folders.GetFolder(FolderType.RootFolder)
                },
                new ScriptVariable {
                    VariableName = "Folder.AttendedTasksPath", VariableValue = Folders.GetFolder(FolderType.AttendedTasksFolder)
                },
                new ScriptVariable {
                    VariableName = "DateTime.Now", VariableValue = DateTime.Now.ToString()
                },
                new ScriptVariable {
                    VariableName = "DateTime.Now.Month", VariableValue = DateTime.Now.ToString("MM")
                },
                new ScriptVariable {
                    VariableName = "DateTime.Now.Day", VariableValue = DateTime.Now.ToString("dd")
                },
                new ScriptVariable {
                    VariableName = "DateTime.Now.Year", VariableValue = DateTime.Now.ToString("yy")
                },
                new ScriptVariable {
                    VariableName = "DateTime.Now.YearLong", VariableValue = DateTime.Now.ToString("yyyy")
                },
                new ScriptVariable {
                    VariableName = "DateTime.Now.Hour", VariableValue = DateTime.Now.ToString("HH")
                },
                new ScriptVariable {
                    VariableName = "DateTime.Now.Minute", VariableValue = DateTime.Now.ToString("mm")
                },
                new ScriptVariable {
                    VariableName = "DateTime.Now.Second", VariableValue = DateTime.Now.ToString("ss")
                },
                new ScriptVariable {
                    VariableName = "DateTime.Now.FileSafe", VariableValue = DateTime.Now.ToString("MM-dd-yy hh.mm.ss")
                },
                new ScriptVariable {
                    VariableName = "System.InputLanguage", VariableValue = InputLanguage.CurrentInputLanguage.Culture.Name
                },
                new ScriptVariable {
                    VariableName = "System.KeyboardLayout", VariableValue = InputLanguage.CurrentInputLanguage.LayoutName
                },
                new ScriptVariable {
                    VariableName = "Error.Message", VariableValue = "An Error Occured!"
                },
                new ScriptVariable {
                    VariableName = "Error.Line", VariableValue = "1"
                },
                new ScriptVariable {
                    VariableName = "Error.StackTrace", VariableValue = "An Error Occured + StackTrace"
                },
                new ScriptVariable {
                    VariableName = "PC.MachineName", VariableValue = Environment.MachineName
                },
                new ScriptVariable {
                    VariableName = "PC.UserName", VariableValue = Environment.UserName
                },
                new ScriptVariable {
                    VariableName = "PC.DomainName", VariableValue = Environment.UserDomainName
                },
                new ScriptVariable {
                    VariableName = "Env.ActiveWindowTitle", VariableValue = User32Functions.GetActiveWindowTitle()
                },
                new ScriptVariable {
                    VariableName = "OpenBots.EngineContext", VariableValue = "{JsonContext}"
                },
                new ScriptVariable {
                    VariableName = "OpenBots.Location", VariableValue = Assembly.GetEntryAssembly().Location
                }
            };

            return(systemVariableList);
        }
예제 #6
0
        public bool DetermineStatementTruth(object sender)
        {
            var engine = (AutomationEngineInstance)sender;

            bool ifResult = false;

            if (v_IfActionType == "Value Compare")
            {
                string value1 = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value1"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string operand = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                   where rw.Field <string>("Parameter Name") == "Operand"
                                   select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string value2 = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value2"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());

                value1 = value1.ConvertUserVariableToString(engine);
                value2 = value2.ConvertUserVariableToString(engine);

                decimal cdecValue1, cdecValue2;

                switch (operand)
                {
                case "is equal to":
                    ifResult = (value1 == value2);
                    break;

                case "is not equal to":
                    ifResult = (value1 != value2);
                    break;

                case "is greater than":
                    cdecValue1 = Convert.ToDecimal(value1);
                    cdecValue2 = Convert.ToDecimal(value2);
                    ifResult   = (cdecValue1 > cdecValue2);
                    break;

                case "is greater than or equal to":
                    cdecValue1 = Convert.ToDecimal(value1);
                    cdecValue2 = Convert.ToDecimal(value2);
                    ifResult   = (cdecValue1 >= cdecValue2);
                    break;

                case "is less than":
                    cdecValue1 = Convert.ToDecimal(value1);
                    cdecValue2 = Convert.ToDecimal(value2);
                    ifResult   = (cdecValue1 < cdecValue2);
                    break;

                case "is less than or equal to":
                    cdecValue1 = Convert.ToDecimal(value1);
                    cdecValue2 = Convert.ToDecimal(value2);
                    ifResult   = (cdecValue1 <= cdecValue2);
                    break;
                }
            }
            else if (v_IfActionType == "Date Compare")
            {
                string value1 = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value1"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string operand = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                   where rw.Field <string>("Parameter Name") == "Operand"
                                   select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string value2 = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value2"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());

                value1 = value1.ConvertUserVariableToString(engine);
                value2 = value2.ConvertUserVariableToString(engine);

                DateTime dt1, dt2;
                dt1 = DateTime.Parse(value1);
                dt2 = DateTime.Parse(value2);
                switch (operand)
                {
                case "is equal to":
                    ifResult = (dt1 == dt2);
                    break;

                case "is not equal to":
                    ifResult = (dt1 != dt2);
                    break;

                case "is greater than":
                    ifResult = (dt1 > dt2);
                    break;

                case "is greater than or equal to":
                    ifResult = (dt1 >= dt2);
                    break;

                case "is less than":
                    ifResult = (dt1 < dt2);
                    break;

                case "is less than or equal to":
                    ifResult = (dt1 <= dt2);
                    break;
                }
            }
            else if (v_IfActionType == "Variable Compare")
            {
                string value1 = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value1"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string operand = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                   where rw.Field <string>("Parameter Name") == "Operand"
                                   select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string value2 = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value2"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string caseSensitive = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                         where rw.Field <string>("Parameter Name") == "Case Sensitive"
                                         select rw.Field <string>("Parameter Value")).FirstOrDefault());

                value1 = value1.ConvertUserVariableToString(engine);
                value2 = value2.ConvertUserVariableToString(engine);

                if (caseSensitive == "No")
                {
                    value1 = value1.ToUpper();
                    value2 = value2.ToUpper();
                }

                switch (operand)
                {
                case "contains":
                    ifResult = (value1.Contains(value2));
                    break;

                case "does not contain":
                    ifResult = (!value1.Contains(value2));
                    break;

                case "is equal to":
                    ifResult = (value1 == value2);
                    break;

                case "is not equal to":
                    ifResult = (value1 != value2);
                    break;
                }
            }
            else if (v_IfActionType == "Variable Has Value")
            {
                string variableName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Variable Name"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault());

                var actualVariable = variableName.ConvertUserVariableToString(engine).Trim();

                if (!string.IsNullOrEmpty(actualVariable))
                {
                    ifResult = true;
                }
                else
                {
                    ifResult = false;
                }
            }
            else if (v_IfActionType == "Variable Is Numeric")
            {
                string variableName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Variable Name"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault());

                var actualVariable = variableName.ConvertUserVariableToString(engine).Trim();

                var numericTest = decimal.TryParse(actualVariable, out decimal parsedResult);

                if (numericTest)
                {
                    ifResult = true;
                }
                else
                {
                    ifResult = false;
                }
            }
            else if (v_IfActionType == "Error Occured")
            {
                //get line number
                string userLineNumber = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                          where rw.Field <string>("Parameter Name") == "Line Number"
                                          select rw.Field <string>("Parameter Value")).FirstOrDefault());

                //convert to variable
                string variableLineNumber = userLineNumber.ConvertUserVariableToString(engine);

                //convert to int
                int lineNumber = int.Parse(variableLineNumber);

                //determine if error happened
                if (engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).Count() > 0)
                {
                    var error = engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).FirstOrDefault();
                    error.ErrorMessage.StoreInUserVariable(engine, "Error.Message");
                    error.LineNumber.ToString().StoreInUserVariable(engine, "Error.Line");
                    error.StackTrace.StoreInUserVariable(engine, "Error.StackTrace");

                    ifResult = true;
                }
                else
                {
                    ifResult = false;
                }
            }
            else if (v_IfActionType == "Error Did Not Occur")
            {
                //get line number
                string userLineNumber = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                          where rw.Field <string>("Parameter Name") == "Line Number"
                                          select rw.Field <string>("Parameter Value")).FirstOrDefault());

                //convert to variable
                string variableLineNumber = userLineNumber.ConvertUserVariableToString(engine);

                //convert to int
                int lineNumber = int.Parse(variableLineNumber);

                //determine if error happened
                if (engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).Count() == 0)
                {
                    ifResult = true;
                }
                else
                {
                    var error = engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).FirstOrDefault();
                    error.ErrorMessage.StoreInUserVariable(engine, "Error.Message");
                    error.LineNumber.ToString().StoreInUserVariable(engine, "Error.Line");
                    error.StackTrace.StoreInUserVariable(engine, "Error.StackTrace");

                    ifResult = false;
                }
            }
            else if (v_IfActionType == "Window Name Exists")
            {
                //get user supplied name
                string windowName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                      where rw.Field <string>("Parameter Name") == "Window Name"
                                      select rw.Field <string>("Parameter Value")).FirstOrDefault());
                //variable translation
                string variablizedWindowName = windowName.ConvertUserVariableToString(engine);

                //search for window
                IntPtr windowPtr = User32Functions.FindWindow(variablizedWindowName);

                //conditional
                if (windowPtr != IntPtr.Zero)
                {
                    ifResult = true;
                }
            }
            else if (v_IfActionType == "Active Window Name Is")
            {
                string windowName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                      where rw.Field <string>("Parameter Name") == "Window Name"
                                      select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string variablizedWindowName = windowName.ConvertUserVariableToString(engine);

                var currentWindowTitle = User32Functions.GetActiveWindowTitle();

                if (currentWindowTitle == variablizedWindowName)
                {
                    ifResult = true;
                }
            }
            else if (v_IfActionType == "File Exists")
            {
                string fileName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "File Path"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string trueWhenFileExists = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "True When"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault());

                var userFileSelected = fileName.ConvertUserVariableToString(engine);

                bool existCheck = false;
                if (trueWhenFileExists == "It Does Exist")
                {
                    existCheck = true;
                }

                if (File.Exists(userFileSelected) == existCheck)
                {
                    ifResult = true;
                }
            }
            else if (v_IfActionType == "Folder Exists")
            {
                string folderName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                      where rw.Field <string>("Parameter Name") == "Folder Path"
                                      select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string trueWhenFileExists = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "True When"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault());

                var userFolderSelected = folderName.ConvertUserVariableToString(engine);

                bool existCheck = false;
                if (trueWhenFileExists == "It Does Exist")
                {
                    existCheck = true;
                }

                if (Directory.Exists(folderName) == existCheck)
                {
                    ifResult = true;
                }
            }
            else if (v_IfActionType == "Web Element Exists")
            {
                string instanceName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Selenium Instance Name"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string parameterName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                         where rw.Field <string>("Parameter Name") == "Element Search Parameter"
                                         select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string searchMethod = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Element Search Method"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string trueWhenElementExists = (from rw in v_IfActionParameterTable.AsEnumerable()
                                                where rw.Field <string>("Parameter Name") == "True When"
                                                select rw.Field <string>("Parameter Value")).FirstOrDefault();


                SeleniumElementActionCommand newElementActionCommand = new SeleniumElementActionCommand();
                newElementActionCommand.v_SeleniumSearchType = searchMethod;
                newElementActionCommand.v_InstanceName       = instanceName.ConvertUserVariableToString(engine);
                bool elementExists = newElementActionCommand.ElementExists(sender, searchMethod, parameterName);
                ifResult = elementExists;

                if (trueWhenElementExists == "It Does Not Exist")
                {
                    ifResult = !ifResult;
                }
            }
            else if (v_IfActionType == "GUI Element Exists")
            {
                string windowName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                      where rw.Field <string>("Parameter Name") == "Window Name"
                                      select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine));

                string elementSearchParam = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "Element Search Parameter"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine));

                string elementSearchMethod = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                               where rw.Field <string>("Parameter Name") == "Element Search Method"
                                               select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine));

                string trueWhenElementExists = (from rw in v_IfActionParameterTable.AsEnumerable()
                                                where rw.Field <string>("Parameter Name") == "True When"
                                                select rw.Field <string>("Parameter Value")).FirstOrDefault();

                UIAutomationCommand newUIACommand = new UIAutomationCommand();
                newUIACommand.v_WindowName = windowName;
                newUIACommand.v_UIASearchParameters.Rows.Add(true, elementSearchMethod, elementSearchParam);
                var handle = newUIACommand.SearchForGUIElement(sender, windowName);

                if (handle is null)
                {
                    ifResult = false;
                }
                else
                {
                    ifResult = true;
                }

                if (trueWhenElementExists == "It Does Not Exist")
                {
                    ifResult = !ifResult;
                }
            }
            else if (v_IfActionType == "Image Element Exists")
            {
                string imageName = (from rw in v_IfActionParameterTable.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "Captured Image"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault();
                double accuracy;
                try
                {
                    accuracy = double.Parse((from rw in v_IfActionParameterTable.AsEnumerable()
                                             where rw.Field <string>("Parameter Name") == "Accuracy (0-1)"
                                             select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine));
                    if (accuracy > 1 || accuracy < 0)
                    {
                        throw new ArgumentOutOfRangeException("Accuracy value is out of range (0-1)");
                    }
                }
                catch (Exception)
                {
                    throw new InvalidDataException("Accuracy value is invalid");
                }

                string trueWhenImageExists = (from rw in v_IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "True When"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault();

                var imageVariable = imageName.ConvertUserVariableToObject(engine);

                Bitmap capturedImage;
                if (imageVariable != null && imageVariable is Bitmap)
                {
                    capturedImage = (Bitmap)imageVariable;
                }
                else
                {
                    throw new ArgumentException("Provided Argument is not a 'Bitmap' Image");
                }

                SurfaceAutomationCommand surfaceACommand = new SurfaceAutomationCommand();
                var element = surfaceACommand.FindImageElement(capturedImage, accuracy);
                CommandControls.ShowAllForms();

                if (element != null)
                {
                    ifResult = true;
                }
                else
                {
                    ifResult = false;
                }

                if (trueWhenImageExists == "It Does Not Exist")
                {
                    ifResult = !ifResult;
                }
            }
            else
            {
                throw new Exception("If type not recognized!");
            }

            return(ifResult);
        }
예제 #7
0
        public override void RunCommand(object sender, Core.Script.ScriptAction parentCommand)
        {
            var engine = (Core.Automation.Engine.AutomationEngineInstance)sender;



            bool ifResult = false;


            if (v_IfActionType == "Value")
            {
                string value1 = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value1"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string operand = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                   where rw.Field <string>("Parameter Name") == "Operand"
                                   select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string value2 = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value2"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());

                value1 = value1.ConvertToUserVariable(sender);
                value2 = value2.ConvertToUserVariable(sender);



                decimal cdecValue1, cdecValue2;

                switch (operand)
                {
                case "is equal to":
                    ifResult = (value1 == value2);
                    break;

                case "is not equal to":
                    ifResult = (value1 != value2);
                    break;

                case "is greater than":
                    cdecValue1 = Convert.ToDecimal(value1);
                    cdecValue2 = Convert.ToDecimal(value2);
                    ifResult   = (cdecValue1 > cdecValue2);
                    break;

                case "is greater than or equal to":
                    cdecValue1 = Convert.ToDecimal(value1);
                    cdecValue2 = Convert.ToDecimal(value2);
                    ifResult   = (cdecValue1 >= cdecValue2);
                    break;

                case "is less than":
                    cdecValue1 = Convert.ToDecimal(value1);
                    cdecValue2 = Convert.ToDecimal(value2);
                    ifResult   = (cdecValue1 < cdecValue2);
                    break;

                case "is less than or equal to":
                    cdecValue1 = Convert.ToDecimal(value1);
                    cdecValue2 = Convert.ToDecimal(value2);
                    ifResult   = (cdecValue1 <= cdecValue2);
                    break;
                }
            }
            else if (v_IfActionType == "Date Compare")
            {
                string value1 = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value1"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string operand = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                   where rw.Field <string>("Parameter Name") == "Operand"
                                   select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string value2 = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value2"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());

                value1 = value1.ConvertToUserVariable(sender);
                value2 = value2.ConvertToUserVariable(sender);



                DateTime dt1, dt2;
                dt1 = DateTime.Parse(value1);
                dt2 = DateTime.Parse(value2);
                switch (operand)
                {
                case "is equal to":
                    ifResult = (dt1 == dt2);
                    break;

                case "is not equal to":
                    ifResult = (dt1 != dt2);
                    break;

                case "is greater than":
                    ifResult = (dt1 > dt2);
                    break;

                case "is greater than or equal to":
                    ifResult = (dt1 >= dt2);
                    break;

                case "is less than":
                    ifResult = (dt1 < dt2);
                    break;

                case "is less than or equal to":
                    ifResult = (dt1 <= dt2);
                    break;
                }
            }
            else if (v_IfActionType == "Variable Compare")
            {
                string value1 = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value1"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string operand = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                   where rw.Field <string>("Parameter Name") == "Operand"
                                   select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string value2 = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value2"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string caseSensitive = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                         where rw.Field <string>("Parameter Name") == "Case Sensitive"
                                         select rw.Field <string>("Parameter Value")).FirstOrDefault());

                value1 = value1.ConvertToUserVariable(sender);
                value2 = value2.ConvertToUserVariable(sender);

                if (caseSensitive == "No")
                {
                    value1 = value1.ToUpper();
                    value2 = value2.ToUpper();
                }



                switch (operand)
                {
                case "contains":
                    ifResult = (value1.Contains(value2));
                    break;

                case "does not contain":
                    ifResult = (!value1.Contains(value2));
                    break;

                case "is equal to":
                    ifResult = (value1 == value2);
                    break;

                case "is not equal to":
                    ifResult = (value1 != value2);
                    break;
                }
            }
            else if (v_IfActionType == "Variable Has Value")
            {
                string variableName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Variable Name"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault());

                var actualVariable = variableName.ConvertToUserVariable(sender).Trim();

                if (!string.IsNullOrEmpty(actualVariable))
                {
                    ifResult = true;
                }
                else
                {
                    ifResult = false;
                }
            }
            else if (v_IfActionType == "Variable Is Numeric")
            {
                string variableName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Variable Name"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault());

                var actualVariable = variableName.ConvertToUserVariable(sender).Trim();

                var numericTest = decimal.TryParse(actualVariable, out decimal parsedResult);

                if (numericTest)
                {
                    ifResult = true;
                }
                else
                {
                    ifResult = false;
                }
            }
            else if (v_IfActionType == "Error Occured")
            {
                //get line number
                string userLineNumber = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                          where rw.Field <string>("Parameter Name") == "Line Number"
                                          select rw.Field <string>("Parameter Value")).FirstOrDefault());

                //convert to variable
                string variableLineNumber = userLineNumber.ConvertToUserVariable(sender);

                //convert to int
                int lineNumber = int.Parse(variableLineNumber);

                //determine if error happened
                if (engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).Count() > 0)
                {
                    var error = engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).FirstOrDefault();
                    error.ErrorMessage.StoreInUserVariable(sender, "Error.Message");
                    error.LineNumber.ToString().StoreInUserVariable(sender, "Error.Line");
                    error.StackTrace.StoreInUserVariable(sender, "Error.StackTrace");

                    ifResult = true;
                }
                else
                {
                    ifResult = false;
                }
            }
            else if (v_IfActionType == "Error Did Not Occur")
            {
                //get line number
                string userLineNumber = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                          where rw.Field <string>("Parameter Name") == "Line Number"
                                          select rw.Field <string>("Parameter Value")).FirstOrDefault());

                //convert to variable
                string variableLineNumber = userLineNumber.ConvertToUserVariable(sender);

                //convert to int
                int lineNumber = int.Parse(variableLineNumber);

                //determine if error happened
                if (engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).Count() == 0)
                {
                    ifResult = true;
                }
                else
                {
                    var error = engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).FirstOrDefault();
                    error.ErrorMessage.StoreInUserVariable(sender, "Error.Message");
                    error.LineNumber.ToString().StoreInUserVariable(sender, "Error.Line");
                    error.StackTrace.StoreInUserVariable(sender, "Error.StackTrace");

                    ifResult = false;
                }
            }
            else if (v_IfActionType == "Window Name Exists")
            {
                //get user supplied name
                string windowName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                      where rw.Field <string>("Parameter Name") == "Window Name"
                                      select rw.Field <string>("Parameter Value")).FirstOrDefault());
                //variable translation
                string variablizedWindowName = windowName.ConvertToUserVariable(sender);

                //search for window
                IntPtr windowPtr = User32Functions.FindWindow(variablizedWindowName);

                //conditional
                if (windowPtr != IntPtr.Zero)
                {
                    ifResult = true;
                }
            }
            else if (v_IfActionType == "Active Window Name Is")
            {
                string windowName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                      where rw.Field <string>("Parameter Name") == "Window Name"
                                      select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string variablizedWindowName = windowName.ConvertToUserVariable(sender);

                var currentWindowTitle = User32Functions.GetActiveWindowTitle();

                if (currentWindowTitle == variablizedWindowName)
                {
                    ifResult = true;
                }
            }
            else if (v_IfActionType == "File Exists")
            {
                string fileName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "File Path"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string trueWhenFileExists = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "True When"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault());

                var userFileSelected = fileName.ConvertToUserVariable(sender);

                bool existCheck = false;
                if (trueWhenFileExists == "It Does Exist")
                {
                    existCheck = true;
                }


                if (System.IO.File.Exists(userFileSelected) == existCheck)
                {
                    ifResult = true;
                }
            }
            else if (v_IfActionType == "Folder Exists")
            {
                string folderName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                      where rw.Field <string>("Parameter Name") == "Folder Path"
                                      select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string trueWhenFileExists = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "True When"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault());

                var userFolderSelected = folderName.ConvertToUserVariable(sender);

                bool existCheck = false;
                if (trueWhenFileExists == "It Does Exist")
                {
                    existCheck = true;
                }


                if (System.IO.Directory.Exists(folderName) == existCheck)
                {
                    ifResult = true;
                }
            }
            else if (v_IfActionType == "Web Element Exists")
            {
                string parameterName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                         where rw.Field <string>("Parameter Name") == "Element Search Parameter"
                                         select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string searchMethod = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Element Search Method"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault());

                SeleniumBrowserElementActionCommand_cn newElementActionCommand = new SeleniumBrowserElementActionCommand_cn();
                newElementActionCommand.v_SeleniumSearchType = searchMethod;
                bool elementExists = newElementActionCommand.ElementExists(sender, searchMethod, parameterName);
                ifResult = elementExists;
            }
            else if (v_IfActionType == "GUI Element Exists")
            {
                string windowName = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                      where rw.Field <string>("Parameter Name") == "Window Name"
                                      select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertToUserVariable(sender));

                string elementSearchParam = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "Element Search Parameter"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertToUserVariable(sender));

                string elementSearchMethod = ((from rw in v_IfActionParameterTable.AsEnumerable()
                                               where rw.Field <string>("Parameter Name") == "Element Search Method"
                                               select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertToUserVariable(sender));


                UIAutomationCommand_cn newUIACommand = new UIAutomationCommand_cn();
                newUIACommand.v_WindowName = windowName;
                newUIACommand.v_UIASearchParameters.Rows.Add(true, elementSearchMethod, elementSearchParam);
                var handle = newUIACommand.SearchForGUIElement(sender, windowName);

                if (handle is null)
                {
                    ifResult = false;
                }
                else
                {
                    ifResult = true;
                }
            }
            else
            {
                throw new Exception("If type not recognized!");
            }



            int startIndex, endIndex, elseIndex;

            if (parentCommand.AdditionalScriptCommands.Any(item => item.ScriptCommand is Core.Automation.Commands.ElseCommand))
            {
                elseIndex = parentCommand.AdditionalScriptCommands.FindIndex(a => a.ScriptCommand is Core.Automation.Commands.ElseCommand);

                if (ifResult)
                {
                    startIndex = 0;
                    endIndex   = elseIndex;
                }
                else
                {
                    startIndex = elseIndex + 1;
                    endIndex   = parentCommand.AdditionalScriptCommands.Count;
                }
            }
            else if (ifResult)
            {
                startIndex = 0;
                endIndex   = parentCommand.AdditionalScriptCommands.Count;
            }
            else
            {
                return;
            }

            for (int i = startIndex; i < endIndex; i++)
            {
                if ((engine.IsCancellationPending) || (engine.CurrentLoopCancelled))
                {
                    return;
                }

                engine.ExecuteCommand(parentCommand.AdditionalScriptCommands[i]);
            }
        }
예제 #8
0
        public static bool DetermineStatementTruth(IAutomationEngineInstance engine, string ifActionType, DataTable IfActionParameterTable)
        {
            bool ifResult = false;

            if (ifActionType == "Value Compare")
            {
                string value1 = ((from rw in IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value1"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string operand = ((from rw in IfActionParameterTable.AsEnumerable()
                                   where rw.Field <string>("Parameter Name") == "Operand"
                                   select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string value2 = ((from rw in IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value2"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());

                value1 = value1.ConvertUserVariableToString(engine);
                value2 = value2.ConvertUserVariableToString(engine);

                decimal cdecValue1, cdecValue2;

                switch (operand)
                {
                case "is equal to":
                    ifResult = (value1 == value2);
                    break;

                case "is not equal to":
                    ifResult = (value1 != value2);
                    break;

                case "is greater than":
                    cdecValue1 = Convert.ToDecimal(value1);
                    cdecValue2 = Convert.ToDecimal(value2);
                    ifResult   = (cdecValue1 > cdecValue2);
                    break;

                case "is greater than or equal to":
                    cdecValue1 = Convert.ToDecimal(value1);
                    cdecValue2 = Convert.ToDecimal(value2);
                    ifResult   = (cdecValue1 >= cdecValue2);
                    break;

                case "is less than":
                    cdecValue1 = Convert.ToDecimal(value1);
                    cdecValue2 = Convert.ToDecimal(value2);
                    ifResult   = (cdecValue1 < cdecValue2);
                    break;

                case "is less than or equal to":
                    cdecValue1 = Convert.ToDecimal(value1);
                    cdecValue2 = Convert.ToDecimal(value2);
                    ifResult   = (cdecValue1 <= cdecValue2);
                    break;
                }
            }
            else if (ifActionType == "Date Compare")
            {
                string value1 = ((from rw in IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value1"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string operand = ((from rw in IfActionParameterTable.AsEnumerable()
                                   where rw.Field <string>("Parameter Name") == "Operand"
                                   select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string value2 = ((from rw in IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value2"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());

                DateTime dt1, dt2;

                dynamic input1 = value1.ConvertUserVariableToString(engine);

                if (input1 == value1 && input1.StartsWith("{") && input1.EndsWith("}"))
                {
                    input1 = value1.ConvertUserVariableToObject(engine, typeof(object));
                }

                if (input1 is DateTime)
                {
                    dt1 = (DateTime)input1;
                }
                else if (input1 is string)
                {
                    dt1 = DateTime.Parse((string)input1);
                }
                else
                {
                    throw new InvalidDataException("Value1 is not a valid DateTime");
                }

                dynamic input2 = value2.ConvertUserVariableToString(engine);

                if (input2 == value2 && input2.StartsWith("{") && input2.EndsWith("}"))
                {
                    input2 = value2.ConvertUserVariableToObject(engine, typeof(object));
                }

                if (input2 is DateTime)
                {
                    dt2 = (DateTime)input2;
                }
                else if (input2 is string)
                {
                    dt2 = DateTime.Parse((string)input2);
                }
                else
                {
                    throw new InvalidDataException("Value2 is not a valid DateTime");
                }

                switch (operand)
                {
                case "is equal to":
                    ifResult = (dt1 == dt2);
                    break;

                case "is not equal to":
                    ifResult = (dt1 != dt2);
                    break;

                case "is greater than":
                    ifResult = (dt1 > dt2);
                    break;

                case "is greater than or equal to":
                    ifResult = (dt1 >= dt2);
                    break;

                case "is less than":
                    ifResult = (dt1 < dt2);
                    break;

                case "is less than or equal to":
                    ifResult = (dt1 <= dt2);
                    break;
                }
            }
            else if (ifActionType == "Variable Compare")
            {
                string value1 = ((from rw in IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value1"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string operand = ((from rw in IfActionParameterTable.AsEnumerable()
                                   where rw.Field <string>("Parameter Name") == "Operand"
                                   select rw.Field <string>("Parameter Value")).FirstOrDefault());
                string value2 = ((from rw in IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Value2"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string caseSensitive = ((from rw in IfActionParameterTable.AsEnumerable()
                                         where rw.Field <string>("Parameter Name") == "Case Sensitive"
                                         select rw.Field <string>("Parameter Value")).FirstOrDefault());

                value1 = value1.ConvertUserVariableToString(engine);
                value2 = value2.ConvertUserVariableToString(engine);

                if (caseSensitive == "No")
                {
                    value1 = value1.ToUpper();
                    value2 = value2.ToUpper();
                }

                switch (operand)
                {
                case "contains":
                    ifResult = (value1.Contains(value2));
                    break;

                case "does not contain":
                    ifResult = (!value1.Contains(value2));
                    break;

                case "is equal to":
                    ifResult = (value1 == value2);
                    break;

                case "is not equal to":
                    ifResult = (value1 != value2);
                    break;
                }
            }
            else if (ifActionType == "Variable Has Value")
            {
                string variableName = ((from rw in IfActionParameterTable.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Variable Name"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault());

                var actualVariable = variableName.ConvertUserVariableToObject(engine, typeof(object));

                if (actualVariable != null)
                {
                    ifResult = true;
                }
                else
                {
                    ifResult = false;
                }
            }
            else if (ifActionType == "Variable Is Numeric")
            {
                string variableName = ((from rw in IfActionParameterTable.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Variable Name"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault());

                var actualVariable = variableName.ConvertUserVariableToString(engine).Trim();

                var numericTest = decimal.TryParse(actualVariable, out decimal parsedResult);

                if (numericTest)
                {
                    ifResult = true;
                }
                else
                {
                    ifResult = false;
                }
            }
            else if (ifActionType == "Error Occured")
            {
                //get line number
                string userLineNumber = ((from rw in IfActionParameterTable.AsEnumerable()
                                          where rw.Field <string>("Parameter Name") == "Line Number"
                                          select rw.Field <string>("Parameter Value")).FirstOrDefault());

                //convert to variable
                string variableLineNumber = userLineNumber.ConvertUserVariableToString(engine);

                //convert to int
                int lineNumber = int.Parse(variableLineNumber);

                //determine if error happened
                if (engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).Count() > 0)
                {
                    var error = engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).FirstOrDefault();
                    error.ErrorMessage.StoreInUserVariable(engine, "Error.Message", typeof(string));
                    error.LineNumber.ToString().StoreInUserVariable(engine, "Error.Line", typeof(string));
                    error.StackTrace.StoreInUserVariable(engine, "Error.StackTrace", typeof(string));

                    ifResult = true;
                }
                else
                {
                    ifResult = false;
                }
            }
            else if (ifActionType == "Error Did Not Occur")
            {
                //get line number
                string userLineNumber = ((from rw in IfActionParameterTable.AsEnumerable()
                                          where rw.Field <string>("Parameter Name") == "Line Number"
                                          select rw.Field <string>("Parameter Value")).FirstOrDefault());

                //convert to variable
                string variableLineNumber = userLineNumber.ConvertUserVariableToString(engine);

                //convert to int
                int lineNumber = int.Parse(variableLineNumber);

                //determine if error happened
                if (engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).Count() == 0)
                {
                    ifResult = true;
                }
                else
                {
                    var error = engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).FirstOrDefault();
                    error.ErrorMessage.StoreInUserVariable(engine, "Error.Message", typeof(string));
                    error.LineNumber.ToString().StoreInUserVariable(engine, "Error.Line", typeof(string));
                    error.StackTrace.StoreInUserVariable(engine, "Error.StackTrace", typeof(string));

                    ifResult = false;
                }
            }
            else if (ifActionType == "Window Name Exists")
            {
                //get user supplied name
                string windowName = ((from rw in IfActionParameterTable.AsEnumerable()
                                      where rw.Field <string>("Parameter Name") == "Window Name"
                                      select rw.Field <string>("Parameter Value")).FirstOrDefault());
                //variable translation
                string variablizedWindowName = windowName.ConvertUserVariableToString(engine);

                //search for window
                IntPtr windowPtr = User32Functions.FindWindow(variablizedWindowName);

                //conditional
                if (windowPtr != IntPtr.Zero)
                {
                    ifResult = true;
                }
            }
            else if (ifActionType == "Active Window Name Is")
            {
                string windowName = ((from rw in IfActionParameterTable.AsEnumerable()
                                      where rw.Field <string>("Parameter Name") == "Window Name"
                                      select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string variablizedWindowName = windowName.ConvertUserVariableToString(engine);

                var currentWindowTitle = User32Functions.GetActiveWindowTitle();

                if (currentWindowTitle == variablizedWindowName)
                {
                    ifResult = true;
                }
            }
            else if (ifActionType == "File Exists")
            {
                string fileName = ((from rw in IfActionParameterTable.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "File Path"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string trueWhenFileExists = ((from rw in IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "True When"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault());

                var userFileSelected = fileName.ConvertUserVariableToString(engine);

                bool existCheck = false;
                if (trueWhenFileExists == "It Does Exist")
                {
                    existCheck = true;
                }

                if (File.Exists(userFileSelected) == existCheck)
                {
                    ifResult = true;
                }
            }
            else if (ifActionType == "Folder Exists")
            {
                string folderName = ((from rw in IfActionParameterTable.AsEnumerable()
                                      where rw.Field <string>("Parameter Name") == "Folder Path"
                                      select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string trueWhenFileExists = ((from rw in IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "True When"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault());

                var userFolderSelected = folderName.ConvertUserVariableToString(engine);

                bool existCheck = false;
                if (trueWhenFileExists == "It Does Exist")
                {
                    existCheck = true;
                }

                if (Directory.Exists(userFolderSelected) == existCheck)
                {
                    ifResult = true;
                }
            }
            else if (ifActionType == "Web Element Exists")
            {
                string instanceName = ((from rw in IfActionParameterTable.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Selenium Instance Name"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string parameterName = ((from rw in IfActionParameterTable.AsEnumerable()
                                         where rw.Field <string>("Parameter Name") == "Element Search Parameter"
                                         select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string searchMethod = ((from rw in IfActionParameterTable.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Element Search Method"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string timeout = ((from rw in IfActionParameterTable.AsEnumerable()
                                   where rw.Field <string>("Parameter Name") == "Timeout (Seconds)"
                                   select rw.Field <string>("Parameter Value")).FirstOrDefault());

                string trueWhenElementExists = (from rw in IfActionParameterTable.AsEnumerable()
                                                where rw.Field <string>("Parameter Name") == "True When"
                                                select rw.Field <string>("Parameter Value")).FirstOrDefault();

                bool elementExists = ElementExists(engine, instanceName, searchMethod, parameterName, "Find Element", int.Parse(timeout));
                ifResult = elementExists;

                if (trueWhenElementExists == "It Does Not Exist")
                {
                    ifResult = !ifResult;
                }
            }
            else if (ifActionType == "GUI Element Exists")
            {
                string windowName = ((from rw in IfActionParameterTable.AsEnumerable()
                                      where rw.Field <string>("Parameter Name") == "Window Name"
                                      select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine));

                string elementSearchParam = ((from rw in IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "Element Search Parameter"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine));

                string elementSearchMethod = ((from rw in IfActionParameterTable.AsEnumerable()
                                               where rw.Field <string>("Parameter Name") == "Element Search Method"
                                               select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine));

                string trueWhenElementExists = (from rw in IfActionParameterTable.AsEnumerable()
                                                where rw.Field <string>("Parameter Name") == "True When"
                                                select rw.Field <string>("Parameter Value")).FirstOrDefault();

                string timeout = (from rw in IfActionParameterTable.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Timeout (Seconds)"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine);

                //set up search parameter table
                var uiASearchParameters = new DataTable();
                uiASearchParameters.Columns.Add("Enabled");
                uiASearchParameters.Columns.Add("Parameter Name");
                uiASearchParameters.Columns.Add("Parameter Value");
                uiASearchParameters.Rows.Add(true, elementSearchMethod, elementSearchParam);

                int vTimeout             = int.Parse(timeout);
                AutomationElement handle = null;
                var timeToEnd            = DateTime.Now.AddSeconds(vTimeout);
                while (timeToEnd >= DateTime.Now)
                {
                    try
                    {
                        handle = SearchForGUIElement(engine, uiASearchParameters, windowName);
                        break;
                    }
                    catch (Exception)
                    {
                        engine.ReportProgress("Element Not Yet Found... " + (timeToEnd - DateTime.Now).Seconds + "s remain");
                        Thread.Sleep(500);
                    }
                }

                if (handle is null)
                {
                    ifResult = false;
                }
                else
                {
                    ifResult = true;
                }

                if (trueWhenElementExists == "It Does Not Exist")
                {
                    ifResult = !ifResult;
                }
            }
            else if (ifActionType == "Image Element Exists")
            {
                string imageName = (from rw in IfActionParameterTable.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "Captured Image Variable"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault();
                double accuracy;
                try
                {
                    accuracy = double.Parse((from rw in IfActionParameterTable.AsEnumerable()
                                             where rw.Field <string>("Parameter Name") == "Accuracy (0-1)"
                                             select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine));
                    if (accuracy > 1 || accuracy < 0)
                    {
                        throw new ArgumentOutOfRangeException("Accuracy value is out of range (0-1)");
                    }
                }
                catch (Exception)
                {
                    throw new InvalidDataException("Accuracy value is invalid");
                }

                string trueWhenImageExists = (from rw in IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "True When"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault();

                var imageVariable = imageName.ConvertUserVariableToObject(engine, typeof(Bitmap));

                Bitmap capturedImage;
                if (imageVariable != null && imageVariable is Bitmap)
                {
                    capturedImage = (Bitmap)imageVariable;
                }
                else
                {
                    throw new ArgumentException("Provided Argument is not a 'Bitmap' Image");
                }

                var element = FindImageElement(capturedImage, accuracy);
                FormsHelper.ShowAllForms();

                if (element != null)
                {
                    ifResult = true;
                }
                else
                {
                    ifResult = false;
                }

                if (trueWhenImageExists == "It Does Not Exist")
                {
                    ifResult = !ifResult;
                }
            }
            else if (ifActionType == "App Instance Exists")
            {
                string instanceName = (from rw in IfActionParameterTable.AsEnumerable()
                                       where rw.Field <string>("Parameter Name") == "Instance Name"
                                       select rw.Field <string>("Parameter Value")).FirstOrDefault();


                string trueWhenImageExists = (from rw in IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "True When"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault();

                ifResult = instanceName.InstanceExists(engine);

                if (trueWhenImageExists == "It Does Not Exist")
                {
                    ifResult = !ifResult;
                }
            }
            else
            {
                throw new Exception("If type not recognized!");
            }

            return(ifResult);
        }
예제 #9
0
        public async override Task RunCommand(object sender)
        {
            var engine   = (IAutomationEngineInstance)sender;
            var vTimeout = (int)await v_Timeout.EvaluateCode(engine);

            //create variable window name
            var variableWindowName = (string)await v_WindowName.EvaluateCode(engine);

            if (variableWindowName == "Current Window")
            {
                variableWindowName = User32Functions.GetActiveWindowTitle();
            }

            AutomationElement requiredHandle = null;

            var timeToEnd = DateTime.Now.AddSeconds(vTimeout);

            while (timeToEnd >= DateTime.Now)
            {
                try
                {
                    if (engine.IsCancellationPending)
                    {
                        break;
                    }

                    requiredHandle = await CommandsHelper.SearchForGUIElement(engine, v_UIASearchParameters, variableWindowName);

                    if (requiredHandle == null)
                    {
                        throw new Exception("Element Not Yet Found... ");
                    }

                    break;
                }
                catch (Exception)
                {
                    engine.ReportProgress("Element Not Yet Found... " + (timeToEnd - DateTime.Now).Seconds + "s remain");
                    Thread.Sleep(500);
                }
            }

            switch (v_AutomationType)
            {
            //determine element click type
            case "Click Element":
                //if handle was not found
                if (requiredHandle == null)
                {
                    throw new Exception("Element was not found in window '" + variableWindowName + "'");
                }
                //create search params
                var clickType = (from rw in v_UIAActionParameters.AsEnumerable()
                                 where rw.Field <string>("Parameter Name") == "Click Type"
                                 select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //get x adjust
                var xAdjust = (from rw in v_UIAActionParameters.AsEnumerable()
                               where rw.Field <string>("Parameter Name") == "X Adjustment"
                               select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //get y adjust
                var yAdjust = (from rw in v_UIAActionParameters.AsEnumerable()
                               where rw.Field <string>("Parameter Name") == "Y Adjustment"
                               select rw.Field <string>("Parameter Value")).FirstOrDefault();

                int xAdjustInt;
                int yAdjustInt;

                //parse to int
                if (!string.IsNullOrEmpty(xAdjust))
                {
                    xAdjustInt = (int)await xAdjust.EvaluateCode(engine);
                }
                else
                {
                    xAdjustInt = 0;
                }

                if (!string.IsNullOrEmpty(yAdjust))
                {
                    yAdjustInt = (int)await yAdjust.EvaluateCode(engine);
                }
                else
                {
                    yAdjustInt = 0;
                }

                //get clickable point
                var newPoint = requiredHandle.GetClickablePoint();

                //send mousemove command
                User32Functions.SendMouseMove(Convert.ToInt32(newPoint.X) + xAdjustInt, Convert.ToInt32(newPoint.Y) + yAdjustInt, clickType);

                break;

            case "Hover Over Element":
                //if handle was not found
                if (requiredHandle == null)
                {
                    throw new Exception("Element was not found in window '" + variableWindowName + "'");
                }
                //create search params
                var hoverTime = (from rw in v_UIAActionParameters.AsEnumerable()
                                 where rw.Field <string>("Parameter Name") == "Hover Time (Seconds)"
                                 select rw.Field <string>("Parameter Value")).FirstOrDefault();
                int hoverTimeInt = (int)await hoverTime.EvaluateCode(engine) * 1000;

                //get x adjust
                var xHoverAdjust = (from rw in v_UIAActionParameters.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "X Adjustment"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //get y adjust
                var yHoverAdjust = (from rw in v_UIAActionParameters.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "Y Adjustment"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault();

                int xHoverAdjustInt;
                int yHoverAdjustInt;

                //parse to int
                if (!string.IsNullOrEmpty(xHoverAdjust))
                {
                    xHoverAdjustInt = (int)await xHoverAdjust.EvaluateCode(engine);
                }
                else
                {
                    xHoverAdjustInt = 0;
                }

                if (!string.IsNullOrEmpty(yHoverAdjust))
                {
                    yHoverAdjustInt = (int)await yHoverAdjust.EvaluateCode(engine);
                }
                else
                {
                    yHoverAdjustInt = 0;
                }

                //get clickable point
                var newHoverPoint = requiredHandle.GetClickablePoint();

                //send mousemove command
                User32Functions.SendMouseMove(Convert.ToInt32(newHoverPoint.X) + xHoverAdjustInt, Convert.ToInt32(newHoverPoint.Y) + yHoverAdjustInt, "");
                Thread.Sleep(hoverTimeInt);

                break;

            case "Set Text":
                string textToSet = (from rw in v_UIAActionParameters.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "Text To Set"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault();


                string clearElement = (from rw in v_UIAActionParameters.AsEnumerable()
                                       where rw.Field <string>("Parameter Name") == "Clear Element Before Setting Text"
                                       select rw.Field <string>("Parameter Value")).FirstOrDefault();

                if (clearElement == null)
                {
                    clearElement = "No";
                }

                textToSet = (string)await textToSet.EvaluateCode(engine);

                if (requiredHandle.Current.IsEnabled && requiredHandle.Current.IsKeyboardFocusable)
                {
                    object valuePattern = null;
                    if (!requiredHandle.TryGetCurrentPattern(ValuePattern.Pattern, out valuePattern))
                    {
                        //The control does not support ValuePattern Using keyboard input
                        // Set focus for input functionality and begin.
                        requiredHandle.SetFocus();

                        // Pause before sending keyboard input.
                        Thread.Sleep(100);

                        if (clearElement.ToLower() == "yes")
                        {
                            // Delete existing content in the control and insert new content.
                            SendKeys.SendWait("^{HOME}");                                       // Move to start of control
                            SendKeys.SendWait("^+{END}");                                       // Select everything
                            SendKeys.SendWait("{DEL}");                                         // Delete selection
                        }
                        SendKeys.SendWait(textToSet);
                    }
                    else
                    {
                        if (clearElement.ToLower() == "no")
                        {
                            string currentText;
                            object tPattern = null;
                            if (requiredHandle.TryGetCurrentPattern(TextPattern.Pattern, out tPattern))
                            {
                                var textPattern = (TextPattern)tPattern;
                                // often there is an extra '\r' hanging off the end.
                                currentText = textPattern.DocumentRange.GetText(-1).TrimEnd('\r').ToString();
                            }
                            else
                            {
                                currentText = requiredHandle.Current.Name.ToString();
                            }

                            textToSet = currentText + textToSet;
                        }
                        requiredHandle.SetFocus();
                        ((ValuePattern)valuePattern).SetValue(textToSet);
                    }
                }
                break;

            case "Set Secure Text":
                string secureString = (from rw in v_UIAActionParameters.AsEnumerable()
                                       where rw.Field <string>("Parameter Name") == "Secure String Variable"
                                       select rw.Field <string>("Parameter Value")).FirstOrDefault();

                string _clearElement = (from rw in v_UIAActionParameters.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Clear Element Before Setting Text"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault();

                var secureStrVariable = (SecureString)await secureString.EvaluateCode(engine);

                secureString = secureStrVariable.ConvertSecureStringToString();

                if (_clearElement == null)
                {
                    _clearElement = "No";
                }

                if (requiredHandle.Current.IsEnabled && requiredHandle.Current.IsKeyboardFocusable)
                {
                    object valuePattern = null;
                    if (!requiredHandle.TryGetCurrentPattern(ValuePattern.Pattern, out valuePattern))
                    {
                        //The control does not support ValuePattern Using keyboard input
                        // Set focus for input functionality and begin.
                        requiredHandle.SetFocus();

                        // Pause before sending keyboard input.
                        Thread.Sleep(100);

                        if (_clearElement.ToLower() == "yes")
                        {
                            // Delete existing content in the control and insert new content.
                            SendKeys.SendWait("^{HOME}");                                       // Move to start of control
                            SendKeys.SendWait("^+{END}");                                       // Select everything
                            SendKeys.SendWait("{DEL}");                                         // Delete selection
                        }
                        SendKeys.SendWait(secureString);
                    }
                    else
                    {
                        if (_clearElement.ToLower() == "no")
                        {
                            string currentText;
                            object tPattern = null;
                            if (requiredHandle.TryGetCurrentPattern(TextPattern.Pattern, out tPattern))
                            {
                                var textPattern = (TextPattern)tPattern;
                                // often there is an extra '\r' hanging off the end.
                                currentText = textPattern.DocumentRange.GetText(-1).TrimEnd('\r').ToString();
                            }
                            else
                            {
                                currentText = requiredHandle.Current.Name.ToString();
                            }

                            secureString = currentText + secureString;
                        }
                        requiredHandle.SetFocus();
                        ((ValuePattern)valuePattern).SetValue(secureString);
                    }
                }
                break;

            case "Clear Element":
                if (requiredHandle.Current.IsEnabled && requiredHandle.Current.IsKeyboardFocusable)
                {
                    object valuePattern = null;
                    if (!requiredHandle.TryGetCurrentPattern(ValuePattern.Pattern, out valuePattern))
                    {
                        //The control does not support ValuePattern Using keyboard input
                        // Set focus for input functionality and begin.
                        requiredHandle.SetFocus();

                        // Pause before sending keyboard input.
                        Thread.Sleep(100);

                        // Delete existing content in the control and insert new content.
                        SendKeys.SendWait("^{HOME}");                                   // Move to start of control
                        SendKeys.SendWait("^+{END}");                                   // Select everything
                        SendKeys.SendWait("{DEL}");                                     // Delete selection
                    }
                    else
                    {
                        requiredHandle.SetFocus();
                        ((ValuePattern)valuePattern).SetValue("");
                    }
                }
                break;

            case "Get Text":
            //if element exists type
            case "Element Exists":
                //Variable Name
                var applyToVariable = (from rw in v_UIAActionParameters.AsEnumerable()
                                       where rw.Field <string>("Parameter Name") == "Variable Name"
                                       select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //declare search result
                dynamic searchResult;
                if (v_AutomationType == "Get Text")
                {
                    //string currentText;
                    object tPattern = null;
                    if (requiredHandle.TryGetCurrentPattern(TextPattern.Pattern, out tPattern))
                    {
                        var textPattern = (TextPattern)tPattern;
                        // often there is an extra '\r' hanging off the end.
                        searchResult = textPattern.DocumentRange.GetText(-1).TrimEnd('\r').ToString();
                    }
                    else
                    {
                        searchResult = requiredHandle.Current.Name.ToString();
                    }

                    ((string)searchResult).SetVariableValue(engine, applyToVariable);
                }

                else if (v_AutomationType == "Element Exists")
                {
                    //determine search result
                    if (requiredHandle == null)
                    {
                        searchResult = false;
                    }
                    else
                    {
                        searchResult = true;
                    }

                    ((bool)searchResult).SetVariableValue(engine, applyToVariable);
                }

                break;

            case "Wait For Element To Exist":
                if (requiredHandle == null)
                {
                    throw new Exception($"Element was not found in the allotted time!");
                }
                break;

            case "Get Value From Element":
                if (requiredHandle == null)
                {
                    throw new Exception("Element was not found in window '" + variableWindowName + "'");
                }
                //get value from property
                var propertyName = (from rw in v_UIAActionParameters.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "Get Value From"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //Variable Name
                var applyToVariable2 = (from rw in v_UIAActionParameters.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Variable Name"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault();

                //get required value
                var requiredValue = requiredHandle.Current.GetType().GetRuntimeProperty(propertyName)?.GetValue(requiredHandle.Current).ToString();

                //store into variable
                ((object)requiredValue).SetVariableValue(engine, applyToVariable2);
                break;

            case "Toggle Checkbox Element":
                //if handle was not found
                if (requiredHandle == null)
                {
                    throw new Exception("Element was not found in window '" + variableWindowName + "'");
                }

                var toggleType = (from rw in v_UIAActionParameters.AsEnumerable()
                                  where rw.Field <string>("Parameter Name") == "Toggle Type"
                                  select rw.Field <string>("Parameter Value")).FirstOrDefault();

                bool          toggleState;
                TogglePattern togPattern;

                if (true == requiredHandle.TryGetCurrentPattern(TogglePattern.Pattern, out object objPattern))
                {
                    togPattern  = objPattern as TogglePattern;
                    toggleState = togPattern.Current.ToggleState == ToggleState.On;
                }
                else
                {
                    throw new Exception("Element is not a toggleable control.");
                }

                if ((!toggleState && toggleType == "Check") || (toggleState && toggleType == "Uncheck"))
                {
                    //get clickable point
                    var newCheckboxPoint = requiredHandle.GetClickablePoint();

                    //send mousemove command
                    User32Functions.SendMouseMove(Convert.ToInt32(newCheckboxPoint.X), Convert.ToInt32(newCheckboxPoint.Y), "Left Click");
                }
                break;

            case "Get Checkbox Element Toggle State":
                //if handle was not found
                if (requiredHandle == null)
                {
                    throw new Exception("Element was not found in window '" + variableWindowName + "'");
                }

                var applyStateToVariable = (from rw in v_UIAActionParameters.AsEnumerable()
                                            where rw.Field <string>("Parameter Name") == "Variable Name"
                                            select rw.Field <string>("Parameter Value")).FirstOrDefault();

                bool          toggleState2;
                TogglePattern togPattern2;

                if (true == requiredHandle.TryGetCurrentPattern(TogglePattern.Pattern, out object objPattern2))
                {
                    togPattern2  = objPattern2 as TogglePattern;
                    toggleState2 = togPattern2.Current.ToggleState == ToggleState.On;
                }
                else
                {
                    throw new Exception("Element is not a toggleable control.");
                }

                toggleState2.SetVariableValue(engine, applyStateToVariable);
                break;

            default:
                throw new NotImplementedException("Automation type '" + v_AutomationType + "' not supported.");
            }
        }
예제 #10
0
        public async static Task <bool> DetermineStatementTruth(IAutomationEngineInstance engine, string ifActionType, DataTable IfActionParameterTable, string condition = "false")
        {
            bool ifResult = false;

            if (ifActionType == null)
            {
                ifResult = (bool)await condition.EvaluateCode(engine);
            }
            else
            {
                switch (ifActionType)
                {
                case "Number Compare":
                    string num1 = ((from rw in IfActionParameterTable.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "Number1"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault());
                    string numOperand = ((from rw in IfActionParameterTable.AsEnumerable()
                                          where rw.Field <string>("Parameter Name") == "Operand"
                                          select rw.Field <string>("Parameter Value")).FirstOrDefault());
                    string num2 = ((from rw in IfActionParameterTable.AsEnumerable()
                                    where rw.Field <string>("Parameter Name") == "Number2"
                                    select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    var cdecValue1 = Convert.ToDecimal(await num1.EvaluateCode(engine));
                    var cdecValue2 = Convert.ToDecimal(await num2.EvaluateCode(engine));

                    switch (numOperand)
                    {
                    case "is equal to":
                        ifResult = cdecValue1 == cdecValue2;
                        break;

                    case "is not equal to":
                        ifResult = cdecValue1 != cdecValue2;
                        break;

                    case "is greater than":
                        ifResult = cdecValue1 > cdecValue2;
                        break;

                    case "is greater than or equal to":
                        ifResult = cdecValue1 >= cdecValue2;
                        break;

                    case "is less than":
                        ifResult = cdecValue1 < cdecValue2;
                        break;

                    case "is less than or equal to":
                        ifResult = cdecValue1 <= cdecValue2;
                        break;
                    }
                    break;

                case "Date Compare":
                    string date1 = ((from rw in IfActionParameterTable.AsEnumerable()
                                     where rw.Field <string>("Parameter Name") == "Date1"
                                     select rw.Field <string>("Parameter Value")).FirstOrDefault());
                    string dateOperand = ((from rw in IfActionParameterTable.AsEnumerable()
                                           where rw.Field <string>("Parameter Name") == "Operand"
                                           select rw.Field <string>("Parameter Value")).FirstOrDefault());
                    string date2 = ((from rw in IfActionParameterTable.AsEnumerable()
                                     where rw.Field <string>("Parameter Name") == "Date2"
                                     select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    var dt1 = (DateTime)await date1.EvaluateCode(engine);

                    var dt2 = (DateTime)await date2.EvaluateCode(engine);

                    switch (dateOperand)
                    {
                    case "is equal to":
                        ifResult = dt1 == dt2;
                        break;

                    case "is not equal to":
                        ifResult = dt1 != dt2;
                        break;

                    case "is greater than":
                        ifResult = dt1 > dt2;
                        break;

                    case "is greater than or equal to":
                        ifResult = dt1 >= dt2;
                        break;

                    case "is less than":
                        ifResult = dt1 < dt2;
                        break;

                    case "is less than or equal to":
                        ifResult = dt1 <= dt2;
                        break;
                    }
                    break;

                case "Text Compare":
                    string text1 = ((from rw in IfActionParameterTable.AsEnumerable()
                                     where rw.Field <string>("Parameter Name") == "Text1"
                                     select rw.Field <string>("Parameter Value")).FirstOrDefault());
                    string textOperand = ((from rw in IfActionParameterTable.AsEnumerable()
                                           where rw.Field <string>("Parameter Name") == "Operand"
                                           select rw.Field <string>("Parameter Value")).FirstOrDefault());
                    string text2 = ((from rw in IfActionParameterTable.AsEnumerable()
                                     where rw.Field <string>("Parameter Name") == "Text2"
                                     select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    string caseSensitive = ((from rw in IfActionParameterTable.AsEnumerable()
                                             where rw.Field <string>("Parameter Name") == "Case Sensitive"
                                             select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    text1 = (string)await text1.EvaluateCode(engine);

                    text2 = (string)await text2.EvaluateCode(engine);

                    if (caseSensitive == "No")
                    {
                        text1 = text1.ToUpper();
                        text2 = text2.ToUpper();
                    }

                    switch (textOperand)
                    {
                    case "contains":
                        ifResult = text1.Contains(text2);
                        break;

                    case "does not contain":
                        ifResult = !text1.Contains(text2);
                        break;

                    case "is equal to":
                        ifResult = text1 == text2;
                        break;

                    case "is not equal to":
                        ifResult = text1 != text2;
                        break;
                    }
                    break;

                case "Has Value":
                    string variableName = ((from rw in IfActionParameterTable.AsEnumerable()
                                            where rw.Field <string>("Parameter Name") == "Variable Name"
                                            select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    dynamic actualVariable = variableName.EvaluateCode(engine);

                    if (actualVariable.Result != null)
                    {
                        ifResult = true;
                    }
                    else
                    {
                        ifResult = false;
                    }
                    break;

                case "Is Numeric":
                    string isNumericVariableName = ((from rw in IfActionParameterTable.AsEnumerable()
                                                     where rw.Field <string>("Parameter Name") == "Variable Name"
                                                     select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    ifResult = decimal.TryParse((await isNumericVariableName.EvaluateCode(engine)).ToString(), out decimal decimalResult);
                    break;

                case "Error Occured":
                    //get line number
                    string userLineNumber = ((from rw in IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "Line Number"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    //convert to int
                    int lineNumber = (int)await userLineNumber.EvaluateCode(engine);

                    //determine if error happened
                    if (engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).Count() > 0)
                    {
                        var error = engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber).FirstOrDefault();
                        error.ErrorMessage.SetVariableValue(engine, "Error.Message");
                        error.LineNumber.ToString().SetVariableValue(engine, "Error.Line");
                        error.StackTrace.SetVariableValue(engine, "Error.StackTrace");

                        ifResult = true;
                    }
                    else
                    {
                        ifResult = false;
                    }
                    break;

                case "Error Did Not Occur":
                    //get line number
                    string userLineNumber2 = ((from rw in IfActionParameterTable.AsEnumerable()
                                               where rw.Field <string>("Parameter Name") == "Line Number"
                                               select rw.Field <string>("Parameter Value")).FirstOrDefault());
                    //convert to int
                    int lineNumber2 = (int)await userLineNumber2.EvaluateCode(engine);

                    //determine if error happened
                    if (engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber2).Count() == 0)
                    {
                        ifResult = true;
                    }
                    else
                    {
                        var error = engine.ErrorsOccured.Where(f => f.LineNumber == lineNumber2).FirstOrDefault();
                        error.ErrorMessage.SetVariableValue(engine, "Error.Message");
                        error.LineNumber.ToString().SetVariableValue(engine, "Error.Line");
                        error.StackTrace.SetVariableValue(engine, "Error.StackTrace");

                        ifResult = false;
                    }
                    break;

                case "Window Name Exists":
                    //get user supplied name
                    string windowName = ((from rw in IfActionParameterTable.AsEnumerable()
                                          where rw.Field <string>("Parameter Name") == "Window Name"
                                          select rw.Field <string>("Parameter Value")).FirstOrDefault());
                    //variable translation
                    string variablizedWindowName = (string)await windowName.EvaluateCode(engine);

                    //search for window
                    IntPtr windowPtr = User32Functions.FindWindow(variablizedWindowName);

                    //conditional
                    if (windowPtr != IntPtr.Zero)
                    {
                        ifResult = true;
                    }
                    break;

                case "Active Window Name Is":
                    string activeWindowName = ((from rw in IfActionParameterTable.AsEnumerable()
                                                where rw.Field <string>("Parameter Name") == "Window Name"
                                                select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    string variablizedActiveWindowName = (string)await activeWindowName.EvaluateCode(engine);

                    var currentWindowTitle = User32Functions.GetActiveWindowTitle();

                    if (currentWindowTitle == variablizedActiveWindowName)
                    {
                        ifResult = true;
                    }
                    break;

                case "File Exists":
                    string fileName = ((from rw in IfActionParameterTable.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "File Path"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    string trueWhenFileExists = ((from rw in IfActionParameterTable.AsEnumerable()
                                                  where rw.Field <string>("Parameter Name") == "True When"
                                                  select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    var userFileSelected = (string)await fileName.EvaluateCode(engine);

                    bool fileExistCheck = false;
                    if (trueWhenFileExists == "It Does Exist")
                    {
                        fileExistCheck = true;
                    }

                    if (File.Exists(userFileSelected) == fileExistCheck)
                    {
                        ifResult = true;
                    }
                    break;

                case "Folder Exists":
                    string folderName = ((from rw in IfActionParameterTable.AsEnumerable()
                                          where rw.Field <string>("Parameter Name") == "Folder Path"
                                          select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    string trueWhenFolderExists = ((from rw in IfActionParameterTable.AsEnumerable()
                                                    where rw.Field <string>("Parameter Name") == "True When"
                                                    select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    var userFolderSelected = (string)await folderName.EvaluateCode(engine);

                    bool folderExistCheck = false;
                    if (trueWhenFolderExists == "It Does Exist")
                    {
                        folderExistCheck = true;
                    }

                    if (Directory.Exists(userFolderSelected) == folderExistCheck)
                    {
                        ifResult = true;
                    }
                    break;

                case "Selenium Web Element Exists":
                    string instanceName = ((from rw in IfActionParameterTable.AsEnumerable()
                                            where rw.Field <string>("Parameter Name") == "Selenium Instance Name"
                                            select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    OBAppInstance instance = (OBAppInstance)await instanceName.EvaluateCode(engine);

                    string parameterName = ((from rw in IfActionParameterTable.AsEnumerable()
                                             where rw.Field <string>("Parameter Name") == "Element Search Parameter"
                                             select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    string searchMethod = ((from rw in IfActionParameterTable.AsEnumerable()
                                            where rw.Field <string>("Parameter Name") == "Element Search Method"
                                            select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    string timeoutStr = ((from rw in IfActionParameterTable.AsEnumerable()
                                          where rw.Field <string>("Parameter Name") == "Timeout (Seconds)"
                                          select rw.Field <string>("Parameter Value")).FirstOrDefault());

                    int timeout = (int)await timeoutStr.EvaluateCode(engine);

                    string trueWhenElementExists = (from rw in IfActionParameterTable.AsEnumerable()
                                                    where rw.Field <string>("Parameter Name") == "True When"
                                                    select rw.Field <string>("Parameter Value")).FirstOrDefault();

                    bool elementExists = await ElementExists(engine, instance, searchMethod, parameterName, "Find Element", timeout);

                    ifResult = elementExists;

                    if (trueWhenElementExists == "It Does Not Exist")
                    {
                        ifResult = !ifResult;
                    }
                    break;

                case "GUI Element Exists":
                    string guiWindowName = (from rw in IfActionParameterTable.AsEnumerable()
                                            where rw.Field <string>("Parameter Name") == "Window Name"
                                            select rw.Field <string>("Parameter Value")).FirstOrDefault();
                    windowName = (string)await guiWindowName.EvaluateCode(engine);

                    string elementSearchParam = (from rw in IfActionParameterTable.AsEnumerable()
                                                 where rw.Field <string>("Parameter Name") == "Element Search Parameter"
                                                 select rw.Field <string>("Parameter Value")).FirstOrDefault();
                    elementSearchParam = (string)await elementSearchParam.EvaluateCode(engine);

                    string elementSearchMethod = (from rw in IfActionParameterTable.AsEnumerable()
                                                  where rw.Field <string>("Parameter Name") == "Element Search Method"
                                                  select rw.Field <string>("Parameter Value")).FirstOrDefault();
                    elementSearchMethod = (string)await elementSearchMethod.EvaluateCode(engine);

                    string trueWhenGUIElementExists = (from rw in IfActionParameterTable.AsEnumerable()
                                                       where rw.Field <string>("Parameter Name") == "True When"
                                                       select rw.Field <string>("Parameter Value")).FirstOrDefault();

                    string timeoutString = (from rw in IfActionParameterTable.AsEnumerable()
                                            where rw.Field <string>("Parameter Name") == "Timeout (Seconds)"
                                            select rw.Field <string>("Parameter Value")).FirstOrDefault();

                    //set up search parameter table
                    var uiASearchParameters = new DataTable();
                    uiASearchParameters.Columns.Add("Enabled");
                    uiASearchParameters.Columns.Add("Parameter Name");
                    uiASearchParameters.Columns.Add("Parameter Value");
                    uiASearchParameters.Rows.Add(true, elementSearchMethod, elementSearchParam);

                    int vTimeout = (int)await timeoutString.EvaluateCode(engine);

                    AutomationElement handle = null;
                    var timeToEnd            = DateTime.Now.AddSeconds(vTimeout);
                    while (timeToEnd >= DateTime.Now)
                    {
                        try
                        {
                            handle = await SearchForGUIElement(engine, uiASearchParameters, windowName);

                            break;
                        }
                        catch (Exception)
                        {
                            engine.ReportProgress("Element Not Yet Found... " + (timeToEnd - DateTime.Now).Seconds + "s remain");
                            Thread.Sleep(500);
                        }
                    }

                    if (handle is null)
                    {
                        ifResult = false;
                    }
                    else
                    {
                        ifResult = true;
                    }

                    if (trueWhenGUIElementExists == "It Does Not Exist")
                    {
                        ifResult = !ifResult;
                    }
                    break;

                case "Image Element Exists":
                    string imageName = (from rw in IfActionParameterTable.AsEnumerable()
                                        where rw.Field <string>("Parameter Name") == "Captured Image Variable"
                                        select rw.Field <string>("Parameter Value")).FirstOrDefault();
                    string accuracyString;
                    double accuracy;
                    try
                    {
                        accuracyString = (from rw in IfActionParameterTable.AsEnumerable()
                                          where rw.Field <string>("Parameter Name") == "Accuracy (0-1)"
                                          select rw.Field <string>("Parameter Value")).FirstOrDefault();
                        accuracy = (double)await accuracyString.EvaluateCode(engine);

                        if (accuracy > 1 || accuracy < 0)
                        {
                            throw new ArgumentOutOfRangeException("Accuracy value is out of range (0-1)");
                        }
                    }
                    catch (Exception)
                    {
                        throw new InvalidDataException("Accuracy value is invalid");
                    }

                    string trueWhenImageExists = (from rw in IfActionParameterTable.AsEnumerable()
                                                  where rw.Field <string>("Parameter Name") == "True When"
                                                  select rw.Field <string>("Parameter Value")).FirstOrDefault();

                    var capturedImage = (Bitmap)await imageName.EvaluateCode(engine);

                    string imageTimeoutString = (from rw in IfActionParameterTable.AsEnumerable()
                                                 where rw.Field <string>("Parameter Name") == "Timeout (Seconds)"
                                                 select rw.Field <string>("Parameter Value")).FirstOrDefault();
                    int imageTimeout = (int)await imageTimeoutString.EvaluateCode(engine);

                    var element = FindImageElement(capturedImage, accuracy, engine, DateTime.Now.AddSeconds(imageTimeout));
                    FormsHelper.ShowAllForms(engine.EngineContext.IsDebugMode);

                    if (element != null)
                    {
                        ifResult = true;
                    }
                    else
                    {
                        ifResult = false;
                    }

                    if (trueWhenImageExists == "It Does Not Exist")
                    {
                        ifResult = !ifResult;
                    }
                    break;

                case "App Instance Exists":
                    string appInstanceName = (from rw in IfActionParameterTable.AsEnumerable()
                                              where rw.Field <string>("Parameter Name") == "Instance Name"
                                              select rw.Field <string>("Parameter Value")).FirstOrDefault();


                    string trueWhenAppInstanceExists = (from rw in IfActionParameterTable.AsEnumerable()
                                                        where rw.Field <string>("Parameter Name") == "True When"
                                                        select rw.Field <string>("Parameter Value")).FirstOrDefault();

                    var appInstanceObj = (OBAppInstance)await appInstanceName.EvaluateCode(engine);

                    if (appInstanceObj == null)
                    {
                        ifResult = false;
                    }
                    else
                    {
                        ifResult = appInstanceObj.Value.InstanceExists();
                    }

                    if (trueWhenAppInstanceExists == "It Does Not Exist")
                    {
                        ifResult = !ifResult;
                    }
                    break;

                default:
                    throw new Exception("If type not recognized!");
                }
            }
            return(ifResult);
        }
예제 #11
0
        public async override Task RunCommand(object sender)
        {
            var    engine     = (IAutomationEngineInstance)sender;
            string windowName = (string)await v_WindowName.EvaluateCode(engine);

            int timeout = (int)await v_Timeout.EvaluateCode(engine);

            var timeToEnd = DateTime.Now.AddSeconds(timeout);

            bool testMode = TestMode;
            //user image to bitmap
            Bitmap userImage = new Bitmap(CommonMethods.Base64ToImage(v_ImageCapture));
            double accuracy;

            try
            {
                accuracy = Convert.ToDouble(await v_MatchAccuracy.EvaluateCode(engine));
                if (accuracy > 1 || accuracy < 0)
                {
                    throw new ArgumentOutOfRangeException("Accuracy value is out of range (0-1)");
                }
            }
            catch (Exception)
            {
                throw new InvalidDataException("Accuracy value is invalid");
            }

            //Activate window if specified
            if (windowName != "None")
            {
                while (timeToEnd >= DateTime.Now)
                {
                    try
                    {
                        if (engine.IsCancellationPending)
                        {
                            break;
                        }

                        User32Functions.ActivateWindow(windowName);

                        if (!User32Functions.GetActiveWindowTitle().Equals(windowName))
                        {
                            throw new Exception($"Window '{windowName}' Not Yet Found... ");
                        }

                        break;
                    }
                    catch (Exception)
                    {
                        engine.ReportProgress($"Window '{windowName}' Not Yet Found... {(timeToEnd - DateTime.Now).Minutes}m, {(timeToEnd - DateTime.Now).Seconds}s remain");
                        Thread.Sleep(500);
                    }
                }

                if (!User32Functions.GetActiveWindowTitle().Equals(windowName))
                {
                    throw new Exception($"Window '{windowName}' Not Found");
                }
                else
                {
                    Thread.Sleep(500);
                }
            }

            dynamic element = null;

            while (timeToEnd >= DateTime.Now)
            {
                try
                {
                    if (engine.IsCancellationPending)
                    {
                        break;
                    }

                    element = CommandsHelper.FindImageElement(userImage, accuracy, engine, timeToEnd);

                    if (element == null)
                    {
                        throw new Exception("Specified image was not found in window!");
                    }
                    else
                    {
                        break;
                    }
                }
                catch (Exception)
                {
                    engine.ReportProgress("Element Not Yet Found... " + (timeToEnd - DateTime.Now).Seconds + "s remain");
                    Thread.Sleep(1000);
                }
            }

            if (element == null)
            {
                FormsHelper.ShowAllForms(engine.EngineContext.IsDebugMode);
                throw new Exception("Specified image was not found in window!");
            }

            PerformImageElementAction(engine, element);
        }