简体   繁体   English

C#UIA获取Microsoft Edge URL

[英]C# UIA Get Microsoft Edge URL

I am currently using UIA to get the URL from Chrome, Firefox and IE11 using the following method: 我目前正在使用UIA,通过以下方法从Chrome,Firefox和IE11获取URL:

string processName = "";

if (browser.Equals(BrowserType.GOOGLE_CHROME))
    processName = "chrome";
else if (browser.Equals(BrowserType.FIREFOX))
    processName = "firefox";
else if (browser.Equals(BrowserType.INTERNET_EXPLORER))
    processName = "iexplore";
else if (browser.Equals(BrowserType.MICROSOFT_EDGE))
    processName = "MicrosoftEdgeCP";

foreach(Process process in Process.GetProcessesByName(processName))
{
    string url = GetURLFromProcess(process, browser);
    if (url == null)
        continue;

    return url;
}

...

private string GetURLFromProcess(Process process, BrowserType browser)
{
    if (process == null)
        throw new ArgumentNullException("process");

    if (process.MainWindowHandle == IntPtr.Zero)
        return null;

    AutomationElement elm = AutomationElement.FromHandle(process.MainWindowHandle);
    if (elm == null)
        return null;
    string nameProperty = "";

    if (browser.Equals(BrowserType.GOOGLE_CHROME))
        nameProperty = "Address and search bar";
    else if (browser.Equals(BrowserType.FIREFOX))
        nameProperty = "Search or enter address";
    else if (browser.Equals(BrowserType.INTERNET_EXPLORER))
        nameProperty = "Address and search using Bing";
    else if (browser.Equals(BrowserType.MICROSOFT_EDGE))
        nameProperty = "Search or enter web address";

    AutomationElement elmUrlBar = elm.FindFirst(TreeScope.Subtree, new AndCondition(
        new PropertyCondition(AutomationElement.NameProperty, nameProperty, PropertyConditionFlags.IgnoreCase),
        new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit)));

    if (elmUrlBar != null)
    {
        return ((ValuePattern)elmUrlBar.GetCurrentPattern(ValuePattern.Pattern)).Current.Value as string;
    }

    return null;
}

Using Inspect, I can see that the URL bar in Edge is identified by 'Search or enter web address'. 使用Inspect,我可以看到Edge中的URL栏由“搜索或输入网址”标识。 However, although the above method is working for other web browsers, this doesn't seem to be the case with Edge. 但是,尽管上述方法适用于其他Web浏览器,但Edge似乎并非如此。

'elmUrlBar' always ends up being null and doesn't get found. 'elmUrlBar'总是以null结束并且找不到。

This code works in the last version Firefox, Internet Explorer, MS Edge and Chrome. 该代码在Firefox,Internet Explorer,MS Edge和Chrome的最新版本中有效。 This method works faster, than find address bar by name. 此方法比按名称查找地址栏更快。 And this method doesn't depend on localization of system. 而且这种方法不依赖于系统的本地化。

private string GetURLFromProcess(Process process, BrowserType browser)
{
    if (process == null)
        throw new ArgumentNullException("process");

    if (process.MainWindowHandle == IntPtr.Zero)
        return null;

    AutomationElement elm = AutomationElement.FromHandle(process.MainWindowHandle);
    if (elm == null)
        return null;
    string nameProperty = "";

    if (browser.Equals(BrowserType.GOOGLE_CHROME))
        {
            var elm1 = elm.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "Google Chrome"));
            if (elm1 == null) { return null; } // not the right chrome.exe
            var elm2 = elm1.FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, ""))[1];
            var elm3 = elm2.FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, ""))[1];
            var elm4 = elm3.FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, ""))[1];
            var elm5 = elm4.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, ""));
            var elmUrlBar = elm5.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));
            var url = ((ValuePattern)elmUrlBar.GetCurrentPattern(ValuePattern.Pattern)).Current.Value as string;
            return url;
        }
    else if (browser.Equals(BrowserType.FIREFOX))
        {
             AutomationElement elm2 = elm.FindFirst(TreeScope.Children, new AndCondition(new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ToolBar),
                    new PropertyCondition(AutomationElement.IsInvokePatternAvailableProperty, false)));
            if (elm2 == null)
                return null;
            var elm3 = elm2.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ComboBox));
            if (elm3 == null)
                return null;
            var elmUrlBar = elm3.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));
            if (elmUrlBar != null)
            {
                var url = ((ValuePattern)elmUrlBar.GetCurrentPattern(ValuePattern.Pattern)).Current.Value as string;
                url;
            }
        }
    else if (browser.Equals(BrowserType.INTERNET_EXPLORER))
        {
             AutomationElement elm2 = elm.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.ClassNameProperty, "ReBarWindow32"));
             if (elm2 == null)
                 return null;
             AutomationElement elmUrlBar = elm2.FindFirst(TreeScope.Subtree, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));
             var url = ((ValuePattern)elmUrlBar.GetCurrentPattern(ValuePattern.Pattern)).Current.Value as string;
             return url;
        }
    else if (browser.Equals(BrowserType.MICROSOFT_EDGE))
        {
            var elm2 = elm.FindFirst(TreeScope.Children, new AndCondition(
            new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Window),
            new PropertyCondition(AutomationElement.NameProperty, "Microsoft Edge")));

            var elmUrlBar = elm2.FindFirst(TreeScope.Children,
                new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Edit));

            var url = ((TextPattern)elmUrlBar.GetCurrentPattern(TextPattern.Pattern)).DocumentRange.GetText(int.MaxValue);
            return url;
        }

    return null;
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM