2

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

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

这是我试图使用的突出显示的元素:

检查的屏幕截图

谢谢

 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;
    }
4

1 回答 1

2

一个树行者会更好地完成这项任务。

使用示例:

// 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;
}
于 2016-03-06T23:57:26.007 回答