• 2008-01-28

    在QTP中使用描述性编程(实例) - [QTP]

    版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
    http://zlfoxy.blogbus.com/logs/14606271.html

    原作:老赵

    在QTP中使用描述性编程是一个提高QTP脚本利用率的很好的方式。
    通常QTP是通过对象库来识别不同的对象,而描述性编程是QTP另外一种能够识别对象的途径,它不依赖于对象库,通过增加一些对象的描述来识别对象的。
    说明:本例子是以Flight飞机订票系统的登陆界面为测试页面进行描述的。
    步骤一:录制脚本
    Dialog("Login").WinEdit("Agent Name:").Set "Holly"
    Dialog("Login").WinEdit("Password:").SetSecure "46ef0dc7efe5834c73673898279af1204fea51a7"
    Dialog("Login").WinButton("Cancel").Click
    共录制3步操作,输入Agent Name, Password, 点击Cancel按钮
    步骤二:初级描述性编程
    Dialog("Regexpwndtitle:=Login").WinEdit("Attached text:=Agent Name:").Set "Holly"
    Dialog("Regexpwndtitle:=Login").WinEdit("Attached text:=Password:").Set “Mercury”
    Dialog("Regexpwndtitle:=Login").WinButton("Class Name:=WinButton", "text:=Cancel").Click
    在这里要注意有三点:
    1)如果需要两个以上特性来描述一个对象,需要使用逗号(,)对描述性语言进行分割
    2)使用:=来连接属性和属性值,并且:=两边不能有空格
    3)使用SPY查看对象的属性名和属性值(Tools -> Object Spy)
    步骤三:描述性编程提高
    Dim descEditLogin
    Set descEditLogin = Description.Create()
    descEditLogin("Class Name").Value = "Dialog"
    descEditLogin("Regexpwndtitle").Value = "Login"
    Dialog(descEditLogin).WinEdit("Attached text:=Agent Name:").Set "Holly"
    Dialog(descEditLogin).WinEdit("Attached text:=Password:").Set "Mercury"
    Dialog(descEditLogin).WinButton("Class Name:=WinButton", "text:=Cancel").Click
    在这里需要注意有两点:
    1)把经常使用到的对象定义为一个对象变量,方便以后调用,减少代码工作量和错误
    2)使用SPY获取对象的属性和属性值
    步骤四:使用自定义的环境变量
    在File>>Settings>>Environment中选择user-defined,增加一个变量
    dlgLogin = “Login”
    这样脚本可以被修改为:
    Dim descEditLogin
    Set descEditLogin = Description.Create()
    descEditLogin("Class Name").Value = "Dialog"
    descEditLogin("Regexpwndtitle").Value = Environment.Value("dlgLogin")
    Dialog(descEditLogin).WinEdit("Attached text:=Agent Name:").Set "Holly"
    Dialog(descEditLogin).WinEdit("Attached text:=Password:").Set "Mercury"
    Dialog(descEditLogin).WinButton("Class Name:=WinButton", "text:=Cancel").Click
    当然,参数化的方式很多,这边介绍的是使用环境变量
    步骤五:从XML文件导入环境变量


    dlgLogin
    Login


    可以使用手工导入,也可以使用LoadFromFile自动导入
    总结:
    优点是当对象的一些属性变更后,脚本更容易维护。
    比如说对于一个通用对象,比如save, reset, cancel等按钮,一个页面有3个,30个页面就有90个对象,
    假如save变成保存,reset变成重置,cancel变成取消,那么对象库就会产生很大的变动。
    而使用了描述性编程只需要在导入的XML文件中修改一个值就可以了。
    当然描述性编程的作用远远不止这些,这次只是抛砖引玉,希望大家共同进步。










     


    收藏到:Del.icio.us




    评论

  • 该评论来自:http://zlfoxy.blogbus.com/logs/14607444.html<br />
    <div class="quote"><p>此篇文章为《在QTP中使用描述性编程(实例)》的继续讨论,原文章地址为:http://zlfoxy.blogbus.com/logs/14606271.html</p><p>原文摘要:</p> 原作:老赵<br /><br />在QTP中使用描述性编程是一个提高QTP脚本利用率的很好的方式。<br />通常QTP是通过对象库来识别不同的对象,而描述性编程是QTP另外一种能够识别对象的途径,它不依赖于对象库,通过增加一些对象的描述来识别对象的。<br /> 说明:本例子是以Flight飞机订票系统的登陆界面为测试页面进行描述的。<br /> 步骤一:录制脚本<br />Dialog(&quot;Login&quot;).WinEdit(&quot;Agent Name:&quot;).Set...</div><p>QTP的工作原理有点类似人类社会的某些场景.比如一个朋友委托你带东西给A,如果你认识A,这表明A的容貌特征以及一些联系已经在你脑海有了印象,那么你只要找到了A的住所,那么这个任务就很容易完成了,如果你根本就不认识A,则这个任务就很难完成了. <br /><br />那在QTP中有没有一种方法,无须在对象库中记录任何关于某个对象的信息,就可以完成对该对象的操作呢,有.那就是描述性编程,其工作原理就象上面这个例子.<br /><br />在QTP中,有一按钮对象,对它的操作如下:<br /><br />Dialog(&quot;Login&quot;).WinButton(&quot;OK&quot;).Click<br /><br />但是如果我们在对象库中删除这个对象后,执行这句话就会出错,提示找不到对象,在这个时候,我们就可以通过描述性编程给他指定对象及其他的一些属性,修改如下<br /><br />Dialog(&quot;Login&quot;).WinButton(&quot;text:=OK&quot;).Click<br /><br />上面脚本中,通过WinButton(&quot;text:=OK&quot;)明确告诉QTP去寻找文本属性为OK的按钮,于是QTP正确识别到该对象,顺利的执行了脚本<br /><br />这种不需要在对象库中存储对象的信息,就可以执行对象操作的方法,就是QTP中比较高级的用法:描述性编程(descrīptive progamming).描述性编程和传统的QTP脚本的区别是:他把需要识别的对象的属性从对象库中转移到了脚本里面,通过在脚本里面的特殊语法格式.来告诉QTP识别对象的方法.描述性编程更加灵活,因为他不需要经过录制这个步骤,可以直接通过编程的方式操作任何一个你想操作的对象,只要你在测试脚本代码里提供给QTP识别该对象的足够信息<br /><br />描述性编程的语法格式如下:<br /><br />micClasas(&quot;property1:=value1&quot;,&quot;property2:=value2&quot;)<br /><br />micClass标志某个对象的类别,括号里面通过jproperty:=value的形式告诉QTP识别该对象的必要属性.我们继续修改一下测试脚本:<br /><br />Dialog(&quot;Login&quot;).WinButton(&quot;text:=OK&quot;).Click<br /><br />修改后:<br /><br />Dialog(&quot;Login&quot;).WinButton(&quot;nativeclass:=Button&quot;,&quot;text:=OK&quot;).Click<br /><br /><br /><br />F5执行,结果运行顺利.这次修改,我们使用了一个通用的对象类WinObject,而把按钮当作一个基本属性nativeclass:=Button,同样可以完成对该按钮的操作<br /><br />由上面的叙述我们可以看出来,描述性编程没有严格的要求,只要遵循一个原则:在代码中告诉QTP足够他识别该对象的属性,QTP就可以不通过对象库,而是通过描述性编程的方式完成对指定对象的操作.所以描述性编程没有什么神秘的,他无非是把原来存储在对象库中的信息提到代码中来了而已.<br /><br />------附<br /><br />QTP工作原理:<br /><br />1.录制的时候,QTP将我们操作过的所有对象都记录下来,保存在对象库object repository中,记录的形式是一个逻辑名加上若干识别属性<br /><br />2.运行脚本时,QTP分析该脚本要执行那个对象的操作,然后根据该语句中的逻辑名,在对象库中查找该对象的详细记录,然后在运行的真实披头散发软件中按图索骥,</p>
  • 写的很透彻。
    其实qtp没有多么智能——脱了马甲就不认识你了。