点击下载按钮后,我正在尝试浏览文件。但是我写了一个递归函数,它使用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;
}
答案 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;
}