C# UIA Get Microsoft Edge URL



我目前正在使用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;
}

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

'elmurlbar'总是最终以null且没有找到。

此代码在最后版本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;
}

最新更新