I am currently using UIA to get the URL from Chrome, Firefox and IE11 using the following method:
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'. However, although the above method is working for other web browsers, this doesn't seem to be the case with Edge.
'elmUrlBar' always ends up being null and doesn't get found.