阅读Edge Browser Title&使用System.Windows.Automation的URL

时间:2015-08-25 13:10:59

标签: c# ui-automation microsoft-edge microsoft-ui-automation

我试图宣读TITLE& Microsoft EDGE浏览器中的URL。 最好使用System.Windows.Automation执行此操作,因为代码库已经将此用于其他问题。

  1. 是否可以使用System.Windows.Automation?
  2. 如何访问网址?
  3. 我目前为止:

    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;
                          }
                       }
                    }
                 }
              }
           }
    

1 个答案:

答案 0 :(得分:5)

你快到了。您只需从 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();
}