为什么WPF中需要AutomationProperties

时间:2012-05-08 09:36:27

标签: .net wpf ui-automation

根据我的理解,AutomationProperties可用于识别UI自动化客户端的控件名称。

我想了解需要创建单独的自动化属性集,而不是为了相同的目的使用x:Name。

2 个答案:

答案 0 :(得分:7)

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

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

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

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

因此,我们需要程序使用的名称概念,该程序试图在运行时遍历应用程序的“重要”逻辑控件,并自动执行有关用户如何与应用程序交互的内容。

答案 1 :(得分:2)

我认为答案来得有点晚,但是我找到了一个适当的解释,我想与所有程序员分享它,以改善他们在自动化领域的工作。

如今,我主要使用一些称为RPA的自动化工具,特别是UiPathAutomation Anywhere

许多月以来,我一直在努力使用一些自动化工具,因为它们是在WPF而非Windows Forms中开发的,这使得它们很难实现自动化,并且我们在图像识别方面非常依赖不是因为它们的设计不当或无法按预期工作,而是因为AutomationProperties从未在任何项目中得到考虑。

为了找到答案,为什么RPA无法识别控件,我们被迫一直使用 图像识别 ,尤其是在UiPath之类的工具中,是在 VB.NET 中构建的,它应该与Windows完全连接,令人难以置信的是,它不能很好地工作,这促使我深入研究根本原因,我创建了以下测试用例。

基本的WPF应用程序,没有任何自动化属性(默认情况下),仅包含GridLabelButtonTextBox

<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的对象克隆等来搜索任何控件,则结果如下:

example 1

任何RPA或工具都无法发现所有控件。对于此示例,我使用的是UiPath的Ui Explorer(我也可以使用Spy ++,并且我将获得相同的结果);但是,如果您稍稍修改代码并按照此站点的建议添加所有自动化ID:

http://www.jonathanantoine.com/2011/11/03/coded-ui-tests-automationid-or-how-to-find-the-chose-one-control/

新代码如下:

<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访问:

example 2

基于我的个人经验,这就是为什么我认为我们应该使用它们;特别是在这些时代,RPA在任何行业都变得标志性。此外,如果有人将来会自动化您正在构建的工具,那么您将为您或您的团队节省大量时间,因为如果没有这些属性,自动化将非常低效,因为您将依赖像我一样一直在图像识别上进行操作。

此外,在这里您可以阅读有关自动化属性的更多信息: https://docs.microsoft.com/en-us/dotnet/framework/ui-automation/ui-automation-properties-overview

自动化快乐!

PS:

  

我调查中的一个有趣事实是,任何 Windows窗体   自项目开始以来,该项目的控件已公开   自动化工具而无需付出额外的努力,这就是为什么   自动化更快。