据我了解,AutomationProperties 可用于识别 UI 自动化客户端的控件名称。
我想了解需要创建单独的自动化属性集,而不是出于相同目的使用 x:Name。
据我了解,AutomationProperties 可用于识别 UI 自动化客户端的控件名称。
我想了解需要创建单独的自动化属性集,而不是出于相同目的使用 x:Name。
让我们考虑一个文本框,在您的应用程序中它是PhoneNumberTextBox,并且您还有一个PhoneNumberLabel 和PhoneNumberValidationTick。然后将它们显示在带有显示“客户”标签的组框内</p>
尝试使用您的应用程序的盲人希望屏幕阅读器在他们进入文本框时说“客户电话号码”,同样,为您的应用程序编写自动化 UI 测试的测试人员希望能够找到文本框包含“客户电话号码”。
现在,如果您的应用程序已被翻译成德语怎么办……。盲人用户不希望屏幕阅读器说“Kundentelefonnummer”吗?
现在假设您更改应用程序以使用 PhoneNumberInputControl,您可能希望更改代码中控件的名称,但测试人员更希望控件名称不会更改……。
因此,我们需要一个名称的概念,该名称由程序使用,这些程序试图在运行时遍历应用程序的“重要”逻辑控件,并自动化用户与应用程序交互的方式。
我认为我的答案来得有点晚,但我找到了一个合适的解释,我想与所有程序员分享,以改进他们在自动化领域的工作。
现在,我主要使用一些称为 RPA 的自动化工具,特别是UiPath和Automation Anywhere。
几个月以来,我一直在努力使用一些自动化工具,因为它们是在WPF而不是Windows Forms中开发的,这使得它们很难自动化,我们在图像识别方面非常依赖,不是因为它们设计不当或没有按预期工作,但因为AutomationProperties
从未在任何项目中考虑过。
为了找到任何 RPA 无法识别控件并且我们一直被迫使用图像识别的答案,特别是在VB.NET中构建的 UiPath 等工具中,它应该与 Windows 完全连接,它难以置信地相信它不能很好地工作,它促使我更深入地调查根本原因,我创建了以下测试用例。
一个基本的 WPF 应用程序,没有任何自动化属性(默认情况下),仅包含 a Grid
、 a Label
、 aButton
和 a TextBox
:
<Window x:Class="UiPathExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:UiPathExample"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<Grid>
<Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="91,60,0,0" VerticalAlignment="Top" Width="75"/>
<Label x:Name="label" Content="Label" HorizontalAlignment="Left" Margin="82,121,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="300,135,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120"/>
</Grid>
</Window>
现在,如果您尝试使用Spy++、UiPath 中的Ui Explorer 、Automation Anywhere 中的对象克隆等搜索任何控件。这是您的结果:
任何 RPA 或工具都无法发现所有控件。对于这个例子,我使用的是 UiPath 的 Ui Explorer(我也可以使用 Spy++,我会得到相同的结果);但是,如果您稍微修改代码并按照本网站的建议添加所有自动化 ID:
新代码将如下所示:
<Window x:Class="UiPathExample.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:UiPathExample"
mc:Ignorable="d"
AutomationProperties.AutomationId="Window1"
Title="MainWindow" Height="350" Width="525">
<Grid AutomationProperties.AutomationId="Grid1">
<Button x:Name="button" Content="Button" HorizontalAlignment="Left" Margin="91,60,0,0" AutomationProperties.AutomationId="btnButton1" VerticalAlignment="Top" Width="75"/>
<Label x:Name="label" Content="Label" AutomationProperties.AutomationId="lbl1" HorizontalAlignment="Left" Margin="82,121,0,0" VerticalAlignment="Top"/>
<TextBox x:Name="textBox" HorizontalAlignment="Left" Height="23" Margin="300,135,0,0" TextWrapping="Wrap" Text="TextBox" VerticalAlignment="Top" Width="120" AutomationProperties.AutomationId="txtAutomationEx"/>
</Grid>
</Window>
现在,UI Explorer 可以访问所有控件,就像我突出显示的按钮一样:
根据我的个人经验,这就是我认为我们应该使用它们的原因;尤其是在 RPA 在任何行业都成为标志性的时代。此外,如果将来有人自动化您正在构建的工具,您将为您或您的团队节省大量时间,因为如果没有这些属性,自动化将非常低效,因为您将一直依赖图像识别作为就我而言。
此外,您可以在此处阅读有关自动化属性的更多信息: https ://docs.microsoft.com/en-us/dotnet/framework/ui-automation/ui-automation-properties-overview
快乐的自动化!
PS:
在我的调查中,一个有趣的事实是,任何Windows 窗体 项目的控件从一开始就已经暴露给任何自动化工具,而无需额外的努力,这就是它们自动化速度更快的原因。