我目前正在使用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'总是最终为空并且找不到。
答案 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;
}