【问题标题】:AutomationElement: cached element (via GetCachedChildren) to "live" elementAutomationElement:缓存元素(通过GetCachedChildren)到“活”元素
【发布时间】:2012-08-09 16:40:45
【问题描述】:

我有一个 ComboBox,其中包含一个列表(这是组合框的标准),其中包含很多元素 - 超过 100 个。我想找到某些条目来选择它们。为了找到条目,我将给定模式与每个元素的名称进行比较。

出于性能原因(超过 100 个元素),我在父级上使用 CacheRequest,其范围为所有子级,因此我可以非常快速地遍历所有子级并找到我想要的子级的正确索引选择。

问题来了:我有我想要的正确索引,我也有缓存的 AutomationElement,但是由于我在 CacheRequest 中指定了 AutomationElementMode.None(我仍然需要测试它是否会对性能产生影响),我似乎无法将缓存的元素转换为可用于将来调用的元素(“实时”元素)。

我尝试通过NativeWindowHandle进行转换(因为有一个函数AutomationElement.FromWindowHandle),但是句柄似乎为0,所以这是没有办法的。

我还没有尝试使用缓存的 SelectionPattern - 因为组合框有时是自定义构建的,但我不知道这是否适用于所有情况(如果有的话)。

我有子索引,我可以获得所有可以缓存的值 - 我如何获得缓存元素的工作/实时 AutomationElement?

谢谢 安德烈亚斯

(在带有 win32 应用程序(作为自动化目标)的 Windows 7 64 上使用 C#,虽然这不会有太大的不同)

【问题讨论】:

    标签: c# caching ui-automation microsoft-ui-automation


    【解决方案1】:

    除了索引之外,您还有需要的子文本吗?如果是这样,是否可以将子文本发送到组合框,就像用户正在键入以选择您需要的子文本而不是尝试获取自动化元素一样?

    总是有 IUIAutomationLegacyIAccessiblePattern 可以依赖,但我认为这只是在核心 API 中,而不是客户端 (AutomationElement)。

    【讨论】:

    • 感谢您的回答!你如何获得这种互动?是否存在从 UIAtuomation 到实现该接口的对象的转换?
    • 是的,但我认为只使用非托管 API,这更好。在此处阅读更多信息:social.msdn.microsoft.com/Forums/en-US/…(据我所知,IUIAutomationLegacyIAccessiblePattern 不是托管代码的一部分)。如果您想尝试非托管,请告诉我,我可以添加到我的答案中。
    【解决方案2】:

    实际上,使用 AutomationElementMode.None 似乎不是最好的主意。缓存请求所花费的时间似乎仅受您是否请求活动元素以及您请求的属性数量的轻微影响。 (如果我错了,请纠正我 - 我没有系统地测试,但最近在玩弄我的缓存请求的一些选项时有这种感觉。)

    这似乎主要受您最初请求的 UI 元素数量的影响。

    所以我可以首先请求实时链接。

    这让我现在想知道通过某些 Win32SDK 功能访问是否会更快..

    【讨论】:

      猜你喜欢
      • 2016-07-19
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-18
      • 2017-07-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多