private static void PropertiesAndPatterns(AutomationElement element, IndentedTextWriter writer, bool all = true) { if (all) { foreach (var pattern in element.GetSupportedPatterns()) { writer.WriteLine(pattern.ProgrammaticName); writer.Indent++; var currentPattern = element.GetCurrentPattern(pattern); writer.WriteLine(currentPattern); if (currentPattern.GetType().GetProperty("Current") is { } currentProperty&& currentProperty.GetValue(currentPattern) is { } value) { foreach (var property in value.GetType().GetProperties()) { writer.WriteLine($"{property.Name} {property.GetValue(value) ?? "null"}"); } } writer.Indent--; } foreach (var property in element.GetSupportedProperties().OrderBy(x => x.ProgrammaticName)) { writer.WriteLine($"{property.ProgrammaticName.TrimStart("AutomationElementIdentifiers.").TrimEnd("Property")} {element.GetCurrentPropertyValue(property) ?? "null"}"); } writer.WriteLine(); } else { var info = element.Current; writer.WriteLine($"ControlType: {info.ControlType.ProgrammaticName} (LocalizedControlType: {info.LocalizedControlType})"); writer.WriteLine($"ClassName: {info.ClassName}"); writer.WriteLine($"Name: {info.Name}"); writer.WriteLine($"AutomationId: {info.AutomationId}"); writer.WriteLine($"IsContentElement: {info.IsContentElement} IsControlElement: {info.IsControlElement}"); writer.WriteLine($"Properties: {string.Join(", ", element.GetSupportedProperties().Select(x => x.ProgrammaticName.TrimStart("AutomationElementIdentifiers.").TrimEnd("Property")).OrderBy(x => x))}"); writer.WriteLine($"Patterns: {string.Join(", ", element.GetSupportedPatterns().Select(x => x.ProgrammaticName.TrimEnd("Identifiers.Pattern").TrimEnd("Pattern")).OrderBy(x => x))}"); writer.WriteLine(); } }