注:本文最早发表在《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所示:

tib镜像文件装系统_测试

图4 脚本的运行结果

但是这个脚本还是有些问题,当某个TAB顺序不对时,CheckProperty函数检查属性的时间会比较长,CheckProperty函数检查属性等待的时间默认是根据如图5所示的“Object Synchronization Timeout”来设置的。

tib镜像文件装系统_脚本_02

图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所示。

tib镜像文件装系统_dialog_03

图6 调整后的脚本运行结果

    脚本在检查到第3个TAB顺序定位的控件的Focused属性不为True后,退出For循环,不再继续后续TAB顺序的检查,节省了测试脚本的运行时间,并且让脚本的测试结果更加简明、清晰。