AutomationElement.FindFirst резко останавливает программу - PullRequest
0 голосов
/ 05 мая 2020

Я работаю над структурой автоматизации Windows уже несколько месяцев, но я не могу найти причину этой проблемы.

У меня есть функция, которая принимает Hashtable с некоторыми деталями и должен возвращать AutomationElement, соответствующий деталям в нем.

Вот функция:

public static AutomationElement BVTItemToAutoElem(Hashtable LineItem)
        {
            string[] Hierarchy = LineItem[ExtractCSV.HierarchyColName].ToString().Split(',');
            string[] HierarchyNames = LineItem[ExtractCSV.HierarchyNamesColName].ToString().Split(',');
            string[] HierarchyClass = LineItem[ExtractCSV.HierarchyClassesColName].ToString().Split(',');
            AutomationElement _ReturnElement = AutomationElement.RootElement;

            int MaxIdx = Hierarchy.Length;
            int Idx = 0;
            while (_ReturnElement != null && Idx < MaxIdx)
            {
                int CtrlID = (int)(AutomationControlType)Enum.Parse(typeof(AutomationControlType), Hierarchy[Idx].Trim(), true)
                    + 50000;
                string ElemName = HierarchyNames[Idx].Trim().Contains("*") ? "" : HierarchyNames[Idx].Trim();
                string ElemClass = HierarchyClass[Idx].Trim().Contains("*") ? "" : HierarchyClass[Idx].Trim();                

                AndCondition AllConditions = new AndCondition(new PropertyCondition(AutomationElement.NameProperty, ElemName, PropertyConditionFlags.IgnoreCase),
                    new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.LookupById(CtrlID)),
                    new PropertyCondition(AutomationElement.ClassNameProperty, ElemClass, PropertyConditionFlags.IgnoreCase));

                _ReturnElement = _ReturnElement.FindFirst(TreeScope.Descendants, AllConditions);
                Idx++;
            }
            return _ReturnElement;
        }

Где значения строковых массивов

Hierarchy = { "window", "pane" }
HierarchyNames = { "*cell", "*" }
HierarchyClass = { "FrameWindowImpl", "HNxlView" } 

Теперь я понимаю, что использовать подстановочные знаки для поиска элементов невозможно, но могут быть ситуации, когда входные данные могут содержать *.

Я пробовал режим отладки, но на первом l oop, программа внезапно останавливается на

_ReturnElement = _ReturnElement.FindFirst(TreeScope.Descendants, AllConditions);

, даже не дойдя до оператора return, что приводит к появлению GUI в состоянии, которого нельзя предвидеть.

Я пробовал пошаговый режим по каждой строке, когда я дохожу до этой функции, но, похоже, все в порядке.

О, а теперь, примерно через 15 минут после первого запуска, я внезапно похоже, обнаружил исключение NullReferenceException в той точке программы, которая должна использовать этот элемент. Это нормально и точно так, как должно было быть 15 минут назад.

Есть предложения? Пожалуйста, просветите меня.


Я могу подумать о том, что FindFirst имеет слишком много от windows до go, как и во время первого l oop, аргументы - это «окно» для type , '' для name и 'FrameWindowImpl' для class .

Требуется ли тайм-аут? Если да, то как?

Изменить 1: я использую его с WPF. Если эта функция вызывается в основном потоке, GUI зависает на все время, пока не будет выброшено исключение NullReferenceException. Но, поскольку я запускаю это с TaskFactory, с GUI все в порядке.

Но, несмотря на то, что все еще вызывает беспокойство, почему все это происходит? Любые возможные способы обойти это? Кроме того, почему отладчик не остается на этой команде в течение ~ 15 минут?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...