Есть ли способ вывести дерево автоматизации пользовательского интерфейса Windows в определенный момент времени?
Я пытаюсь отладить некоторые сценарии (которые используют поддержку автоматизации пользовательского интерфейса Windows для идентификации объекта GUI), которые я разработал и которые периодически терпят неудачу, потому что они не могут найти определенные элементы управления в дереве. Я также использую скриншоты для проверки состояния окна, которое я тестирую, и кажется, что элементы управления есть в графическом интерфейсе, но мой поиск внутри дерева не находит их (даже после нескольких секунд сна). Когда я использую inspect.exe для проверки дерева, объекты там.
Есть ли способ сбросить это дерево для последующего анализа? Единственный способ, который я нашел до сих пор, - это рекурсивное сканирование всего дерева, но это неосуществимо, так как это занимает очень много времени.
1 ответ
Вот мой код:
public static string DumpUIATree(this AutomationElement element, bool dumpFullInfo = false)
{
var s = element.Name() + " : " + element.ControlType().ProgrammaticName;
DumpChildrenRecursively(element, 1, ref s, dumpFullInfo);
return s;
}
private static List<AutomationElement> GetChildNodes(this AutomationElement automationElement)
{
var children = new List<AutomationElement>();
TreeWalker walker = TreeWalker.ControlViewWalker;
AutomationElement child = walker.GetFirstChild(automationElement);
while (child != null)
{
children.Add(child);
child = walker.GetNextSibling(child);
}
return children;
}
private static void DumpChildrenRecursively(AutomationElement node, int level, ref string s, bool dumpFullInfo = false)
{
var children = node.GetChildNodes();
foreach (var child in children)
{
if (child != null)
{
for (int i = 0; i < level; i++)
s += "-";
s += " " + child.Name() + " : " + child.ControlType().ProgrammaticName + "\r\n";
if (dumpFullInfo)
{
foreach (var prop in child.GetSupportedProperties())
{
s += " > " + prop.ProgrammaticName + " = " + child.GetCurrentPropertyValue(prop) + "\r\n";
}
s += "\r\n";
}
DumpChildrenRecursively(child, level + 1, ref s, dumpFullInfo);
}
}
}