Windows UIA自动化测试框架学习(一)

前段时间应公司要求开发一款针对现有WPF程序的自动化测试工具,在网上查资料找了一段时间,发现用来做自动化测试的框架还是比较多的,比如python的两个模块pywinauto和uiautomation,但是pywinauto主要是封装Win32的api,只局限于winform框架,而python中的uiautomation其实是封装的windows中的uia框架。基于项目效率考虑,所以最后决定使用windows中的UIAutomation框架。

这款WindowsUIA框架是同时支持wpf和winform,由于公司项目主要是wpf为主,所以以下学习和举例也是基于wpf框架,没有深入研究winform下的差异,但是大体上还是差不多的。

仅仅作为客户端来invoke的话,只需要引用下面两个dll即可,可以在.Net框架中查找:UIAutomationClient.dll,UIAutomationTypes.dll

在UIA框架中,所有元素包括窗口和控件都表现为AutomationElement。一个进程中的UI在空间上分布在一棵UI树上面,只需要找到UI树的根元素,就可以检索到与之相关联的其他任何元素

查找窗口

查找每个进程的根元素最常用的是根据控件句柄查找,方法如下:

Windows UIA自动化测试框架学习(一)_第1张图片

但是这个框架没有提供检索句柄的功能,所以需要和API配合使用:

 private static extern IntPtr findWindow(string lpClassName, string lpWindowName);

根据这个API获取某个窗口的句柄,根据这个窗口的句柄获取到AutomationElement,然后就可以通过下面的方法来查找其他元素

Windows UIA自动化测试框架学习(一)_第2张图片

以上两个方法可以搜索到这颗UI树上的所有子控件,例如查找某个Name属性为MyButton的Button控件并触发它的点击事件,就可以这样实现:
  PropertyCondition typeProperty = new PropertyCondition(AutomationElement.IsInvokePatternAvailableProperty, true);
                PropertyCondition nameProperty = new PropertyCondition(AutomationElement.AutomationIdProperty, “MyButton”);//搜索条件
                AutomationElement ele = _mainAutomationElement.FindFirst(TreeScope.Subtree, new AndCondition(typeProperty, nameProperty));
                if (ele != null)
                {
                    if (ele.Current.IsEnabled)
                    {
                        InvokePattern pattern = (InvokePattern)ele.GetCurrentPattern(InvokePattern.Pattern);
                        pattern.Invoke();//触发点击事件

                    } 

                 }

需要注意的是WPF中控件的属性映射到AutomationElement有以下对应关系

Control property in WPF Property in AutomationElement
Name         AutomationIdProperty
Content   Name
Title   Name

窗口的Title和继承ContentControl 的控件的Content  都会映射为AutomationElement中的Name属性

通过上述方法,基本可以查找到WPF中所有常用的控件,至于三方控件也有一定的兼容性。

下一篇会写个有趣的小工具、

你可能感兴趣的:(UIA)