UIAutomation - InvokePattern仅在调试时有效 - 按钮未被识别为按钮

时间:2013-09-05 16:29:00

标签: c# .net winforms automation ui-automation

我正在使用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"));

1 个答案:

答案 0 :(得分:0)

尝试创建包含两个AndCondition的{​​{1}},一个用于按钮的名称,另一个用于按钮的类名(PropertyCondition?)。将该逻辑置于while / for循环中,就像查找窗口时一样。像这样:

SplitButton

我认为有可能有两个具有相同名称的元素,但在可视树中同一层次结构中出现了不同的类名。

如果这没有帮助,请尝试以相同的方式查询var andCondition = new AndCondition(new PropertyCondition(AutomationElement.NameProperty, "Open"), new PropertyCondition(AutomationElement.ClassNameProperty, "SplitButton")); 属性,看看它是否会返回。