gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 16:07:47 25 4
gpt4 key购买 nike

我正在使用 UIAutomation 操作一个旧程序。我遇到的问题涉及使用 InvokePattern 按下按钮。

按下打开资源管理器窗口的按钮并获得窗口的 AutomationElement 后,我获得了“打开”按钮的 AutomationELement,实际上是 拆分按钮。我可以很容易地找到该元素,但它是作为 Pane 控件而不是 SplitButton 控件出现的。但是,如果我在查找 Button 元素之前插入一个断点并在 Debug模式下手动单步执行代码,“打开”按钮将被识别为一个按钮。

如果我在找到 Button 元素后插入一个断点,元素名称和 AutomationID 是正确的,但是 ControlType 是一个 Pane 而不是一个按钮。获取资源管理器窗口后是否延迟并不重要,它仅在调试时有效。这很奇怪。

违规代码如下:

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"));

最佳答案

尝试创建一个包含两个 PropertyConditionAndCondition,一个用于按钮的名称,另一个用于按钮的类名(SplitButton?) .将该逻辑放入 while/for 循环中,就像您在查找窗口时所做的那样。像这样:

var andCondition = new AndCondition(new PropertyCondition(AutomationElement.NameProperty, "Open"), new PropertyCondition(AutomationElement.ClassNameProperty, "SplitButton"));

我认为有可能有两个名称相同但类名不同的元素以某种方式出现在可视化树的同一层次结构中。

如果这没有帮助,请尝试以相同的方式查询 RuntimeId 属性,看看它是否会返回。

关于c# - UIAutomation - InvokePattern 仅在调试时有效 - 按钮未被识别为按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18641521/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com