注:本文最早发表在《51测试天地》第九期
对检查Tab顺序的脚本进行完善
把前面的脚本结构适当调整,让其可维护性更强,则可改成如下所示的脚本:
' 检查控件的focused属性
Public Function CheckFocus(TestObject)
If TestObject.CheckProperty("focused","True") Then
CheckFocus = True
Else
CheckFocus = False
End IF
End Function
' TAB按键的键值
Const VK_TAB = 15
' 创建DeviceReplay对象
Set DeviceReplay = CreateObject("Mercury.DeviceReplay")
' 创建Dictionary对象
Set Dic = CreateObject("Scripting.Dictionary")
' 添加Dictionary的key和value,把顺序号作为Key、控件对象作为Value
Dic.Add "1" , Dialog("Login").WinEdit("Agent Name:")
Dic.Add "2" , Dialog("Login").WinEdit("Password:")
Dic.Add "3" , Dialog("Login").WinButton("OK")
Dic.Add "4" , Dialog("Login").WinButton("Cancel")
Dic.Add "5" , Dialog("Login").WinButton("Help")
' 启动应用程序
SystemUtil.Run "C:/Program Files/Mercury Interactive/QuickTest Professional/samples/flight/app/flight4a.exe"
' 定位到程序窗口,并判断窗口中的默认焦点是否在正确的位置
Dialog("Login").Activate
CheckFocus(Dic.Item("1"))
For I=2 to Dic.Count
' 单击Tab键,检查焦点是否跳转到正确的控件上
DeviceReplay.PressKey VK_TAB
CheckFocus(Dic.Item(CStr(I)))
Next
脚本作了以下几点的调整:
(1)其中把检查控件的focused属性的脚本封装成独立的函数已备调用。
(2)使用DeviceReplay对象来发送TAB按键。
(3)使用Dictionary对象来按TAB顺序存储控件对象。
(4)把Dictionary中存储的第一个控件对象作为默认焦点所在的位置,定位到程序界面后,判断窗口中的默认焦点是否在正确的位置。
(5)然后循环遍历Dictionary中存储的控件对象,单击Tab键,检查焦点是否跳转到正确的控件上。
脚本的运行结果如图4所示:
图4 脚本的运行结果
但是这个脚本还是有些问题,当某个TAB顺序不对时,CheckProperty函数检查属性的时间会比较长,CheckProperty函数检查属性等待的时间默认是根据如图5所示的“Object Synchronization Timeout”来设置的。
图5 设置“Object Synchronization Timeout”选项
可以通过设置该选项来达到提高检查属性的速度的目的,也可以在脚本中进行设置。查看如下所示的CheckProperty函数的语法可知道,TimeOut属性是可设置的:
object.CheckProperty (PropertyName, PropertyValue, [TimeOut])
因此,可以把CheckFocus函数改成如下脚本所示:
' 检查控件的focused属性
Public Function CheckFocus(TestObject)
If TestObject.CheckProperty("focused","True",2) Then
CheckFocus = True
Else
CheckFocus = False
End IF
End Function
脚本中把TimeOut设置为2秒,这样当检查到控件的focused属性不为预期的“True”时,QTP会等待2秒再次检查,2秒后不管是否出现期待的属性值,都会立即返回当前属性值。
其实还可以对脚本进行进一步地调整,因为循环检查TAB顺序时,只要碰到第一个TAB顺序与预期的不匹配时就可以认为出现了错误,TAB顺序设置不合理。因此可以在循环语句中加入判断,如果出现调用CheckFocus返回值为False的情况,则马上退出循环,如下脚本所示:
' 检查控件的focused属性
Public Function CheckFocus(TestObject)
If TestObject.CheckProperty("focused","True",2) Then
CheckFocus = True
Else
CheckFocus = False
End IF
End Function
' TAB按键的键值
Const VK_TAB = 15
' 创建DeviceReplay对象
Set DeviceReplay = CreateObject("Mercury.DeviceReplay")
' 创建Dictionary对象
Set Dic = CreateObject("Scripting.Dictionary")
' 添加Dictionary的key和value,把顺序号作为Key、控件对象作为Value
Dic.Add "1" , Dialog("Login").WinEdit("Agent Name:")
Dic.Add "2" , Dialog("Login").WinEdit("Password:")
Dic.Add "3" , Dialog("Login").WinButton("Cancel")
Dic.Add "4" , Dialog("Login").WinButton("OK")
Dic.Add "5" , Dialog("Login").WinButton("Help")
' 启动应用程序
SystemUtil.Run "C:/Program Files/Mercury Interactive/QuickTest Professional/samples/flight/app/flight4a.exe"
' 定位到程序窗口,并判断窗口中的默认焦点是否在正确的位置
Dialog("Login").Activate
CheckFocus(Dic.Item("1"))
For I=2 to Dic.Count
' 单击Tab键,检查焦点是否跳转到正确的控件上
DeviceReplay.PressKey VK_TAB
If CheckFocus(Dic.Item(CStr(I))) = False Then
' 如果碰到焦点没有跳转到正确的控件上的情况,则马上退出循环
Exit For
End If
Next
调整后的脚本运行结果如图6所示。
图6 调整后的脚本运行结果
脚本在检查到第3个TAB顺序定位的控件的Focused属性不为True后,退出For循环,不再继续后续TAB顺序的检查,节省了测试脚本的运行时间,并且让脚本的测试结果更加简明、清晰。