Quantcast
Channel: Windows Desktop Development for Accessibility and Automation forum
Viewing all articles
Browse latest Browse all 585

Exception with UIA

$
0
0

Environment: Win10 Pro 64bit

Screenario:

   When a pop up shows up , our tool tries to click the 'Yes' button by Invoke(). However , sometimes , a exception is thrown up .I want to know the root cause and the solution !!!

My workaround:

   I wrapped my code with CacheReuest , this helps no exception is thrown , however , the button maybe  not be clicked.

Thrown exception:

Abort Automation , reason : Operation is not valid due to the current state of the object. for developers : at MS.Internal.AutomationProxies.Misc.ThrowWin32ExceptionsIfError(Int32 errorCode) at MS.Internal.AutomationProxies.Misc.SendInput(Int32 inputs, INPUT& ki, Int32 size) at MS.Internal.AutomationProxies.Input.SendKeyboardInputVK(Int16 vk, Boolean press) at MS.Internal.AutomationProxies.Misc.SetFocus(IntPtr hwnd) at MS.Internal.AutomationProxies.WindowsButton.Invoke() at System.Runtime.InteropServices.Marshal.ThrowExceptionForHRInternal(Int32 errorCode, IntPtr errorInfo) at MS.Internal.Automation.UiaCoreApi.CheckError(Int32 hr) at TVSUPluginAutomation.testcases.tvsu_triggerPopup_base.clickPopWin(Int32 timeout) at TVSUPluginAutomation.testcases.tvsu_DownloadAndInstall_multi14_1installedFirst.InstallRemander() at TVSUPluginAutomation.testcases.tvsu_DownloadAndInstall_multi14_1installedFirst.run() at TVSUPluginAutomation.testcases.baseClass.executeTestCase()

My Code:

 protected AutomationElement findPopWinX(int timeout = 5000)
        {
            using (new IdentityScope("", CommonClass.configXML.SelectSingleNode("/root/LocalServer/User").InnerText, CommonClass.configXML.SelectSingleNode("/root/LocalServer/Pass").InnerText, LogonType.NewCredentials, LogonProvider.WinNT50))
            {
                DateTime now = DateTime.Now;
                int _timeout = timeout;

                while (DateTime.Now < now.AddMilliseconds(_timeout))
                {
                    List<AutomationElement> all = new List<AutomationElement>();
                    AutomationElementCollection elementCollection = AutomationElement.RootElement.FindAll(TreeScope.Children, Condition.TrueCondition);
                    AutomationElement ok = null, cancel = null, staticText = null;
                    foreach (AutomationElement child in elementCollection)
                    {
                        try
                        {

                            ok = child.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.AutomationIdProperty, "1"));
                            cancel = child.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.AutomationIdProperty, "2"));
                            staticText = child.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.AutomationIdProperty, "65535"));
                            if (child.Current.ClassName == "#32770" && ok != null && cancel != null && staticText != null)
                            {
                                return child;
                            }

                        }
                        catch (Exception)
                        {

                        }
                    }
                }
            }
            return null;
        }
        protected bool clickPopWin(int timeout = 5000)
        {
            AutomationElement a = findPopWinX();
            if (a==null)
            {
                return false;
            }
            AutomationElement ok = a.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.AutomationIdProperty, "1"));
            if (ok==null)
            {
                return false;
            }
            InvokePattern pat = ok.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
            pat.Invoke();
            return true;
        }


Marcus.




Viewing all articles
Browse latest Browse all 585

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>