public override void RunCommand(object sender) { var engine = (IAutomationEngineInstance)sender; var mouseX = v_XMousePosition.ConvertUserVariableToString(engine); var mouseY = v_YMousePosition.ConvertUserVariableToString(engine); User32Functions.SendMouseMove(mouseX, mouseY, v_MouseClick); }
public async override Task RunCommand(object sender) { var engine = (IAutomationEngineInstance)sender; var mouseX = (int)await v_XMousePosition.EvaluateCode(engine); var mouseY = (int)await v_YMousePosition.EvaluateCode(engine); User32Functions.SendMouseMove(mouseX, mouseY, v_MouseClick); }
private async Task RunCommandActions(IHTMLElement element, object sender, InternetExplorer browserInstance) { var engine = (IAutomationEngineInstance)sender; switch (v_WebAction) { case "Fire onmousedown event": ((IHTMLElement3)element).FireEvent("onmousedown"); break; case "Fire onmouseover event": ((IHTMLElement3)element).FireEvent("onmouseover"); break; case "Invoke Click": element.click(); IECreateBrowserCommand.WaitForReadyState(browserInstance); break; case "Left Click": case "Middle Click": case "Right Click": int elementXposition = FindElementXPosition(element); int elementYposition = FindElementYPosition(element); //inputs need to be validated string userXAdjustString = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "X Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault(); int userXAdjust = (int)await userXAdjustString.EvaluateCode(engine); string userYAdjustString = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Y Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault(); int userYAdjust = (int)await userYAdjustString.EvaluateCode(engine); var ieClientLocation = User32Functions.GetWindowPosition(new IntPtr(browserInstance.HWND)); var mouseX = (elementXposition + ieClientLocation.left + 10) + userXAdjust; // + 10 gives extra padding var mouseY = (elementYposition + ieClientLocation.top + 90 + SystemInformation.CaptionHeight) + userYAdjust; // +90 accounts for title bar height var mouseClick = v_WebAction; User32Functions.SendMouseMove(mouseX, mouseY, v_WebAction); break; case "Set Attribute": string setAttributeName = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Attribute Name" select rw.Field <string>("Parameter Value")).FirstOrDefault(); string valueToSet = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Value To Set" select rw.Field <string>("Parameter Value")).FirstOrDefault(); valueToSet = (string)await valueToSet.EvaluateCode(engine); element.setAttribute(setAttributeName, valueToSet); break; case "Set Text": string setTextAttributeName = "value"; string textToSet = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Text To Set" select rw.Field <string>("Parameter Value")).FirstOrDefault(); textToSet = (string)await textToSet.EvaluateCode(engine); element.setAttribute(setTextAttributeName, textToSet); break; case "Get Attribute": string attributeName = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Attribute Name" select rw.Field <string>("Parameter Value")).FirstOrDefault(); string variableName = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Variable Name" select rw.Field <string>("Parameter Value")).FirstOrDefault(); string convertedAttribute = Convert.ToString(element.getAttribute(attributeName)); convertedAttribute.SetVariableValue(engine, variableName); break; } }
public override void RunCommand(object sender) { var engine = (AutomationEngineInstance)sender; bool testMode = TestMode; //user image to bitmap Bitmap userImage = new Bitmap(Common.Base64ToImage(v_ImageCapture)); double accuracy; try { accuracy = double.Parse(v_MatchAccuracy.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"); } if (testMode) { FindImageElement(userImage, accuracy); return; } dynamic element = null; if (v_ImageAction == "Wait For Image To Exist") { var timeoutText = (from rw in v_ImageActionParameterTable.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 { element = FindImageElement(userImage, accuracy); if (element == null) { throw new Exception("Image Element Not Found"); } else { break; } } catch (Exception) { engine.ReportProgress("Element Not Yet Found... " + (timeToEnd - DateTime.Now).Seconds + "s remain"); Thread.Sleep(1000); } } if (element == null) { throw new Exception("Image Element Not Found"); } return; } else { element = FindImageElement(userImage, accuracy); } try { string clickPosition; int xAdjust; int yAdjust; switch (v_ImageAction) { case "Click Image": string clickType = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Click Type" select rw.Field <string>("Parameter Value")).FirstOrDefault(); clickPosition = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Click Position" select rw.Field <string>("Parameter Value")).FirstOrDefault(); xAdjust = Convert.ToInt32((from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "X Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine)); yAdjust = Convert.ToInt32((from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Y Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine)); Point clickPositionPoint = GetClickPosition(clickPosition, element); //move mouse to position var mouseX = (clickPositionPoint.X + xAdjust).ToString(); var mouseY = (clickPositionPoint.Y + yAdjust).ToString(); User32Functions.SendMouseMove(mouseX, mouseY, clickType); break; case "Set Text": string textToSet = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Text To Set" select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine); clickPosition = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Click Position" select rw.Field <string>("Parameter Value")).FirstOrDefault(); xAdjust = Convert.ToInt32((from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "X Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine)); yAdjust = Convert.ToInt32((from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Y Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine)); string encryptedData = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Encrypted Text" select rw.Field <string>("Parameter Value")).FirstOrDefault(); if (encryptedData == "Encrypted") { textToSet = EncryptionServices.DecryptString(textToSet, "OPENBOTS"); } Point setTextPositionPoint = GetClickPosition(clickPosition, element); //move mouse to position and set text var xPos = (setTextPositionPoint.X + xAdjust).ToString(); var yPos = (setTextPositionPoint.Y + yAdjust).ToString(); User32Functions.SendMouseMove(xPos, yPos, "Left Click"); var simulator = new InputSimulator(); simulator.Keyboard.TextEntry(textToSet); Thread.Sleep(100); break; case "Set Secure Text": var secureString = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Secure String Variable" select rw.Field <string>("Parameter Value")).FirstOrDefault(); clickPosition = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Click Position" select rw.Field <string>("Parameter Value")).FirstOrDefault(); xAdjust = Convert.ToInt32((from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "X Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine)); yAdjust = Convert.ToInt32((from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Y Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault().ConvertUserVariableToString(engine)); var secureStrVariable = secureString.ConvertUserVariableToObject(engine); if (secureStrVariable is SecureString) { secureString = ((SecureString)secureStrVariable).ConvertSecureStringToString(); } else { throw new ArgumentException("Provided Argument is not a 'Secure String'"); } Point setSecureTextPositionPoint = GetClickPosition(clickPosition, element); //move mouse to position and set text var xPosition = (setSecureTextPositionPoint.X + xAdjust).ToString(); var yPosition = (setSecureTextPositionPoint.Y + yAdjust).ToString(); User32Functions.SendMouseMove(xPosition, yPosition, "Left Click"); var simulator2 = new InputSimulator(); simulator2.Keyboard.TextEntry(secureString); Thread.Sleep(100); break; case "Check If Image Exists": var outputVariable = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Output Bool Variable Name" select rw.Field <string>("Parameter Value")).FirstOrDefault(); //remove brackets from variable outputVariable = outputVariable.Replace("{", "").Replace("}", ""); if (element != null) { "True".StoreInUserVariable(engine, outputVariable); } else { "False".StoreInUserVariable(engine, outputVariable); } break; default: break; } UIControlsHelper.ShowAllForms(); } catch (Exception ex) { UIControlsHelper.ShowAllForms(); if (element == null) { throw new Exception("Specified image was not found in window!"); } else { throw ex; } } }
public override void RunCommand(object sender) { var engine = (IAutomationEngineInstance)sender; var vTimeout = int.Parse(v_Timeout.ConvertUserVariableToString(engine)); //create variable window name var variableWindowName = v_WindowName.ConvertUserVariableToString(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 = 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(); //convert potential variable var xAdjustVariable = xAdjust.ConvertUserVariableToString(engine); var yAdjustVariable = yAdjust.ConvertUserVariableToString(engine); int xAdjustInt; int yAdjustInt; //parse to int if (!string.IsNullOrEmpty(xAdjustVariable)) { xAdjustInt = int.Parse(xAdjustVariable); } else { xAdjustInt = 0; } if (!string.IsNullOrEmpty(yAdjustVariable)) { yAdjustInt = int.Parse(yAdjustVariable); } else { yAdjustInt = 0; } //get clickable point var newPoint = requiredHandle.GetClickablePoint(); //send mousemove command User32Functions.SendMouseMove( (newPoint.X + xAdjustInt).ToString(), (newPoint.Y + yAdjustInt).ToString(), clickType); 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, "OPENBOTS"); } 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; // 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.ConvertUserVariableToObject(engine, typeof(SecureString)); 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 "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; searchResult = textPattern.DocumentRange.GetText(-1).TrimEnd('\r').ToString(); // often there is an extra '\r' hanging off the end. } else { searchResult = requiredHandle.Current.Name.ToString(); } searchResult.StoreInUserVariable(engine, applyToVariable, typeof(string)); } else if (v_AutomationType == "Element Exists") { //determine search result if (requiredHandle == null) { searchResult = false; } else { searchResult = true; } searchResult.StoreInUserVariable(engine, applyToVariable, typeof(bool)); } 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).StoreInUserVariable(engine, applyToVariable2, typeof(string)); break; default: throw new NotImplementedException("Automation type '" + v_AutomationType + "' not supported."); } }
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 override Task RunCommand(object sender) { var engine = (IAutomationEngineInstance)sender; var vTimeout = (int)await v_Timeout.EvaluateCode(engine); var seleniumSearchParamRows = (from rw in v_SeleniumSearchParameters.AsEnumerable() where rw.Field <string>("Enabled") == "True" && rw.Field <string>("Parameter Value").ToString() != "" select rw.ItemArray.Cast <string>().ToArray()).ToList(); var browserObject = ((OBAppInstance)await v_InstanceName.EvaluateCode(engine)).Value; var seleniumInstance = (IWebDriver)browserObject; dynamic element = await CommandsHelper.FindElement(engine, seleniumInstance, seleniumSearchParamRows, v_SeleniumSearchOption, vTimeout); if (element == null && v_SeleniumElementAction != "Element Exists") { throw new ElementNotVisibleException("Unable to find element within the provided time limit"); } if (v_SeleniumElementAction.Contains("Click")) { int seleniumWindowHeightY = seleniumInstance.Manage().Window.Size.Height; int elementPositionY = ((IWebElement)element).Location.Y; if (elementPositionY > seleniumWindowHeightY) { string scroll = string.Format("window.scroll(0, {0})", elementPositionY); IJavaScriptExecutor js = browserObject as IJavaScriptExecutor; js.ExecuteScript(scroll); } } Actions actions = new Actions(seleniumInstance); switch (v_SeleniumElementAction) { case "Invoke Click": ((IWebElement)element).Click(); break; case "Left Click": actions.Click((IWebElement)element).Perform(); break; case "Right Click": actions.ContextClick((IWebElement)element).Perform(); break; case "Middle Click": string userXAdjustString = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "X Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault(); int userXAdjust = (int)await userXAdjustString.EvaluateCode(engine); string userYAdjustString = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Y Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault(); int userYAdjust = (int)await userYAdjustString.EvaluateCode(engine); var elementLocation = ((IWebElement)element).Location; var seleniumWindowPosition = seleniumInstance.Manage().Window.Position; User32Functions.SendMouseMove(seleniumWindowPosition.X + elementLocation.X + userXAdjust, seleniumWindowPosition.Y + elementLocation.Y + userYAdjust, v_SeleniumElementAction); break; case "Double Left Click": actions.DoubleClick((IWebElement)element).Perform(); break; case "Hover Over Element": string hoverTime = (from rw in v_WebActionParameterTable.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; actions.MoveToElement((IWebElement)element).Perform(); Thread.Sleep(hoverTimeInt); break; case "Set Text": string textToSetString = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Text To Set" select rw.Field <string>("Parameter Value")).FirstOrDefault(); string textToSet = (string)await textToSetString.EvaluateCode(engine); string clearElement = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Clear Element Before Setting Text" select rw.Field <string>("Parameter Value")).FirstOrDefault(); if (clearElement == null) { clearElement = "No"; } if (clearElement.ToLower() == "yes") { ((IWebElement)element).Clear(); } string[] potentialKeyPresses = textToSet.Split('[', ']'); Type seleniumKeys = typeof(OpenQA.Selenium.Keys); FieldInfo[] fields = seleniumKeys.GetFields(BindingFlags.Static | BindingFlags.Public); //check if chunked string contains a key press command like {ENTER} foreach (string chunkedString in potentialKeyPresses) { if (chunkedString == "") { continue; } if (fields.Any(f => f.Name.ToLower() == chunkedString.ToLower()) && textToSet.Contains($"[{chunkedString}]")) { string keyPress = (string)fields.Where(f => f.Name.ToLower() == chunkedString.ToLower()).FirstOrDefault().GetValue(null); textToSet = textToSet.Replace($"[{chunkedString}]", keyPress); } } ((IWebElement)element).SendKeys(textToSet); break; case "Set Secure Text": var secureString = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Secure String Variable" select rw.Field <string>("Parameter Value")).FirstOrDefault(); string _clearElement = (from rw in v_WebActionParameterTable.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 (_clearElement.ToLower() == "yes") { ((IWebElement)element).Clear(); } string[] _potentialKeyPresses = secureString.Split('[', ']'); Type _seleniumKeys = typeof(OpenQA.Selenium.Keys); FieldInfo[] _fields = _seleniumKeys.GetFields(BindingFlags.Static | BindingFlags.Public); string _finalTextToSet = ""; //check if chunked string contains a key press command like {ENTER} foreach (string chunkedString in _potentialKeyPresses) { if (chunkedString == "") { continue; } if (_fields.Any(f => f.Name.ToLower() == chunkedString.ToLower()) && secureString.Contains("[" + chunkedString + "]")) { string keyPress = (string)_fields.Where(f => f.Name.ToLower() == chunkedString.ToLower()).FirstOrDefault().GetValue(null); _finalTextToSet += keyPress; } else { _finalTextToSet += chunkedString; } } ((IWebElement)element).SendKeys(_finalTextToSet); break; case "Get Options": string applyToVarName = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Variable Name" select rw.Field <string>("Parameter Value")).FirstOrDefault(); string attribNameString = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Attribute Name" select rw.Field <string>("Parameter Value")).FirstOrDefault(); string attribName = (string)await attribNameString.EvaluateCode(engine); var optionsItems = new List <string>(); var ele = (IWebElement)element; var select = new SelectElement(ele); var options = select.Options; foreach (var option in options) { var optionValue = option.GetAttribute(attribName); optionsItems.Add(optionValue); } optionsItems.SetVariableValue(engine, applyToVarName); break; case "Select Option": string selectionType = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Selection Type" select rw.Field <string>("Parameter Value")).FirstOrDefault(); string selectionParamString = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Selection Parameter" select rw.Field <string>("Parameter Value")).FirstOrDefault(); string selectionParam = (string)await selectionParamString.EvaluateCode(engine); seleniumInstance.SwitchTo().ActiveElement(); var el = (IWebElement)element; var selectionElement = new SelectElement(el); switch (selectionType) { case "Select By Index": selectionElement.SelectByIndex(int.Parse(selectionParam)); break; case "Select By Text": selectionElement.SelectByText(selectionParam); break; case "Select By Value": selectionElement.SelectByValue(selectionParam); break; case "Deselect By Index": selectionElement.DeselectByIndex(int.Parse(selectionParam)); break; case "Deselect By Text": selectionElement.DeselectByText(selectionParam); break; case "Deselect By Value": selectionElement.DeselectByValue(selectionParam); break; case "Deselect All": selectionElement.DeselectAll(); break; default: throw new NotImplementedException(); } break; case "Get Text": case "Get Attribute": case "Get Count": string VariableName = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Variable Name" select rw.Field <string>("Parameter Value")).FirstOrDefault(); string attributeNameString = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Attribute Name" select rw.Field <string>("Parameter Value")).FirstOrDefault(); string attributeName = (string)await attributeNameString.EvaluateCode(engine); string elementValue; if (v_SeleniumElementAction == "Get Text") { elementValue = element.Text; } else if (v_SeleniumElementAction == "Get Count") { elementValue = "1"; if (element is ReadOnlyCollection <IWebElement> ) { elementValue = ((ReadOnlyCollection <IWebElement>)element).Count().ToString(); } } else { elementValue = ((IWebElement)element).GetAttribute(attributeName); } elementValue.SetVariableValue(engine, VariableName); break; case "Get Matching Element(s)": var variableName = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Variable Name" select rw.Field <string>("Parameter Value")).FirstOrDefault(); if (!(element is IWebElement)) { //create element list List <IWebElement> elementList = new List <IWebElement>(); foreach (IWebElement item in element) { elementList.Add(item); } elementList.SetVariableValue(engine, variableName); } else { ((IWebElement)element).SetVariableValue(engine, variableName); } break; case "Get Table": var DTVariableName = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Variable Name" select rw.Field <string>("Parameter Value")).FirstOrDefault(); // Get HTML (Source) of the Element string tableHTML = ((IWebElement)element).GetAttribute("innerHTML").ToString(); HtmlDocument doc = new HtmlDocument(); //Load Source (String) as HTML Document doc.LoadHtml(tableHTML); //Get Header Tags var headers = doc.DocumentNode.SelectNodes("//tr/th"); DataTable DT = new DataTable(); //If headers found if (headers != null && headers.Count != 0) { // add columns from th (headers) foreach (HtmlNode header in headers) { DT.Columns.Add(Regex.Replace(header.InnerText, @"\t|\n|\r", "").Trim()); } } else { var columnsCount = doc.DocumentNode.SelectSingleNode("//tr[1]").ChildNodes.Where(node => node.Name == "td").Count(); DT.Columns.AddRange((Enumerable.Range(1, columnsCount).Select(dc => new DataColumn())).ToArray()); } // select rows with td elements and load each row (containing <td> tags) into DataTable foreach (var row in doc.DocumentNode.SelectNodes("//tr[td]")) { DT.Rows.Add(row.SelectNodes("td").Select(td => Regex.Replace(td.InnerText, @"\t|\n|\r", "").Trim()).ToArray()); } DT.SetVariableValue(engine, DTVariableName); break; case "Clear Element": ((IWebElement)element).Clear(); break; case "Switch to Frame": if (seleniumSearchParamRows.Count == 0) { seleniumInstance.SwitchTo().DefaultContent(); } else { seleniumInstance.SwitchTo().Frame((IWebElement)element); } break; case "Wait For Element To Exist": break; case "Element Exists": string existsBoolVariableName = (from rw in v_WebActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Variable Name" select rw.Field <string>("Parameter Value")).FirstOrDefault(); if (element == null) { false.SetVariableValue(engine, existsBoolVariableName); } else { true.SetVariableValue(engine, existsBoolVariableName); } break; default: throw new Exception("Element Action was not found"); } }
public async void PerformImageElementAction(IAutomationEngineInstance engine, ImageElement element) { try { string clickPosition; string xAdjustString; string yAdjustString; int xAdjust; int yAdjust; switch (v_ImageAction) { case "Click Image": string clickType = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Click Type" select rw.Field <string>("Parameter Value")).FirstOrDefault(); clickPosition = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Click Position" select rw.Field <string>("Parameter Value")).FirstOrDefault(); xAdjustString = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "X Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault(); xAdjust = (int)await xAdjustString.EvaluateCode(engine); yAdjustString = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Y Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault(); yAdjust = (int)await yAdjustString.EvaluateCode(engine); Point clickPositionPoint = GetClickPosition(clickPosition, element); //move mouse to position var mouseX = clickPositionPoint.X + xAdjust; var mouseY = clickPositionPoint.Y + yAdjust; User32Functions.SendMouseMove(mouseX, mouseY, clickType); break; case "Hover Over Image": string hoverPosition = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Hover Position" select rw.Field <string>("Parameter Value")).FirstOrDefault(); string hoverTime = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Hover Time (Seconds)" select rw.Field <string>("Parameter Value")).FirstOrDefault(); xAdjustString = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "X Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault(); xAdjust = (int)await xAdjustString.EvaluateCode(engine); yAdjustString = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Y Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault(); yAdjust = (int)await yAdjustString.EvaluateCode(engine); int evaluatedHoverTime = (int)await hoverTime.EvaluateCode(engine) * 1000; Point hoverPositionPoint = GetClickPosition(hoverPosition, element); //move mouse to position var hoverX = hoverPositionPoint.X + xAdjust; var hoverY = hoverPositionPoint.Y + yAdjust; User32Functions.SendMouseMove(hoverX, hoverY, ""); Thread.Sleep(evaluatedHoverTime); break; case "Set Text": string textToSet = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Text To Set" select rw.Field <string>("Parameter Value")).FirstOrDefault(); textToSet = (string)await textToSet.EvaluateCode(engine); clickPosition = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Click Position" select rw.Field <string>("Parameter Value")).FirstOrDefault(); xAdjustString = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "X Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault(); xAdjust = (int)await xAdjustString.EvaluateCode(engine); yAdjustString = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Y Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault(); yAdjust = (int)await yAdjustString.EvaluateCode(engine); Point setTextPositionPoint = GetClickPosition(clickPosition, element); //move mouse to position and set text var xPos = setTextPositionPoint.X + xAdjust; var yPos = setTextPositionPoint.Y + yAdjust; User32Functions.SendMouseMove(xPos, yPos, "Left Click"); Thread.Sleep(250); var simulator = new InputSimulator(); simulator.Keyboard.TextEntry(textToSet); Thread.Sleep(100); break; case "Set Secure Text": var secureString = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Secure String Variable" select rw.Field <string>("Parameter Value")).FirstOrDefault(); clickPosition = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Click Position" select rw.Field <string>("Parameter Value")).FirstOrDefault(); xAdjustString = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "X Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault(); xAdjust = (int)await xAdjustString.EvaluateCode(engine); yAdjustString = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Y Adjustment" select rw.Field <string>("Parameter Value")).FirstOrDefault(); yAdjust = (int)await yAdjustString.EvaluateCode(engine); var secureStrVariable = (SecureString)await secureString.EvaluateCode(engine); secureString = secureStrVariable.ConvertSecureStringToString(); Point setSecureTextPositionPoint = GetClickPosition(clickPosition, element); //move mouse to position and set text var xPosition = setSecureTextPositionPoint.X + xAdjust; var yPosition = setSecureTextPositionPoint.Y + yAdjust; User32Functions.SendMouseMove(xPosition, yPosition, "Left Click"); Thread.Sleep(250); var simulator2 = new InputSimulator(); simulator2.Keyboard.TextEntry(secureString); Thread.Sleep(100); break; case "Image Exists": var outputVariable = (from rw in v_ImageActionParameterTable.AsEnumerable() where rw.Field <string>("Parameter Name") == "Output Bool Variable Name" select rw.Field <string>("Parameter Value")).FirstOrDefault(); if (element != null) { true.SetVariableValue(engine, outputVariable); } else { false.SetVariableValue(engine, outputVariable); } break; default: break; } FormsHelper.ShowAllForms(engine.EngineContext.IsDebugMode); } catch (Exception ex) { FormsHelper.ShowAllForms(engine.EngineContext.IsDebugMode); throw ex; } }