Я работаю над структурой автоматизации 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 минут?