以正确的顺序获取chrome标签

时间:2016-02-24 10:01:00

标签: c# google-chrome

我正在尝试按照浏览器标签栏中列出的顺序获取Chrome标签列表。

这是我的代码:

var automationElements = AutomationElement.FromHandle(proc.MainWindowHandle);

// Find `New Tab` element
var propCondNewTab = new PropertyCondition(AutomationElement.NameProperty, "New Tab");
var elemNewTab = automationElements.FindFirst(TreeScope.Descendants, propCondNewTab);

// Get parent of `New Tab` element
var treeWalker = TreeWalker.ControlViewWalker;
var elemTabStrip = treeWalker.GetParent(elemNewTab);

// Loop through all tabs
var tabItemCondition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.TabItem);
foreach (AutomationElement tabItem in elemTabStrip.FindAll(TreeScope.Children, tabItemCondition)) {
    var nameProperty = tabItem.GetCurrentPropertyValue(AutomationElement.NameProperty);
    Debug.WriteLine("title: " + nameProperty.ToString());
}

但是在foreach循环中,标题与浏览器中的标题顺序不同。有没有办法让它们按正确的顺序排列?

2 个答案:

答案 0 :(得分:3)

我不知道获取标签顺序的直接方法。你可以做的是得到标签矩形的位置,并按照矩形在X轴上的位置来排序标签。

一个非常快速的示例,我使用SortedDictionary来保存选项卡及其X值。然后,循环遍历字典中的键并提取选项卡项。由于字典已排序,因此键是按顺序排列的,因此列表将按照浏览器中显示选项卡的顺序排列。

SortedDictionary<double, AutomationElement> orderedTabItems = new SortedDictionary<double, AutomationElement>();

// Loop through all tabs
var tabItemCondition = new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.TabItem);
foreach (AutomationElement tabItem in elemTabStrip.FindAll(TreeScope.Children, tabItemCondition))
{
    Rect rectangleProperty = (Rect)tabItem.GetCurrentPropertyValue(AutomationElement.BoundingRectangleProperty);
    orderedTabItems.Add(rectangleProperty.X, tabItem);
}

for(int i = 0; i < orderedTabItems.Keys.Count; i++)
{
    var key = orderedTabItems.Keys.ElementAt(i);
    var tabItem = orderedTabItems[key];
    var nameProperty = tabItem.GetCurrentPropertyValue(AutomationElement.NameProperty);
    Debug.WriteLine("index: " + i + ", title: " + nameProperty.ToString());
}

我确信可以提供更好的解决方案。这是我第一次尝试使用System.Windows.Automation

修改:我忘了提及,要访问矩形的X属性,您需要添加对WindowsBase.dll的引用并在代码中引用它:< / p>

using System.Windows;

答案 1 :(得分:0)

您可以使用Microsoft Active Accessibility(MSAA)获取正确的选项卡顺序。此方法不依赖于屏幕坐标,就像其他答案一样。以下是您需要做的事情:

  1. 获取课程Chrome_WidgetWin_1和标题“New Tab - Google Chrome
  2. 的Chrome顶级窗口可访问对象
  3. 获取角色“page tab list
  4. 的Accessible对象
  5. 获取第2点中找到的对象的无障碍儿童
  6. 遍历子项列表并显示accName属性。
  7. 有一个很好的article可以帮助您开始使用MSAA