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

来源:互联网 发布:java maven 命令 编辑:程序博客网 时间:2024/05/23 23:11
ValuePattern

ValuePattern是UI Automation中最常见的Pattern之一,Winform和WPF的TextBox控件都支持ValuePattern。

ValuePattern的一个重要的方法是SetValue,在允许调用 SetValue 之前,控件应将其 IsEnabledProperty 设置为 true 并将其 IsReadOnlyProperty 设置为 false。

通过ValuePattern的Current属性可以获得控件的value和IsReadOnly属性。

实现 Value 控件模式时,请注意以下准则和约定:

如果任何项的值是可编辑的,则诸如 ListItem 和 TreeItem 等控件必须支持 ValuePattern,而不管控件的当前编辑模式如何。如果子项是可编辑的,则父控件还必须支持 ValuePattern。

    下面的例子是通过ValuePattern来给TextBox设置和获取值:
  1. 1using System;
  2. 2using System.Text;
  3. 3using System.Diagnostics;
  4. 4using System.Threading;
  5. 5using System.Windows.Automation;
  6. 6
  7. 7namespace UIATest
  8. 8{
  9. 9    class Program
  10. 10    {
  11. 11        static void Main(string[] args)
  12. 12        {
  13. 13            Process process = Process.Start(@"F:\CSharpDotNet\AutomationTest\ATP\WpfApp\bin\Debug\WpfApp.exe");
  14. 14            int processId = process.Id;
  15. 15            AutomationElement element = FindElementById(processId, "textBox1");
  16. 16            ValuePattern currentPattern = GetValuePattern(element);
  17. 17            Console.WriteLine("Is read only:'{0}', TextBox text is:'{1}'", currentPattern.Current.IsReadOnly, currentPattern.Current.Value);
  18. 18            currentPattern.SetValue("KadenKang");
  19. 19            Console.WriteLine("After using the SetValue, the TextBox value is '{0}'", currentPattern.Current.Value);
  20. 20            
  21. 21        }
  22. 22
  23. 23        /**//// <summary>
  24. 24        /// Get the automation elemention of current form.
  25. 25        /// </summary>
  26. 26        /// <param name="processId">Process Id</param>
  27. 27        /// <returns>Target element</returns>
  28. 28        public static AutomationElement FindWindowByProcessId(int processId)
  29. 29        {
  30. 30            AutomationElement targetWindow = null;
  31. 31            int count = 0;
  32. 32            try
  33. 33            {
  34. 34                Process p = Process.GetProcessById(processId);
  35. 35                targetWindow = AutomationElement.FromHandle(p.MainWindowHandle);
  36. 36                return targetWindow;
  37. 37            }
  38. 38            catch (Exception ex)
  39. 39            {
  40. 40                count++;
  41. 41                StringBuilder sb = new StringBuilder();
  42. 42                string message = sb.AppendLine(string.Format("Target window is not existing.try #{0}", count)).ToString();
  43. 43                if (count > 5)
  44. 44                {
  45. 45                    throw new InvalidProgramException(message, ex);
  46. 46                }
  47. 47                else
  48. 48                {
  49. 49                    return FindWindowByProcessId(processId);
  50. 50                }
  51. 51            }
  52. 52        }
  53. 53
  54. 54        /**//// <summary>
  55. 55        /// Get the automation element by automation Id.
  56. 56        /// </summary>
  57. 57        /// <param name="windowName">Window name</param>
  58. 58        /// <param name="automationId">Control automation Id</param>
  59. 59        /// <returns>Automatin element searched by automation Id</returns>
  60. 60        public static AutomationElement FindElementById(int processId, string automationId)
  61. 61        {
  62. 62            AutomationElement aeForm = FindWindowByProcessId(processId);
  63. 63            AutomationElement tarFindElement = aeForm.FindFirst(TreeScope.Descendants,
  64. 64            new PropertyCondition(AutomationElement.AutomationIdProperty, automationId));
  65. 65            return tarFindElement;
  66. 66        }
  67. 67
  68. 68        #region ValuePattern helper
  69. 69
  70. 70        /**//// <summary>
  71. 71        /// To get the ValuePattern
  72. 72        /// </summary>
  73. 73        /// <param name="element">Target element</param>
  74. 74        /// <returns>ValuePattern instance</returns>
  75. 75        public static ValuePattern GetValuePattern(AutomationElement element)
  76. 76        {
  77. 77            object currentPattern;
  78. 78            if (!element.TryGetCurrentPattern(ValuePattern.Pattern, out currentPattern))
  79. 79            {
  80. 80                throw new Exception(string.Format("Element with AutomationId '{0}' and Name '{1}' does not support the ValuePattern.",
  81. 81                    element.Current.AutomationId, element.Current.Name));
  82. 82            }
  83. 83            return currentPattern as ValuePattern;
  84. 84        }
  85. 85
  86. 86        #endregion
  87. 87    }
  88. 88}
  89. 89
复制代码
下面的代码是xaml设计:
  1. 1<Window x:Class="WpfApp.Window1"
  2. 2    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3. 3    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4. 4    Title="Window1" Height="219" Width="353">
  5. 5    <Grid>
  6. 6        <TextBox Height="23" Margin="50,20,160,0" Name="textBox1" VerticalAlignment="Top" MaxLength="5">textBox text</TextBox>
  7. 7    </Grid>
  8. 8</Window>
  9. 9
复制代码
本文通过简单的实例介绍了UI Automation中的ValuePattern及其使用方法。(文/开着拖拉机
0 0
原创粉丝点击