使用UI Automation实现自动化测试--4.8 (GridPattern)

来源:互联网 发布:手机mac地址修改器下载 编辑:程序博客网 时间:2024/06/08 06:39

GridPattern

支持GridPattern的最常见的控件为GridView,在WPF中使用ListViewGridView组合即可得到相应的GridView

GridPattern的方法

GetItem:此方法有两个参数,即DataGridRowColumn

通过GridPatternGetItem方法可以获取DataGrid中的某个确定的单元格,进而对单元进行操作。

对单元格的操作主要有以下几个方面:

1.       编辑单元个中的数据。

2.       获取单元格中的数据。

3.       获取单元格中嵌套的AutomationElement(一般使用与自定义控件中)。

GridPattern的属性

GridPatternCurrent属性中有如下两个属性:

1.       RowCount属性:GridPattern二维表格的行数。

2.       ColumnCount属性:GridPattern二维表格列数。

下面我们通过一个实例来演示自动化测试中如何使用GridPattern来测试GridView的方法:

Code
 1using System;
 2using System.Text;
 3using System.Diagnostics;
 4using System.Threading;
 5using System.Windows.Automation;
 6
 7namespace UIATest
 8{
 9    class Program
10    {
11        static void Main(string[] args)
12        {
13            Process process = Process.Start(@"F:\CSharpDotNet\AutomationTest\ATP\WpfApp\bin\Debug\WpfApp.exe");
14            int processId = process.Id;
15            Thread.Sleep(1000);
16
17            GridPattern Test#region GridPattern Test
18            
19            AutomationElement element = FindElementById(processId, "listview1");
20            GridPattern pattern = GetGridPattern(element);
21            //Get cell element which row and column is 1
22            AutomationElement tempElement = pattern.GetItem(11);
23
24            Console.WriteLine("Cell which row = '{0}', column = '{1}', cell value is '{2}'",
25                11, tempElement.Current.Name);
26            Console.WriteLine("Grid row count = '{0}', column count = '{1}'",
27                pattern.Current.RowCount, pattern.Current.ColumnCount);
28
29            #endregion

30        }

31
32        /**//// <summary>
33        /// Get the automation elemention of current form.
34        /// </summary>
35        /// <param name="processId">Process Id</param>
36        /// <returns>Target element</returns>

37        public static AutomationElement FindWindowByProcessId(int processId)
38        {
39            AutomationElement targetWindow = null;
40            int count = 0;
41            try
42            {
43                Process p = Process.GetProcessById(processId);
44                targetWindow = AutomationElement.FromHandle(p.MainWindowHandle);
45                return targetWindow;
46            }

47            catch (Exception ex)
48            {
49                count++;
50                StringBuilder sb = new StringBuilder();
51                string message = sb.AppendLine(string.Format("Target window is not existing.try #{0}", count)).ToString();
52                if (count > 5)
53                {
54                    throw new InvalidProgramException(message, ex);
55                }

56                else
57                {
58                    return FindWindowByProcessId(processId);
59                }

60            }

61        }

62
63        /**//// <summary>
64        /// Get the automation element by automation Id.
65        /// </summary>
66        /// <param name="windowName">Window name</param>
67        /// <param name="automationId">Control automation Id</param>
68        /// <returns>Automatin element searched by automation Id</returns>

69        public static AutomationElement FindElementById(int processId, string automationId)
70        {
71            AutomationElement aeForm = FindWindowByProcessId(processId);
72            AutomationElement tarFindElement = aeForm.FindFirst(TreeScope.Descendants,
73            new PropertyCondition(AutomationElement.AutomationIdProperty, automationId));
74            return tarFindElement;
75        }

76
77        GridPattern helper#region GridPattern helper
78        /**//// <summary>
79        /// Get GridPattern
80        /// </summary>
81        /// <param name="element">AutomationElement instance</param>
82        /// <returns>GridPattern instance</returns>

83        public static GridPattern GetGridPattern(AutomationElement element)
84        {
85            object currentPattern;
86            if (!element.TryGetCurrentPattern(GridPattern.Pattern, out currentPattern))
87            {
88                throw new Exception(string.Format("Element with AutomationId '{0}' and Name '{1}' does not support the GridPattern.",
89                    element.Current.AutomationId, element.Current.Name));
90            }

91            return currentPattern as GridPattern;
92        }

93
94        #endregion

95    }

96}

97

    对应的XAML代码如下:

Code
 1<Window x:Class="WpfApp.GridView"
 2    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4    Title="GridView" Height="426" Width="558">
 5    <Grid>
 6        <!--将鼠标放在方框的边缘点击就会产生相应的分割线生成Grid.RowDefinitions-->
 7        <Grid.RowDefinitions>
 8            <!--Auto,实际作用就是取实际控件所需的最小值;值为*或N*,实际作用就是取尽可能大的值;数字,绝对尺寸-->
 9            <RowDefinition Height="*" />
10            <RowDefinition Height="auto" MinHeight="95" />
11            <RowDefinition Height="22" />
12        </Grid.RowDefinitions>
13        <ListView Name="listview1" MinWidth="280" Grid.RowSpan="2" MouseMove="listview1_MouseMove">
14            <ListView.View>
15                <GridView x:Name="gridView1">
16                    <GridViewColumn Header="EmployeeID" DisplayMemberBinding="{Binding Path=EmployeeID}"></GridViewColumn>
17                    <GridViewColumn Header="FirstName" DisplayMemberBinding="{Binding Path=FirstName}"></GridViewColumn>
18                    <GridViewColumn Header="LastName" DisplayMemberBinding="{Binding Path=LastName}"></GridViewColumn>
19                    <GridViewColumn Header="Address" DisplayMemberBinding="{Binding Path=Address}"></GridViewColumn>
20                </GridView>
21            </ListView.View>
22        </ListView>
23    </Grid>
24
25</Window>
26

    GridView窗体后台代码如下:

Code
 1using System;
 2using System.Collections.Generic;
 3using System.Linq;
 4using System.Text;
 5using System.Windows;
 6using System.Windows.Controls;
 7using System.Windows.Data;
 8using System.Windows.Documents;
 9using System.Windows.Input;
10using System.Windows.Media;
11using System.Windows.Media.Imaging;
12using System.Windows.Shapes;
13using System.Data.SqlClient;
14using System.Data;
15
16namespace WpfApp
17{
18    /**//// <summary>
19    /// Interaction logic for GridView.xaml
20    /// </summary>

21    public partial class GridView : Window
22    {
23        public GridView()
24        {
25            InitializeComponent();
26            getData();
27        }

28        SqlDataAdapter sda;
29        DataTable dt;
30        void getData()
31        {
32            //Northwind database download path:http://download.csdn.net/down/845087/beyondchina123
33            //init sqlconnection
34            SqlConnectionStringBuilder connbuilder = new SqlConnectionStringBuilder();
35            connbuilder.DataSource = ".";//本地服务器
36            connbuilder.IntegratedSecurity = true;//Windows集成验证
37            connbuilder.InitialCatalog = "Northwind";//数据库为Northwind
38            SqlConnection conn = new SqlConnection(connbuilder.ConnectionString);
39            sda = new SqlDataAdapter("select EmployeeID,FirstName,LastName,Address from Employees ", conn);
40            SqlCommandBuilder commbuilder = new SqlCommandBuilder(sda);
41            dt = new DataTable();
42            sda.Fill(dt);
43            listview1.ItemsSource = dt.DefaultView;
44        }

45      }

46}

47
48

     本文主要简单介绍了GridPattern以及GridPattern在测试中是使用方法。