WindowPattern
WindowPattern 控件模式用于支持在传统的 图形用户界面 (GUI) 内提供基于基本窗口的功能的控件。必须实现此控件模式的控件的示例包括*应用程序窗口、多文档界面 (MDI) 子窗口、大小可调的拆分窗格控件、模式对话框以及气球状帮助窗口。可以使用WindowPattern来对window进行操作,例如验证window是否激活,是否最大化、最小化、正常模式以及关闭window等。
下面的代码演示了WindowPattern的使用方法:
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 AutomationElement element = FindWindowByProcessId(processId);
16 WindowPattern currentPattern = GetWindowPattern(element);
17
18 //Set window visual state to Maximized
19 currentPattern.SetWindowVisualState(WindowVisualState.Maximized);
20 Thread.Sleep(1000);
21
22 //Set window visual state to Normal
23 currentPattern.SetWindowVisualState(WindowVisualState.Normal);
24 Thread.Sleep(1000);
25
26 //Set window visual state to Minimized
27 currentPattern.SetWindowVisualState(WindowVisualState.Minimized);
28
29 //Close window
30 currentPattern.Close();
31 }
32
33 /**//// <summary>
34 /// Get the automation elemention of current form.
35 /// </summary>
36 /// <param name="processId">Process Id</param>
37 /// <returns>Target element</returns>
38 public static AutomationElement FindWindowByProcessId(int processId)
39 {
40 AutomationElement targetWindow = null;
41 int count = 0;
42 try
43 {
44 Process p = Process.GetProcessById(processId);
45 targetWindow = AutomationElement.FromHandle(p.MainWindowHandle);
46 return targetWindow;
47 }
48 catch (Exception ex)
49 {
50 count++;
51 StringBuilder sb = new StringBuilder();
52 string message = sb.AppendLine(string.Format("Target window is not existing.try #{0}", count)).ToString();
53 if (count > 5)
54 {
55 throw new InvalidProgramException(message, ex);
56 }
57 else
58 {
59 return FindWindowByProcessId(processId);
60 }
61 }
62 }
63
64 WindowPattern helper#region WindowPattern helper
65
66 /**//// <summary>
67 /// Get WindowPattern
68 /// </summary>
69 /// <param name="element">AutomationElement instance</param>
70 /// <returns>WindowPattern instance</returns>
71 public static WindowPattern GetWindowPattern(AutomationElement element)
72 {
73 object currentPattern;
74 if (!element.TryGetCurrentPattern(WindowPattern.Pattern, out currentPattern))
75 {
76 throw new Exception(string.Format("Element with AutomationId '{0}' and Name '{1}' does not support the WindowPattern.",
77 element.Current.AutomationId, element.Current.Name));
78 }
79 return currentPattern as WindowPattern;
80 }
81
82 #endregion
83 }
84}
85
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 AutomationElement element = FindWindowByProcessId(processId);
16 WindowPattern currentPattern = GetWindowPattern(element);
17
18 //Set window visual state to Maximized
19 currentPattern.SetWindowVisualState(WindowVisualState.Maximized);
20 Thread.Sleep(1000);
21
22 //Set window visual state to Normal
23 currentPattern.SetWindowVisualState(WindowVisualState.Normal);
24 Thread.Sleep(1000);
25
26 //Set window visual state to Minimized
27 currentPattern.SetWindowVisualState(WindowVisualState.Minimized);
28
29 //Close window
30 currentPattern.Close();
31 }
32
33 /**//// <summary>
34 /// Get the automation elemention of current form.
35 /// </summary>
36 /// <param name="processId">Process Id</param>
37 /// <returns>Target element</returns>
38 public static AutomationElement FindWindowByProcessId(int processId)
39 {
40 AutomationElement targetWindow = null;
41 int count = 0;
42 try
43 {
44 Process p = Process.GetProcessById(processId);
45 targetWindow = AutomationElement.FromHandle(p.MainWindowHandle);
46 return targetWindow;
47 }
48 catch (Exception ex)
49 {
50 count++;
51 StringBuilder sb = new StringBuilder();
52 string message = sb.AppendLine(string.Format("Target window is not existing.try #{0}", count)).ToString();
53 if (count > 5)
54 {
55 throw new InvalidProgramException(message, ex);
56 }
57 else
58 {
59 return FindWindowByProcessId(processId);
60 }
61 }
62 }
63
64 WindowPattern helper#region WindowPattern helper
65
66 /**//// <summary>
67 /// Get WindowPattern
68 /// </summary>
69 /// <param name="element">AutomationElement instance</param>
70 /// <returns>WindowPattern instance</returns>
71 public static WindowPattern GetWindowPattern(AutomationElement element)
72 {
73 object currentPattern;
74 if (!element.TryGetCurrentPattern(WindowPattern.Pattern, out currentPattern))
75 {
76 throw new Exception(string.Format("Element with AutomationId '{0}' and Name '{1}' does not support the WindowPattern.",
77 element.Current.AutomationId, element.Current.Name));
78 }
79 return currentPattern as WindowPattern;
80 }
81
82 #endregion
83 }
84}
85
本文简单介绍了WindowPattern以及WindowPattern在测试中的使用方法。