我想在测试期间使用Windows AutomationElement
来模拟Userinput。
我的特殊用法是使用ListBox选择进行人工操作,从我在网上找到的内容中,我需要为我的列表框设置一个AutomationElement来操作它。
假设我有一个这样的窗口:
<Window x:Class="CryptoAdmin_Test.Helper.FreshWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:CryptoAdmin_Test.Helper">
<StackPanel>
<UserControl x:FieldModifier="public" x:Name="FindMe" />
</StackPanel>
</Window>
由于我有对UserControl的引用,我应该能够在不从桌面开始搜索的情况下找到它(AutomationElement.RootElement
)。
为AutomationElement
window.FindMe
获取UserControl
的最快方法是什么?
使用AutomationElement.RootElement.FindFirst(...);
将从桌面开始,我没有看到一种通用的方法,可以快速进行此搜索而不会出现误报。
答案 0 :(得分:1)
这应该是找到它的最快方法。这也假设你给窗口一个名字,否则除非你从你的应用程序启动进程并且有一个进程ID,否则它很难找到。
AutomationElement mainWindow = AutomationElement.RootElement.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "MainWindow"));
AutomationElement findMe = mainWindow.FindFirst(TreeScope.Children, new PropertyCondition(AutomationElement.NameProperty, "FindMe"));
由于TreeScope设置为子视图,因此在查找相关元素时不会扫描整个树。根据您的用户控制的内容,您获取的元素可能是一些无用的东西。如果没有为您的控件实现一些自定义模式,您将能够做的唯一事情就是从中获取其他元素。