您的位置:首页 > 产品设计 > UI/UE

使用UI Automation实现自动化测试--4.6.2

2013-01-14 16:46 302 查看
如下代码演示了使用SelectionItemPattern来实现listview item 的多选操作:

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

16 Thread.Sleep(1000);

17 MutlSelect(new int[] { 0, 1 }, processId, false);

18 }

19

20 /**//// <summary>

21 /// Get the automation elemention of current form.

22 /// </summary>

23 /// <param name="processId">Process Id</param>

24 /// <returns>Target element</returns>

25 public static AutomationElement FindWindowByProcessId(int processId)

26 {

27 AutomationElement targetWindow = null;

28 int count = 0;

29 try

30 {

31 Process p = Process.GetProcessById(processId);

32 targetWindow = AutomationElement.FromHandle(p.MainWindowHandle);

33 return targetWindow;

34 }

35 catch (Exception ex)

36 {

37 count++;

38 StringBuilder sb = new StringBuilder();

39 string message = sb.AppendLine(string.Format("Target window is not existing.try #{0}", count)).ToString();

40 if (count > 5)

41 {

42 throw new InvalidProgramException(message, ex);

43 }

44 else

45 {

46 return FindWindowByProcessId(processId);

47 }

48 }

49 }

50

51

52 /**//// <summary>

53 /// Get the automation element by automation Id.

54 /// </summary>

55 /// <param name="windowName">Window name</param>

56 /// <param name="automationId">Control automation Id</param>

57 /// <returns>Automatin element searched by automation Id</returns>

58 public static AutomationElement FindElementById(int processId, string automationId)

59 {

60 AutomationElement aeForm = FindWindowByProcessId(processId);

61 AutomationElement tarFindElement = aeForm.FindFirst(TreeScope.Descendants,

62 new PropertyCondition(AutomationElement.AutomationIdProperty, automationId));

63 return tarFindElement;

64 }

65

66 /**//// <summary>

67 /// Bulk select the list item

68 /// </summary>

69 /// <param name="indexes">List item index collection</param>

70 /// <param name="processId">Application process Id</param>

71 /// <param name="isSelectAll">Is select all or not</param>

72 public static void MutlSelect(int[] indexes, int processId, bool isSelectAll)

73 {

74 AutomationElement targetElement = FindElementById(processId, "listView1");

75

76 AutomationElementCollection rows =

77 targetElement.FindAll(TreeScope.Descendants,

78 new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.ListItem));

79

80 object multiSelect;

81

82 if (isSelectAll)

83 {

84 for (int i = 1; i < rows.Count - 1; i++)

85 {

86 if (rows.TryGetCurrentPattern(SelectionItemPattern.Pattern, out multiSelect))

87 {

88 (multiSelect as SelectionItemPattern).AddToSelection();

89 }

90 }

91 }

92 else

93 {

94 if (indexes.Length > 0)

95 {

96 for (int j = 0; j < indexes.Length; j++)

97 {

98 int tempIndex = indexes[j];

99 if (rows[tempIndex].TryGetCurrentPattern(SelectionItemPattern.Pattern, out multiSelect))

100 {

101 (multiSelect as SelectionItemPattern).AddToSelection();

102 }

103 }

104 }

105 }

106 }

107

108 SelectItemPattern#region SelectItemPattern

109

110 /**//// <summary>

111 /// Get SelectItemPattern

112 /// </summary>

113 /// <param name="element">AutomationElement instance</param>

114 /// <returns>SelectItemPattern instance</returns>

115 public static SelectionItemPattern GetSelectionItemPattern(AutomationElement element)

116 {

117 object currentPattern;

118 if (!element.TryGetCurrentPattern(SelectionItemPattern.Pattern, out currentPattern))

119 {

120 throw new Exception(string.Format("Element with AutomationId '{0}' and Name '{1}' does not support the SelectionItemPattern.",

121 element.Current.AutomationId, element.Current.Name));

122 }

123 return currentPattern as SelectionItemPattern;

124 }

125

126 #endregion

127 }

128}

复制代码
如下代码为对应的XAML:

1<Window x:Class="WpfApp.Window2"

2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

4 Title="Window2" Height="412" Width="585">

5 <Grid>

6 <ListView Margin="2,97,0,163" Name="listView1">

7 <ListViewItem>Kaden</ListViewItem>

8 <ListViewItem>KangYi</ListViewItem>

9 <ListViewItem>John</ListViewItem>

10 </ListView>

11 </Grid>

12</Window>

13

复制代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: