Exemple #1
0
        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);
        }
Exemple #2
0
        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;
                }
            }
        }
Exemple #5
0
        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.");
            }
        }
Exemple #6
0
        public async override Task RunCommand(object sender)
        {
            var engine   = (IAutomationEngineInstance)sender;
            var vTimeout = (int)await v_Timeout.EvaluateCode(engine);

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

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

            AutomationElement requiredHandle = null;

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

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

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

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

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

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

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

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

                int xAdjustInt;
                int yAdjustInt;

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

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

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

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

                break;

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

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

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

                int xHoverAdjustInt;
                int yHoverAdjustInt;

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

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

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

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

                break;

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


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

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

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

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

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

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

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

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

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

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

                secureString = secureStrVariable.ConvertSecureStringToString();

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

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

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

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

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

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

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

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

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

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

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

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

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

                break;

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

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

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

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

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

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

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

                bool          toggleState;
                TogglePattern togPattern;

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

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

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

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

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

                bool          toggleState2;
                TogglePattern togPattern2;

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

                toggleState2.SetVariableValue(engine, applyStateToVariable);
                break;

            default:
                throw new NotImplementedException("Automation type '" + v_AutomationType + "' not supported.");
            }
        }
Exemple #7
0
        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");
            }
        }
Exemple #8
0
        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;
            }
        }