支持GridPattern的最常见的控件为GridView, 在WPF中使用ListView和GridView组合即可得到相应的GridView。
GridPattern的方法
GetItem:此方法有两个参数,即DataGrid的Row和Column。
通过GridPattern的GetItem方法可以获取DataGrid中的某个确定的单元格,进而对单元进行操作。
对单元格的操作主要有以下几个方面:
1. 编辑单元个中的数据。
2. 获取单元格中的数据。
3. 获取单元格中嵌套的AutomationElement(一般使用与自定义控件中)。
GridPattern的属性
GridPattern的Current属性中有如下两个属性:
1. RowCount属性:GridPattern二维表格的行数。
2. ColumnCount属性:GridPattern二维表格列数。
下面我们通过一个实例来演示自动化测试中如何使用GridPattern来测试GridView的方法:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
1
using System;
2
using System.Text;
3
using System.Diagnostics;
4
using System.Threading;
5
using System.Windows.Automation;
6![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
7
namespace UIATest
8![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
9
class Program
10![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
11
static void Main(string[] args)
12![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
13
Process process = Process.Start(@"F:\CSharpDotNet\AutomationTest\ATP\WpfApp\bin\Debug\WpfApp.exe");
14
int processId = process.Id;
15
Thread.Sleep(1000);
16![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
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(1, 1);
23![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
24
Console.WriteLine("Cell which row = '{0}', column = '{1}', cell value is '{2}'",
25
1, 1, tempElement.Current.Name);
26
Console.WriteLine("Grid row count = '{0}', column count = '{1}'",
27
pattern.Current.RowCount, pattern.Current.ColumnCount);
28![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
#endregion
30
}
31![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
39
AutomationElement targetWindow = null;
40
int count = 0;
41
try
42![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
43
Process p = Process.GetProcessById(processId);
44
targetWindow = AutomationElement.FromHandle(p.MainWindowHandle);
45
return targetWindow;
46
}
47
catch (Exception ex)
48![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
54
throw new InvalidProgramException(message, ex);
55
}
56
else
57![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
58
return FindWindowByProcessId(processId);
59
}
60
}
61
}
62![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
63![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
71
AutomationElement aeForm = FindWindowByProcessId(processId);
72
AutomationElement tarFindElement = aeForm.FindFirst(TreeScope.Descendants,
73
new PropertyCondition(AutomationElement.AutomationIdProperty, automationId));
74
return tarFindElement;
75
}
76![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
77![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedSubBlock.gif)
GridPattern helper#region GridPattern helper
78![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <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![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
85
object currentPattern;
86
if (!element.TryGetCurrentPattern(GridPattern.Pattern, out currentPattern))
87![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](https://www.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
94
#endregion
95
}
96
}
97![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
对应的XAML代码如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
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![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
25
</Window>
26![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
GridView窗体后台代码如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
Code
1
using System;
2
using System.Collections.Generic;
3
using System.Linq;
4
using System.Text;
5
using System.Windows;
6
using System.Windows.Controls;
7
using System.Windows.Data;
8
using System.Windows.Documents;
9
using System.Windows.Input;
10
using System.Windows.Media;
11
using System.Windows.Media.Imaging;
12
using System.Windows.Shapes;
13
using System.Data.SqlClient;
14
using System.Data;
15![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
16
namespace WpfApp
17![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
{
18![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
/**//// <summary>
19
/// Interaction logic for GridView.xaml
20
/// </summary>
21
public partial class GridView : Window
22![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
23
public GridView()
24![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
25
InitializeComponent();
26
getData();
27
}
28
SqlDataAdapter sda;
29
DataTable dt;
30
void getData()
31![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
{
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![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
48![](https://www.cnblogs.com/Images/OutliningIndicators/None.gif)
本文主要简单介绍了GridPattern以及GridPattern在测试中是使用方法。