使用System.Windows.Automation读取Edge Browser Title和Url

我正在尝试从Microsoft EDGE浏览器中读出TITLE和URL。 最好使用System.Windows.Automation执行此操作,因为代码库已经将此用于其他问题。

  1. 是否可以使用System.Windows.Automation?
  2. 如何访问URL?

我现在这么远:

AutomationId "TitleBar" ClassName "ApplicationFrameWindow" Name = [string] => Reading out this element gives me the TITLE => Walking it's children, I find the item "addressEditBox": AutomationId "addressEditBox" ClassName "RichEditBox" Name "Search or enter web address" => I always get back the string "Search or enter web address" => This is the control where the url is in, though it isn't updated as the user goes to a website, it always returns a fixed string. 

在代码中:

  var digger1 = AutomationElement.FromHandle(process.MainWindowHandle).RootElement.FindAll(TreeScope.Children, Condition.TrueCondition); foreach(AutomationElement d1 in digger1 { if(d1.Current.ClassName.Equals("ApplicationFrameWindow")) { var digger2 = d1.FindAll(TreeScope.Children, Condition.TrueCondition); foreach(AutomationElement d2 in digger2) { if(d2.Current.ClassName.Equals("Windows.Ui.Core.CoreWindow")) { var digger3 = d2.FindAll(TreeScope.Children, Condition.TrueCondition); foreach(AutomationElement d3 in digger3) { if(d3.Current.AutomationId.Equals("addressEditBox")) { var url = d3.Current.Name; return url; } } } } } } 

你快到了。 您只需要从addressEditBox元素中获取TextPattern 。 这是一个完整的示例控制台应用程序,可以在桌面上转储所有当前运行的Edge的窗口:

 class Program { static void Main(string[] args) { AutomationElement main = AutomationElement.FromHandle(GetDesktopWindow()); foreach(AutomationElement child in main.FindAll(TreeScope.Children, PropertyCondition.TrueCondition)) { AutomationElement window = GetEdgeCommandsWindow(child); if (window == null) // not edge continue; Console.WriteLine("title:" + GetEdgeTitle(child)); Console.WriteLine("url:" + GetEdgeUrl(window)); Console.WriteLine(); } } public static AutomationElement GetEdgeCommandsWindow(AutomationElement edgeWindow) { return edgeWindow.FindFirst(TreeScope.Children, new AndCondition( new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window), new PropertyCondition(AutomationElement.NameProperty, "Microsoft Edge"))); } public static string GetEdgeUrl(AutomationElement edgeCommandsWindow) { var adressEditBox = edgeCommandsWindow.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.AutomationIdProperty, "addressEditBox")); return ((TextPattern)adressEditBox.GetCurrentPattern(TextPattern.Pattern)).DocumentRange.GetText(int.MaxValue); } public static string GetEdgeTitle(AutomationElement edgeWindow) { var adressEditBox = edgeWindow.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.AutomationIdProperty, "TitleBar")); return adressEditBox.Current.Name; } [DllImport("user32")] public static extern IntPtr GetDesktopWindow(); }