在打开的对话框中查找automationElement的C#递归

时间:2016-03-04 22:38:14

标签: c# recursion ui-automation automationelement

点击下载按钮后,我正在尝试浏览文件。但是我写了一个递归函数,它使用AutomationElement库找到任何窗口中的控件,所以希望我可以在打开的对话框窗口中找到嵌套控件。此功能现在不起作用。如果您有任何建议,请告诉我这里的问题在哪里或告诉我。

问题是它永远不会进入else语句而永远不会结束。所以我认为它根本找不到元素。

这是突出显示我正在尝试使用的元素:

screenshot from inspect

由于

 private AutomationElement GetElement(AutomationElement element, Condition conditions, string className)
    {
        AutomationElement boo = null;
        foreach (AutomationElement c in element.FindAll(TreeScope.Subtree, Automation.ControlViewCondition))
        {
            var child = c;
            if (c.Current.ClassName.Contains(className) == false)
            {
                GetElement(child, conditions, className);   
             }
            else
            {
                boo = child.FindFirst(TreeScope.Descendants, conditions);
            }
        }

        return boo;
    }

1 个答案:

答案 0 :(得分:0)

树木行走者会更好地完成这项任务。

用法示例:

// find a window
var window = GetFirstChild(AutomationElement.RootElement,
    (e) => e.Name == "Calculator");

// find a button
var button = GetFirstDescendant(window,
    (e) => e.ControlType == ControlType.Button && e.Name == "9");

// click the button
((InvokePattern)button.GetCurrentPattern(InvokePattern.Pattern)).Invoke();

使用委托递归查找后代元素的函数:

public static AutomationElement GetFirstDescendant(
    AutomationElement root, 
    Func<AutomationElement.AutomationElementInformation, bool> condition) {

    var walker = TreeWalker.ControlViewWalker;
    var element = walker.GetFirstChild(root);
    while (element != null) {
        if (condition(element.Current))
            return element;
        var subElement = GetFirstDescendant(element, condition);
        if (subElement != null)
            return subElement;
        element = walker.GetNextSibling(element);
    }
    return null;
}

使用委托查找子元素的函数:

public static AutomationElement GetFirstChild(
    AutomationElement root,
    Func<AutomationElement.AutomationElementInformation, bool> condition) {

    var walker = TreeWalker.ControlViewWalker;
    var element = walker.GetFirstChild(root);
    while (element != null) {
        if (condition(element.Current))
            return element;
        element = walker.GetNextSibling(element);
    }
    return null;
}