C#UIA获取Microsoft Edge URL

时间:2017-09-28 13:43:58

标签: c# ui-automation microsoft-edge

我目前正在使用UIA使用以下方法从Chrome,Firefox和IE11获取网址:

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

使用Inspect,我可以看到Edge中的URL栏由“搜索或输入网址”标识。但是,尽管上述方法适用于其他Web浏览器,但Edge似乎并非如此。

'elmUrlBar'总是最终为空并且找不到。

1 个答案:

答案 0 :(得分:0)

此代码适用于最新版本的Firefox,Internet Explorer,MS Edge和Chrome。此方法比按名称查找地址栏更快。而这种方法并不依赖于系统的本地化。

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