private void WalkTree(AutomationElement parent, TreeWalker walker, XmlWriter writer, IList<AutomationElement> elements)
{
var element = this.elementFactory.GetElement(parent);
writer.WriteStartElement(element.TypeName);
if (elements != null)
{
writer.WriteAttributeString("_index_", elements.Count.ToString());
elements.Add(parent);
}
writer.WriteAttributeString("id", element.ID);
writer.WriteAttributeString("framework", element.UIFramework);
writer.WriteAttributeString("name", element.Name);
writer.WriteAttributeString("value", element.Value);
writer.WriteAttributeString("class", element.ClassName);
writer.WriteAttributeString("help", element.Help);
writer.WriteAttributeString("visible", element.Visible ? "true" : "false");
writer.WriteAttributeString("enabled", element.Enabled ? "true" : "false");
writer.WriteAttributeString("focusable", element.Focusable ? "true" : "false");
writer.WriteAttributeString("focused", element.Focused ? "true" : "false");
writer.WriteAttributeString("selected", element.Selected ? "true" : "false");
writer.WriteAttributeString("protected", element.Protected ? "true" : "false");
writer.WriteAttributeString("scrollable", element.Scrollable ? "true" : "false");
writer.WriteAttributeString("handle", element.Handle.ToString());
writer.WriteAttributeString("x", element.X.ToString());
writer.WriteAttributeString("y", element.Y.ToString());
writer.WriteAttributeString("width", element.Width.ToString());
writer.WriteAttributeString("height", element.Height.ToString());
writer.WriteAttributeString(
"bounds",
string.Format("[{0},{1}][{2},{3}]", element.X, element.Y, element.Width, element.Height));
var node = walker.GetFirstChild(parent);
var children = new List<AutomationElement>();
while (node != null)
{
this.WalkTree(node, walker, writer, elements);
children.Add(node);
node = walker.GetNextSibling(node);
// GetNextSibling may recursively return the first child again.
if (node != null && children.Contains(node))
{
logger.Warn("Next sibling node causes a loop. STOP!");
node = null;
break;
}
}
writer.WriteEndElement();
}