User interface 有没有办法在某一时刻转储Windows UI自动化树?

User interface 有没有办法在某一时刻转储Windows UI自动化树?,user-interface,tree,ui-automation,microsoft-ui-automation,User Interface,Tree,Ui Automation,Microsoft Ui Automation,我正在尝试调试我开发的一些脚本(使用Windows UI自动化支持来识别GUI对象),这些脚本由于无法在树中找到某些控件而间歇性失败。我还使用屏幕截图来检查我正在测试的窗口的状态,看起来控件在GUI中,但我在树中的搜索没有找到它们(即使在睡眠几秒钟后)。当我使用inspect.exe检查树时,对象就在那里 有没有办法转储该树以供以后分析?到目前为止,我找到的唯一方法是递归地对整个树进行爬网,但这是不可行的,因为这需要花费大量的时间。以下是我的代码: public static string Du

我正在尝试调试我开发的一些脚本(使用Windows UI自动化支持来识别GUI对象),这些脚本由于无法在树中找到某些控件而间歇性失败。我还使用屏幕截图来检查我正在测试的窗口的状态,看起来控件在GUI中,但我在树中的搜索没有找到它们(即使在睡眠几秒钟后)。当我使用inspect.exe检查树时,对象就在那里

有没有办法转储该树以供以后分析?到目前为止,我找到的唯一方法是递归地对整个树进行爬网,但这是不可行的,因为这需要花费大量的时间。

以下是我的代码:

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);
    }
  }
}
公共静态字符串DumpUIATree(此AutomationElement元素,bool dumpFullInfo=false)
{
var s=element.Name()+“:”+element.ControlType().ProgrammaticName;
DumpChildrenRecursive(元素,1,参考s,dumpFullInfo);
返回s;
}
私有静态列表GetChildNodes(此AutomationElement AutomationElement)
{
var children=新列表();
TreeWalker=TreeWalker.ControlViewWalker;
AutomationElement子对象=walker.GetFirstChild(AutomationElement);
while(child!=null)
{
添加(child);
child=walker.GetNextSibling(child);
}
返回儿童;
}
私有静态void dumpchildren递归(AutomationElement节点,int级别,ref字符串s,bool dumpFullInfo=false)
{
var childrends=node.GetChildNodes();
foreach(儿童中的儿童变量)
{
if(child!=null)
{
对于(int i=0;i”+prop.ProgrammaticName+“=”+child.GetCurrentPropertyValue(prop)+“\r\n”;
}
s+=“\r\n”;
}
DumpChildrenRecursive(子级,级别+1,参考s,dumpFullInfo);
}
}
}

您可能没有利用缓存。你能发布你的代码来转储这棵树吗?我没有转储这棵树的代码。几周前我试着爬那棵树,但只是快速地看了一眼,就把那件作品扔了。但如果你说缓存可能会有帮助,我将尝试研究这一途径。谢谢您没有提到您使用的是哪种语言,因此我无法提供进一步的指导。在一些地方,我需要插入“Current”,例如child.Current.Name而不是child.Name(),但一般来说,它是有效的。谢谢