如何使用 UI Automation(和/或 White)从外部应用程序获取控件的 DataContext

发布于 2024-08-02 16:09:36 字数 921 浏览 11 评论 0原文

我正在使用 White 来驱动 WPF 应用程序的 UI,到目前为止效果良好。

然而,我现在需要深入研究被测应用程序的内部状态以检查某些条件。

具体来说,我有一个 DataGrid (来自 WPFToolkit),它是数据绑定到 List。因此,每一行都有一个 MyBusinessObjectDataContext

我可以通过使用它的自动化 ID 查找它来使用白色获取网格。

然后我可以这样做:

var row = Grid.Rows[0]
row.AutomationElement.Current.Name

它返回字符串 "MyCompany.Namespace.MyBusinessObject",所以我几乎在那里,但我实际上无法获取实际的业务对象本身。

我研究过 WPF UIAutomation AutomationPeers (从 AutomationPeer 中,您可以获取 Owner 属性,这是实际的业务对象),但似乎您需要进程内使用它们,因为它们都有构造函数,需要您提供 WPF 控件。

有什么方法可以从外部进程构造 AutomationPeer,或者深入了解 WPF 控件的实际 DataContext 吗?

I'm using White to drive the UI of a WPF app, and it's worked well so far.

I'm at the point however, where I need to poke into the internal state of the app under test to check some conditions.

Specifically, I have a DataGrid (from the WPFToolkit), which is databound to a List<MyBusinessObject>. Each row therefore has a DataContext of a MyBusinessObject

I can get the grid using white by finding it with it's automation ID.

I can then do this:

var row = Grid.Rows[0]
row.AutomationElement.Current.Name

which returns the string "MyCompany.Namespace.MyBusinessObject", so I'm almost there, but I can't actually get the actual business object itself.

I've looked into WPF UIAutomation AutomationPeers (from an AutomationPeer, you can get the Owner property, which is the actual business object), but it seems that you need to be in-process to use these, as they all have constructors which require you to supply the WPF control.

Is there any way I can construct an AutomationPeer from an external process, or otherwise drill down into the actual DataContext of a WPF control?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

就此别过 2024-08-09 16:09:36

我认为你不能。使用 UI 自动化交换信息的唯一方法是通过预定义的提供程序,它们专注于 UI 及其显示的内容,而不是其背后的数据:您永远不会在应用程序和测试应用程序之间交换实际对象。

我认为使用 UIA 可以得到的最接近的结果是在字符串中对 BusinessObject 或至少相关数据进行编码,并使用 ValuePattern 检索该字符串。

I dont think you can. The only way you can exchange information using UI Automation is through the predefined Providers, and they are focused on the UI and what it displays, not the data behind it: you never exchange actual objects between your app and your test app.

I think the closest you can get, using UIA, is to encode your BusinessObject, or at least the relevant data, in a string and retrieve that string using the ValuePattern.

孤星 2024-08-09 16:09:36

ItemStatus (附加财产)

此属性使客户端能够确定元素是否正在传达有关项目的状态。例如,与消息应用程序中的联系人关联的项目可能是“忙碌”或“已连接”。

你无法检索底层类,你只能获取 UI 内容。但是,您的业务类的 Automation Peer 可以公开 项目状态。您可以在其中放置一个简单的字符串,或者 甚至XML

ItemStatus (Attached Property)

This property enables a client to ascertain whether an element is conveying status about an item. For example, an item associated with a contact in a messaging application might be "Busy" or "Connected".

You cannot retrieve the underlying class, you can only get UI stuff. But, the Automation Peer for your business class can expose an Item Status. You could put a simple string in there or even XML.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文