我正在使用UIAutomation
操纵旧程序。我遇到的问题涉及使用InvokePattern
按下按钮。
按下打开资源管理器窗口并获取窗口AutomationElement
的按钮后,我获得了AutomationELement
的“打开”按钮,实际上是SplitButton
。我可以很容易地找到该元素,但它是一个Pane控件而不是SplitButton
控件。但是,如果我在查找Button元素之前插入断点并在Debug模式下手动单步执行代码,则“Open”按钮将被识别为Button。
如果我在找到Button
元素后插入断点,则元素名称和AutomationID
是正确的,但ControlType
是窗格而不是按钮。如果我在获取资源管理器窗口后放入延迟并不重要,它只在调试时有效。这很奇怪。
违规代码如下:
InvokePattern bPattern = (InvokePattern)button.GetCurrentPattern(InvokePattern.Pattern);
bPattern.Invoke();
for (int wait = 0; wait < 50; wait++)
{
if (explorerWindow != null)
break;
explorerWindow = reportWindow.FindFirst(TreeScope.Children,
new PropertyCondition(AutomationElement.NameProperty, "Select Report"));
Thread.Sleep(200);
}
explorerOpenButton = explorerWindow.FindFirst(TreeScope.Children,
new PropertyCondition(AutomationElement.NameProperty, "Open"));
答案 0 :(得分:0)
尝试创建包含两个AndCondition
的{{1}},一个用于按钮的名称,另一个用于按钮的类名(PropertyCondition
?)。将该逻辑置于while / for循环中,就像查找窗口时一样。像这样:
SplitButton
我认为有可能有两个具有相同名称的元素,但在可视树中同一层次结构中出现了不同的类名。
如果这没有帮助,请尝试以相同的方式查询var andCondition = new AndCondition(new PropertyCondition(AutomationElement.NameProperty, "Open"), new PropertyCondition(AutomationElement.ClassNameProperty, "SplitButton"));
属性,看看它是否会返回。