一、White简介 White是微软开发的一个开源工具,它提供了一套主要用于UI测试的框架。它适用于WinForm, WPF, Win32 以及SWT(java)的测试。 White是用C#开发的,但White除了支持.Net语言外,还支持Python和Ruby。(Python和Ruby是通过IronPython or IronRuby作为端口与.Net Framework结合。) White 是基于UIAutomation 这个类库的,它是通过调用UIA并对它进行封装,所以它的结构如这样的:底层是Windows 操作系统,在 Windows 操作系统之上是 .Net运行时,在.Net运行时之上是UI Automation Library,在UI Automation Library之上是White, 然后上层是我们调用White 组建的测试框架。(什么是UIA,它是.Net的一个类库,它能够帮助我们找到UI 控件,能得到控件的属性值,并能够操作控件。当然它主要是基于Windows平台的。) 二、White 寻找控件的机制 White是通过UI Automation API来找到某个窗口中的控件的。它通过遍历窗口中的所有控件来找到指定控件。那么如果有多个窗口打开时,怎么知道去哪个窗口寻找呢,是这样的,每次要寻找某个控件时,必须把它所属的窗口句柄传入,这样UIA通过window message与指定窗口通信,进而去指定窗口寻找相应控件。 其实White与selenium, watir等框架非常相似。它通过UIAutomation库和Windows Message实现对窗口(控件)的识别与操作,White 将对应的Control信息暴露给UI Automation, 再通过UI Automation库,将这些Control信息识别成各UI Item。 White寻找控件的方式主要有以下几种: · 通过控件的Name寻找 · 通过控件的AutomationID寻找 · 通过控件显示的Text寻找 · 通过控件的类型寻找 · 通过索引寻找 · 通过位置寻找 这几种寻控件的方式中,如果单一的只使用一种的话,前几种的寻找速度都不是很快,除了后一种通过位置来寻找。 实践经验: 那么我们有没有办法来提前下寻找速度呢,我在实际使用中一般会运用这些方法: 将多种寻找方法结合在一起,比如,既提供控件类型,又提供名字或者Automation ID等。(这样UIA在找控件时可以有的放矢的去找,而不用一个个的去找。首先根据类型,可以过滤掉一大批,然后只要在符合这个类型的控件里面找到Auto ID对应的行了。) 还有一种方法是先找到主控件,然后再利用主控件再寻找属于主控件下一级的控件。比如,先获得一个GroupBox的句柄,然后在这个GroupBox下找到指定Name的行了。这样大大的缩小了寻找范围,不用满窗口的去寻找了。 当然有时White遍历一遍还不一定能百分之百找到想要的控件,这时,我们要在自己的代码中设置一个循环,当判读返回为null时,等上个一秒半秒然后于让它去找一次。当然这个循环也不是无限制的,我们多是给它10次机会,如果还是找不到,只能抛出异常了或者返回null。 这个问题在对控件进行操作时也会发生,所以对每个控件的操作,我们要等到这个控件enable之后,再去操作。 三、White通过位置寻找控件 位置寻找可以快速的找到相应的控件,而不用像其它方法一样遍历窗口中的各个控件。我们只要将被测程序运行过一遍,White会自动将所有控件的位置信息保存到一份XML文件中,以后再次运行被测程序时White可以快速的找到指定的控件。控件是信息是与指定窗口相关联的,所以窗口大小、位置的改变都不会影响找控件。当然如果界面的设计有改动,那得重写之前保存的信息了。 四、元素识别工具,方便我们给White 提供控件信息。 UISpy是.Net3.0 SDK提供的工具,并不属于White框架,但是我们可以通过该工具进行元素的识别。UISpy会将所有元素识别成一棵控件树,它能提供控件的详细信息,比如:Name, AutoID, Type, Position等属性和方法。