.net 为什么WPF中需要AutomationProperties

.net 为什么WPF中需要AutomationProperties,.net,wpf,ui-automation,.net,Wpf,Ui Automation,据我所知,AutomationProperties可用于识别UI自动化客户端的控件名称 我想了解是否需要创建一组独立的自动化属性,而不是为了同样的目的使用x:Name。让我们考虑一个文本框,在您的应用程序中,它是PhoneNumberTextBox,并且您还有一个PhoneNumberLabel和PhoneNumberValidationTick。然后将它们显示在一个带有“Customer”标签的分组框内 盲人试图使用您的应用程序时,希望屏幕阅读器在文本框中键入“客户电话号码”,同样,为您的应用

据我所知,AutomationProperties可用于识别UI自动化客户端的控件名称


我想了解是否需要创建一组独立的自动化属性,而不是为了同样的目的使用x:Name。

让我们考虑一个文本框,在您的应用程序中,它是PhoneNumberTextBox,并且您还有一个PhoneNumberLabel和PhoneNumberValidationTick。然后将它们显示在一个带有“Customer”标签的分组框内

盲人试图使用您的应用程序时,希望屏幕阅读器在文本框中键入“客户电话号码”,同样,为您的应用程序编写自动UI测试的测试人员希望能够找到包含“客户电话号码”的文本框

现在如果你的申请被翻译成德语怎么办…。盲人用户不希望屏幕阅读器说“kundentelefonnumer”吗

现在,假设您将应用程序更改为使用PhoneNumberInputControl,您可能希望更改代码中控件的名称,但测试人员更希望控件名称不更改


因此,我们需要一个名称的概念,这个名称由那些试图走“重要”路线的程序使用一个应用程序在运行时的逻辑控制,并对用户如何与应用程序交互进行自动化。

< P>我认为我的答案有点晚了,但我找到了一个适当的解释,我想与所有程序员分享,以改进他们在自动化领域的工作。 现在,我主要使用一些称为RPAs的自动化工具,特别是和

几个月来,我一直在努力使用一些自动化工具,因为它们是在中开发的,而不是在中开发的,这使得它们很难自动化,而且我们在图像识别方面依赖很多,这不是因为它们设计拙劣或没有按预期工作,而是因为在任何p项目

为了找到任何RPA都无法识别控件的原因,我们不得不一直使用图像识别,特别是在VB.NET中构建的UiPath等工具中,它应该与Windows完全连接,令人难以置信的是,它不能很好地工作,而且会推送让我深入调查根本原因,我创建了以下测试用例

一个基本的WPF应用程序,没有任何自动化属性(默认),它只包含一个
网格
、一个
标签
、一个
按钮
和一个
文本框

<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>

现在,如果您尝试从UiPath、从Automation Anywhere进行对象克隆等搜索任何控件,这是您的结果:

任何RPA或工具都无法发现所有控件。例如,我正在使用UiPath的Ui资源管理器(我也可以使用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可以访问所有控件,如我突出显示的按钮:

根据我个人的经验,这就是为什么我认为我们应该使用它们,特别是在这些时候,RPAS在任何行业中都变得具有标志性。此外,如果有人会自动将你正在构建的工具自动化,那么你就要去<强>保存相当长的时间< /强>,因为没有这些属性。自动化将是非常低效的,因为您将始终依赖图像识别,就像我的情况一样

此外,您可以在此处阅读有关自动化属性的更多信息:

快乐自动化

p.S.:

在我的调查中,一个有趣的事实是,任何窗口窗体 项目的控件从一开始就暴露于任何 自动化工具,无需额外的努力,这就是为什么他们是 自动化速度更快


可能的重复项不重复。链接中的问题(AutomationProperties.Name VS x:Name)说明区别。我的问题是为什么?为什么?因为它们各自的用途不同。同样的原因是人们使用汽车和卡车进行运输,而不是只使用一种类型的车辆。你觉得我的答案留下了悬而未决的问题吗?我很乐意改进。看,我们有x:Name pr属性来标识代码中或运行时的任何元素。现在,为什么不能使用相同的属性来代替AutomationProperties.Name。在任何地方,如果我需要知道元素的标识符,我可以使用x:Name。如果有理由认为x:Name不适合某个原因,因此需要引入AutomationProperties,这很好,我只需要理解某某的原因。但到目前为止,我无法理解。因为
x:Name
向程序员标识控件,而
AutomationProperties.Name
向用户标识控件。一个好名字对另一个来说是非常坏的名字。