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"); } }
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."); } }
/// <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); }
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); }
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]); } }
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); }
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."); } }
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); }
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); }