发布新日志

  • QTP识别和操作对象的原理

    2007-06-22 08:44:00

        QTP为用户提供了两种操作对象的接口,一种就是对象的封装接口,另一种是对象的自身接口。
        对象的自身接口是对象控件本身的接口,只要做过软件开发,使用过控件的人应该很清楚。
        对象的封装接口是QTP为对象封装的另一层接口,它是QTP通过调用对象的自身接口来实现的。


    两种接口的脚本书写格式的差别在于:
        自身接口需要在对象名后面加object再加属性名或方法名,封装接口就不用在对象名后面加object。

        比如操作JavaEdit对象,通过QTP封装的封装接口,脚本如下:
        设置JavaEdit的内容:
         JavaDialog("Add NE").JavaEdit("NE Name").Set "NE1"
        读取JavaEdit的内容:
         msgbox JavaDialog("Add NE").JavaEdit("NE Name").GetROProperty("value")

        如果通过JavaEdit的自身接口,脚本如下:
        设置JavaEdit的内容:
        JavaDialog("Add NE").JavaEdit("NE Name").object.setText("NE1")
        读取JavaEdit的内容:
        Msgbox JavaDialog("Add NE").JavaEdit("NE Name").object.getText()

        QTP执行JavaEdit().Set语句时,是通过执行JavaEdit().object.setText()来实现的。
        QTP执行JavaEdit().GetROProperty("value"),是通过执行JavaEdit().object.getText()来实现的。
        JavaEdit对象的封装接口Set()和GetROProperty("value"),是QTP封装JavaEdit对象的自身接口setText()和getText()而得来的。

        对象的封装接口是QTP使用的缺省接口,我们录制出来的脚本都是使用封装接口,大家用的也都是封装接口。
        但是封装接口不如自身接口丰富,因为QTP只是封装了部分常用的自身接口嘛。
        所以我们在需要时,可以绕过封装接口,直接调用对象的自身接口。
        不过有些自身接口不够稳定,在实践中偶尔会出现问题,但是概率很少。
       封装接口有相应功能的话,就尽量用封装接口吧!

      
        理解了封装接口和自身接口的原理,我们就可以更加灵活的操作对象了。

        但是我们怎么知道对象都有哪些封装接口和自身接口呢?
        其实很简单,用对象查看器(Object Spy)查看对象,在查看窗口里有列出这些接口,包括属性和方法。
        窗口中间有选择栏让你选择Run-time Object或者Test Object,当你选择Run-time Object时,它显示的就是对象的自身接口(自身的属性和方法)当你选择Test Object时,它显示的就是对象的封装接口(封装的属性和方法)

        明白了这些,你还等什么呢?快拿起对象查看器,看看对象都有哪些封装接口和自身接口,肆意的操作它,玩弄它吧!

        比如执行
        JavaDialog("Add NE").JavaEdit("NE Name").object.setVisible(false)
         哈哈,你的JavaEdit对象就当场消失不见了!!!

  • QTP板块上的常用辅助工具

    2007-06-05 16:29:07

  • [Quote]QTP学习的一些技巧

    2007-05-24 13:46:32

    1.测试中我们使用QTP调试脚本的时候一般就是DEBUG或者MSGBOX察看一些信息,其实有时候也可以使用print来实现批量的察看信息但是不影响程序运行.
    运行脚本:
    a="100"
    print a
    ~~~~~~~~~~~~~~~~~~~~~~~~~
    2.
    datatable特定行的数据可以这样使用
    运行脚本:
    DataTable.GetSheet("Action1").GetParameter("test").ValueByRow(4)
    ~~~~~~~~~~~~~~~~~~
    3.Wait Seconds [, Milliseconds]
    可以精确到毫秒.
    ~~~~~~~~~~~~~~~~~~
    4.
    在自定义的function里面数组作为返回值.
    运行脚本:
    circuit = "399937"
    Function trimString(circuit)
    Dim holdArray(5)
    holdArray(0) = Left(circuit, 2)
    holdArray(1) = Right(circuit, 2)
    msgbox holdArray(0) 'showed 39
    trimString = holdArray' I get an out of range error here
    End Function
    dim myArray
    'here I want to assign the return array to another array
    myArray = trimString(circuit)
    ' and then call one element from it
    msgbox myArray(1)
    ~~~~~~~~~~~~~~~
    5.
    计算一个操作的时间.
    运行脚本:
    Browser("Browser").Page("Page").Image("getRates").Click
    var_StartTime = Timer
    Browser("Browser").Page("Page").Sync
    Browser("Browser").Page("Page").Check CheckPoint("Check1")
    var_EndTime = Timer
    intRespTime = round ((var_EndTime - var_StartTime), 2 )
    msgbox (intRespTime)

  • [Quote]QTP Timeout Settings

    2007-05-24 13:45:48

     

    1.      Object Sync Timeout:这是QTP在等待一个对象显示的时间

    具体设置方法: Test Settings, Run Tab, the “Object Synchronization timeout:” setting.

    请注意在8.x版本中单位是毫秒,而在9.x 就变成秒了。

    程序中设置: Setting(“DefaultTimeout”) [=milliseconds]

    2. Browser Navigation Timeout
    帮助里这样定义 “sets the maximum time (in seconds) that QuickTest waits for a Web page to load before running a step in the test”. 那和上面的Object Sync Timeout setting有什么区别的,MI没有说,我猜想是在测试一个显示很缓慢的页面的时候使用吧。针对Navigation而不是一个对,从脚本看:

    Browser(“Browser”).Page(“Page”).WebRadioGroup(“Name:=txt_Name”,”html tag:=INPUT”).set “Test”

    这可能是一开始Browser的等待时间吧。

    具体设置方法: Test Settings, Web tab, “Browser navigation timeout:” X “seconds”

    在程序中怎么实现还没有解决,谁可以帮助我?

    3. Default Load Time
    QTP help 这样定义Instructs QuickTest to add a specified number of seconds to the page load time property specified in each Page checkpoint.”. 很迷惑,按照帮助的理解就是检查点额外的等待时间,过了这个时间再没有出现检查的数据可能就会返回错误了。
    具体设置方法: Options, Web Tab, “Add” x “seconds to page load time”
    程序中设置: Setting(“DefaultLoadTime”) [=seconds]

    4. Activate Window
    定义“specifies the time (in tenths of a second) that QuickTest waits before it sets the focus on an application window when using the pointing hand to point to an object in the application (for Object Spy, checkpoints, Step Generator, Recovery Scenario Wizard, and so forth)”. 我一直使用的默认的值,挺好的。呵呵。
    具体设置方法: Options, General tab, “When pointing at a window, activate it after” X “tenths of a second”
    程序中设置,暂无。

    5. .Exists(Timeout)
    用的是毫秒作为单位.

    6.  .WaitProperty(x, y, Timeout)
    用的是毫秒作为单位.

    7. Wait seconds [, milliseconds]

    这个就是我们经常用的wait,不过后面可以选择毫秒可能有的人就不知道了。

     

     

    以上是我总结的一些QTP关于时间的设置的,很多概念自己也不算清楚,希望和大家一起在学习中进步。

     
  • (Quote)QTP中的descriptive programming

    2007-05-24 13:44:54

     

    【摘要】自动化功能测试是一种企业级的用于检验应用程序是否如期运行的功能性测试工具。通过自动捕获,检测,和重复用户交互的操作,能够辨认缺陷并且确保那些跨越多个应用程序和据库的业务流程在初次发 布就能避免出现故障,并且保持长期可靠运行。在市场上用的比较多的主要包括Mercury公司的WinRunnerQuickTest ProfessionalIBMRational Robot。笔者对于QuickTest Professional相对较为熟悉,希望有机会向大家逐步介绍QuickTest Professional中的一些要点及技巧。在本文里主要介绍了QuickTest Professional中的一项核心内容Descrīptive Programming,希望对大家有所借鉴和帮助。在文中,为了方便起见,将QuickTest Professional简称QTP(本文是基于Quick Test Professional V8.0而写)

    【关键词】

    描述性编程Descrīptive Programming

    功能测试Functional Test

    专家视图Expert View

    关键字视图Keyword View

    对象模型Object Model

    运行时对象Run-Time Object

    测试对象Test Object

    【正文】

    QTP功能测试基本方法

    我们简单介绍一下有关功能测试的基本方法,这实际上对于所有自动化功能测试产品来说都是一样的。一般情况下,用QTP来进行功能测试的基本方法主要包括三个主要阶段:

     

     

    1、创建测试或组建

    首先可以通过在应用程序或网站上录制会话,或者建立对象库并使用关键字驱动功能向关键字视图中手动添加步骤来创建测试或组件。在QTP里面我们可以通过两种方式添加步骤来创建测试或组件:

    • 在应用程序或网站上录制会话。
    • 建立对象库并使用这些对象在关键字视图或专家视图中手动添加步骤

    然后在在测试或组件中插入检查点,检查页面、对象或文本字符串中的特定值或特征,通过它可以标识网站或应用程序是否正常运行。或是通过用参数替换固定值扩展测试或组件的范围。提供数据表中的数据,定义环境变量和值,定义测试、组件或操作参数和值,或者使用QTP生成随机数字或当前用户和测试数据等。

    最后如果需要的话使用QTP中众多的功能测试功能来增强测试或组件或添加编写语句来实现更复杂的测试目标。

    2、运行测试和组建

    控制运行会话,帮助标识和消除测试或组件中的缺陷。使用单步执行单步跳过单步退出命令逐步运行测试或组件,或设置断点使测试或组件在预定点暂停。每当测试或组件在断点处停止时,可以在调试查看器中查看其变量的值。

    3、分析结果

    在运行测试或组件之后,通过两种方式可以查看其结果:在结果窗口中查看结果;自动报告在运行会话过程中检测到的缺陷,可能的话并上报到其他缺陷管理产品中。

    .试图与对象模型

    在介绍QTP中的Descrīptive Programming前,我们有必要先介绍一下ExpertView及在ExpertView里进行编码的一些基本知识。

    QTP里面提供了两种视图,第一种我们把它称为KeywordView(关键字视图,在早期的版本中称为TreeView),第二种把它成为ExpertView(专家视图),这两种视图分别是针对两种类型的人进行使用的。

    1KeywordView(关键字视图)

    通过关键字视图,QTP提供了一种模块化的表格格式创建和查看测试或组件的步骤。每个步骤在关键字视图中都是一行,这样用户可以轻松的修改任何一部分组成。

    在录制会话过程中,用户在应用程序上执行的每个步骤在关键字视图中记录为一行。例如,在51testing的页面上执行的下列三个步骤:

    • 用户名编辑框中输入 zhoda02
    • 密码编辑框中输入加密字符串 41c630a213508cd49eb35089db1b893144b9
    • 单击登录按钮。

    那么,关键字视图将包含下列行:

     

     

    很显然,关键字视图非常直观有效,使用的人可以很清晰的看到被录制对象的录制层次及运行步骤,比较适合那些对于业务操作流程熟悉的人员使用。但是,如果需要一些增强型的操作,那就需要切换到专家视图里进行了。

    2ExpertView(专家视图)

    QTP在关键字视图中的每个节点在专家视图中对应一行脚本。上面例子对应的脚本如下:(删除后一句是因为前后重复,一句可以说明问题)

    Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebEdit("username").Set "zhoda02"

    Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebEdit("password").SetSecure "41c630a213508cd49eb35089db1b893144b9"

    Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebButton("登录").Click

    对于QTP来说,其核心编码语言是Visual Basic scrīpt,因此,如果用户熟悉VBscrīpt,可以运用自如的添加和更新语句,并通过编程方式增强测试和脚本,而这一切必须在专家视图中完成。

    更为重要的是,有些操作是必须在专家视图中才可以完成的,例如:要处理动态对象、客户化报告、获取对象运行时的属性值(Run-time Value)等等,这些都必须通过专家视图中的VBscrīpt编码完成。

    然而,QTP里所有的操作都是基于对象进行的,所以我们必须对对象模型有一个基本了解,才可以在专家视图内进行Descrīptive Programming

    3、测试对象模型

    测试对象模型是一大组对象类型或类,QTP用这些对象类型或类来表示应用程序中的对象。每个测试对象类都有一个可以唯一标识属于该类的对象的属性列表,以及一组 QTP可以对其进行录制的方法。它包括测试对象(Test Object)和运行时对象(RunTime Object)。

    测试对象是QTP在测试或组件中创建的用于表示应用程序中的实际对象的对象。QTP存储有关该对象的信息,这些信息有助于它在运行会话期间标识和检查该对象。

    运行时对象是网站或应用程序中的实际对象,在运行会话期间执行针对该对象的方法。

    如果录制时执行应用程序的相应操作,则一般情况下QTP将完成以下操作:

    • 标识 QTP测试对象类(表示执行了操作的对象),并创建相应的测试对象
    • 读取应用程序中对象属性的当前值,然后将属性和属性值列表与测试对象一起存储。
    • 选择该对象的唯一名称,一般使用该对象某个重要属性的值。
    • 使用适当的 QPT 测试对象方法录制对对象执行的操作。

    例如,假定使用以下 HTML 源代码单击查找按钮:

    <INPUT TYPE="submit" NAME="Find" VALUE="Find">

    QTPl将单击的对象标识为 WebButton 测试对象。它将创建一个名为 Find WebButton 对象,然后为该 Find WebButton 对象录制下列属性和属性值,同时还会录制对WebButtionClick方法。

     

     

    在关键字视图及专家视图中显示内容分别为:

    查看(656) 评论(0) 收藏 分享 管理

  • QTP中的描述性编程

    2007-05-24 13:42:47

      当我们并不想QTP依靠对象库来识别对象时,我们就可以借用描述性编程的方式.把对象的属性及属性值直接搬到代码中去,QTP直接通过脚本中的这些属性及属性值就能识别到这个对象,而不必再去匹配对象库.总的来说,如果您希望在未存储在对象库中的对象上执行操作,则这种编程描述将是非常有用的。或者还可以使用编程描述在具有某些相同属性的多个对象上执行相同的操作,或者在其属性与运行会话期间动态确定的描述相匹配的对象上执行操作。比如:在我的<QTP参数化实例>文章中,已经运用过描述性编程了.由于参数化的时候受到了对象库的制约,所以也采用了描述性编程的形式,让要参数化的对象不再受到对象库的制约.

    Dialog("Login").WinEdit("Agent Name:").Set "mercury"
    Dialog("Login").WinEdit("Password:").SetSecure "45a1e193f9dac3bf91f3ba7c1dd250a48a33eabf"
    Dialog("Login").WinButton("OK").Click
    Window("Flight Reservation").Close

        对应的对象库,如图:

     

        然后我们把对象库中,这些对象的属性及属性值从对象库搬到脚本中,代码修改成为:


    Dialog("text:=Login").WinEdit("attached text:=Agent Name:").Set "mercury"
    Dialog("text:=Login").WinEdit("attached text:=Password:").SetSecure "4414d23c42046da1ea3a895f1518b9c476b2b225"
    Dialog("text:=Login").WinButton("text:=OK").Click
    Window("regexpwndtitle:=Flight Reservation").close

        把对象库中对象删除掉,如下图:

  • (转)QTP中读取Access数据

    2007-05-24 13:40:03

    以下是QTP脚本,目的是用来读取Access数据库中的数据,代码如下:

    Option explicit
    R0q:J:B0NOGqq94129Dim Cnn ,strDb,Rst,strCnn,ilen  '//
    定义变量
    n8keP.RYC[1]k94129strCnn="Provider=Microsoft.Jet.OLEDB.4.0;Ole DB Services=-4;Data Source=D:\test\calc.mdb" ' //
    将获得的连接字符串赋值到
    8f:AgdFH-K94129Set Cnn=CreateObject("ADODB.Connection") '//
    生成数据库连接对象
    Z#cP2n
    Bu1yw94129
    Cnn.Open strCnn   '   //
    打开数据库
    K R9N`IJ-j%[94129Set Rst=CreateObject("ADODB.Recordset")  '//
    生成记录集对象  51Testing软件测试网im9L#C
    T{:kJNS2p

    Rst.Open "select * from calc" ,Cnn  
    im*~1N‑l1X8k94129Do While Not  Rst.EOF 51Testing
    软件测试网(s0},p p PZ,V
       For iLen=1 to 3  '//
    我的表中只有3个字段,当然这种方法通用性不是很好51Testing软件测试网y~I bd[1]Z9Oe c
        Select Case iLen51Testing
    软件测试网)RQiI8a j]
    V{F}

          Case 151Testing
    软件测试网\mj8LsL
                  strDb=strDb&Rst.Fields.item(iLen)&" "
    {
    B [1z#_"M*|o­T Z$V(U94129
          Case 2
    ,J,pB c,ou94129              strDb=strDb&"+ "&Rst.Fields.item(iLen)&" "
    ({0D"|3G cG!V"x7}&Z94129      Case 3
    a(N)c Vx9u
    l[(Vg94129
                  strDb=strDb&"= "&Rst.Fields.item(iLen)51Testing
    软件测试网#`PA wY9r |j"h&w
        End Select
    9dO"S @7RK-F-Z5B%G1^94129   Next

    zMOJ L94129
       strDb=strDb&chr(13)
    .V}S
    Q%S,g94129
       Rst.MoveNext
    (u;t!y,o4]e5v$W J1}94129 Loop 51Testing
    软件测试网_4h)~lSV ] G'Yfzf
    Rst.Close51Testing
    软件测试网|M4L/R
    ~ {yO#K

    cnn.close51Testing
    软件测试网K&x)B-t3kB
    t8lL

    msgbox strDb51Testing
    软件测试网'^­p)T5`:F ~o@hL
    希望这对QTP新手找这方面资料时有点帮助.
  • [转载]不用checkpoint的Bitmap比较

    2007-05-24 13:38:36

      fColor2   =   mybmp2.Point(X,   Y)     
      if   fColor1<>fColor2   then     
      msgbox   "
    不一样!
    "   

      End   If   
      Next   'X
      Next   'Y

  • VBScript中SendKeys的妙用

    2007-05-24 13:37:18

    什么是VBscrīpt?

    VBscrīpt
    的全称是:Microsoft Visual Basic scrīpt Editon.(微软公司可视化BASIC脚本版). VBS(VBscrīpt的进一步简写)是基于Visual Basic的脚本语言,其不编译成二进制文件而是直接由宿主(host)解释源代码并执行简单点说就是你写的程序不需要编译成.exe, 而是直接给用户发送.vbs的源程序用户就能执行了.

    SendKeys 
    方法


    模拟键盘操作,将一个或多个按键指令发送到指定Windows窗口来控制应用程序运行, 
    其使用格式为:
    object.SendKeys(string) 

    “object”
    :表示WshShell对象
     
    “string”
    :表示要发送的按键指令字符串,需要放在英文双引号中。


    -----------------------------------
    1.
    基本键 

      一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母“x”,使用“WshShell.SendKeys "x"”即可。当然,也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可,例如,要发送按键“happy”,可以使用 WshShell.SendKeys "happy" 

    2.
    特殊功能键 

      对于需要与ShiftCtrlAlt三个控制键组合的按键,SendKeys使用特殊字符来表示: 

      
    Shift---------WshShell.SendKeys "+" 
      
    Ctrl---------WshShell.SendKeys "^" 
      Alt---------WshShell.SendKeys "%"  (注意   这样使用时,不用大括号括起这些特殊字符。)

      由于“+”“^”这些字符用来表示特殊的控制按键了,如何表示这些按键呢? 只要用大括号括住这些字符即可。例如要发送加号“+”,可使用“WshShell.SendKeys "{+}"” 

    另外对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称。

    例如要发送回车键,需要用“ WshShell.SendKeys "{ENTER}" ”表示;
    发送向下的方向键用“ Wshell.SendKeys "{DOWN}" ”表示。 

    Space---------WshShell.SendKeys " " 
    Enter---------WshShell.SendKeys "{ENTER}" 
    ←---------WshShell.SendKeys "{RIGHT}" 
    ↑---------WshShell.SendKeys "{UP}" 
    F1---------WshShell.SendKeys "{F1}" 

    按键                代码
        
    BACKSPACE     {BACKSPACE}, {BS}, 
     {BKSP}    
    BREAK         {BREAK}    
    CAPS LOCK     {CAPSLOCK}    
    DEL or Delete {Delete} 
     {DEL}    
    DOWN ARROW    {DOWN}    
    END           {END}    
    ENTER         {ENTER}
     ~    
    ESC           {ESC}    
    HELP          {HELP}    
    HOME          {HOME}    
    INS or Insert {Insert} 
     {INS}    
    LEFT ARROW    {LEFT}    
    NUM LOCK      {NUMLOCK}    
    PAGE DOWN     {PGDN}    
    PAGE UP       {PGUP}    
    PRINT SCREEN  {PRTSC}    
    RIGHT ARROW   {RIGHT}    
    SCROLL LOCK   {SCROLLLOCK}    
    TAB           {TAB}    
    UP ARROW      {UP}    
    F1 {F1}    
    F2 {F2}    
    F3 {F3}    
    F4 {F4}    
    F5 {F5}    
    F6 {F6}    
    F7 {F7}    
    F8 {F8}    
    F9 {F9}    
    F10 {F10}

    Tips:
    如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键 数字}”。例如要发送10个字母“x”,则输入“WshShell.SendKeys "{x 10}"”即可。


    -----------------------------------
    按下F5刷新桌面 

    Dim WshShell,Path,i 
    Set WshShell = Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "{F5}" 
    ---------------------------------------------------- 
    电脑的自动重启
     

    set WshShell = CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "^{ESC}u" 
    WshShell.SendKeys "R" 
    ---------------------------------------------------- 
    启动任务管理器
     

    set WshShell = CreateObject("Wscrīpt.Shell") 
    WshShell.SendKeys "^+{ESC}" 
    ---------------------------------------------------- 
    QQ
    消息连发
     

    Dim WshShell 
    Set WshShell= Wscrīpt.createObject("Wscrīpt.Shell") 
    WshShell.AppActivate "bomb" 
    for i=1 to 60 
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "What do you say" 
    WshShell.SendKeys i 
    WshShell.SendKeys "%s" 
    next 
    ---------------------------------------------------- 
    自动到百度搜索歌曲:
    white flag 

    Dim WshShell,Path,i 
    Set WshShell = Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.Run("IEXPLORE.EXE") 
    Wscrīpt.Sleep 2000 
    WshShell.AppActivate "about:blank-Microsoft Internet Explorer" 
    WshShell.SendKeys "+{TAB}" 
    WshShell.SendKeys "
    http://mp3.baidu.com
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "{ENTER}" 
    Wscrīpt.Sleep 3000 
    WshShell.SendKeys "white flag" 
    Wscrīpt.Sleep 800 
    WshShell.SendKeys "{ENTER}" 
    ---------------------------------------------------- 
    自动关机

    Dim WshShell
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell")
    Wscrīpt.Sleep 2000
    WshShell.Run "shutdown -r -t 120"
    wscrīpt.sleep 6000
    WshShell.Run "shutdown -a"
    ---------------------------------------------------- 
    在记事本中输入Happy Birthday!并保存为birth.txt 

    Dim WshShell 
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell") 
    WshShell.Run "notepad" 
    Wscrīpt.Sleep 1500 
    WshShell.AppActivate "
    无标题 - 记事本

    WshShell.SendKeys "H" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "a" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "p" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "p" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "y" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys " " 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "B" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "i" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "r" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "t" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "h" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "d" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "a" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "y" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "!" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%FS" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "b" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "i" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "r" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "t" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "h" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%S" 
    Wscrīpt.Sleep 500 
    WshShell.SendKeys "%FX" 
    ---------------------------------------------------- 
    制作能自动定时存盘的记事本
     

    '
    第一部分:定义变量和对象
     

    Dim WshShell, AutoSaveTime, TXTFileName 
    AutoSaveTime=300000 
    Set WshShell=Wscrīpt.CreateObject("Wscrīpt.Shell") 
    TXTFileName=InputBox("
    请输入你要创建的文件名(不能用中文和纯数字)
    ") 

    '
    第二部分:打开并激活记事本
     

    WshShell.Run "notepad" 
    Wscrīpt.Sleep 200 
    WshShell.AppActivate "
    无标题 - 记事本


    '
    第三部分:用输入的文件名存盘
     

    WshShell.SendKeys "^s" 
    Wscrīpt.Sleep 300 
    WshShell.SendKeys TXTFileName 
    Wscrīpt.Sleep 300 
    WshShell.SendKeys "%s" 
    Wscrīpt.Sleep AutoSaveTime 
    '
    第四部分:自动定时存盘
     
    While WshShell.AppActivate (TXTFileName)=True 
    WshShell.SendKeys "^s" 
    Wscrīpt.Sleep AutoSaveTime 
    Wend 
    Wscrīpt.Quit 

    ---------------------------------------------------- 

    自动死机
    o(∩_∩)o...

    DIM WSHSHELL 
    SET WSHSHELL=Wscrīpt.CreateOBJECT("Wscrīpt.SHELL") 
    'WSHSHELL.RUN " " 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 
    'Wscrīpt.SLEEP 1000 
    WSHSHELL.SENDKEYS "{ENTER}" 

    [/quote]

     

        再来执行脚本,QTP执行成功.这就是描述性编程.当然值得注意的是,如果父对象用描述性编程表示了,那么后面的对象都要用描述性编程表示了.:

    Dialog("text:=Login").WinEdit("attached text:=Agent Name:").Set "mercury"

        这边Dialog("text:=Login")用描述性编程表示了,那么WinEdit("attached text:=Agent Name:")就必须要描述性编程表示了.因为在对象库中,子对象是依靠父对象存在的.所以如果Dialog("text:=Login")这个父对象从对象库中删除了,那么后面的子对象也同时被删除了.反过来子对象删除就不影响父对象.所以子对象可以单独用描述性编程表示,而不需牵连其他对象.

    此文来源于51testing博客,转载请注明出处为51testing博客
    原始链接:
    http://blog.51testing.com/?26649/action_viewspace_itemid_2625.html

  • 使用QTP的一些技巧

    2007-05-24 13:13:08

    一.Action

    GLOBAL  SHEET:可在任何action中调用它。(相当于全局变量)
    CURRENT  ACTION  SHEET(LOCAL):只提供对于本ACTION的调用
    如果你用了一个共享的对象库那么你就不能选择LOCAL来存储存一个对象数据表参数。
    ACTION  TOOLBAR真到插入ACTION才会出现。VIEW>TOOLS>ACTION
    DELETE一个插入的可重复ACTION如果DELETE第一项:只是删除此ACTION的调用语句。此ACTION还存在语句。
    第二项:把此ACTION从TEST中完全删除。
    如果在一个从外面调用来的ACTION插入新的ACTION那么是直接插入它的后面而不能插入其中,因为它是只读的。

     每天多一点!

  • QTP中一些基础代码结构累积

    2007-05-24 13:04:57

     

    1.        生产随机数列

    第一种方法:

    randomize'更新反回的数据

    funcation rand(k,n)

    n=int((k-1)*rnd+1)

    rand=n

    end funcation

    第二种方法:

    n=randomnumber.value(1,255) 

    2.        当运行到表中的某一行,自动导出表中的所有数据

    row=datatable.getcurrentrow

    if row="5" then

      datatable.export("d:\data.xml")

    end if

    3.        webedit("txtpass").setsecure"sdsdf...."

    如果参数化密码,可以直接在数据表中写入未加密的密码,它会自动识别,即不用把setsecure改为set 

    4.        如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证

    if browser("web_name".dialog("dialog_name").exist(1) then

    //如果不出现=false

    error_message=browser("web_name".dialog("diaglog_name".static("用户密码错误!").getRoproperty("text")))

      if error_message<>(datatable.value("error_info")) then

            msgbox(error_message)

        end if

        browser("web_name").dialog("diaglog_name").close

    end if

    这里我总结了两点技巧:

      一是:对于dialog中,虽然提示信息对象名称是“用户密码错误”,但如果信息对象名称是“该用户不存在”,不用更改会自动识别,我想主要是录制第一遍时,“用户密码错误”只是让运行时能找到这个控制,而不管它是什么内容,因为在对象仓库中,text不是决定该对象的属性。

        二是:如果对于提示信息比较长的,可以用mid(error_message,n,m)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理。

    5.        在运行时,向某一个单元格赋值: datatable.value("kai",dtlocalsheet)="nanjing"

    datatable.value("num")只在global形式下的一种省略形式;完整形式是datatable.value("num",dtlocalsheet)

    ——取得某一具体行的值:

    datatable.setcurrentrow(n);

    msgbox(datatable.getsheet("global").getparameter("kai").Rawvalue)

    或者

    kk=datatable.Rawvalue("kai","action1")

    -------------

    for i=1 to 3

    DataTable.SetCurrentRow(i)

    DataTable.Value("A","Global")=I            //DataTable.SetNextRow

    next

    -------------

    ——在run-time期间,添加一个action和参数

    kk=datatable.addsheet("name").addparameter("kai","ddd"). name'/value 

    6.      

     

    with dialog("name")                                   //可以省好多代码,看着也简洁

    content=.wintreeview

    end with

     

    7.       

    wintreeview.select(item)                    (根是0,列表第一个也是0)

    wintreeview.getcontent

    wintreeview.getitem(整行)+";"+

    winlistview.getitem(行中的第一个字符段)

    wincheckbox("").set"off"'/on 

    8.        数据库检查点:

     

    sub getdata

    set con=createobject("adodb.connection")

    con.open("descrīption=mod;driver=sqlserver;server=hp\sqlserver;uid=sa;"&_

             "pwd=11111;APP=qtp;WSID=hp;database=MOD31" 

                                                  //sqlserver方式

    Con.open "DRIVER = {Microsoft Access Driver (*.mdb)};DBQ=D:\Testdb.mdb"

    //access方式

    set record=createobject("adodb.recordset")

    sql="select * from m3_program"

    //选择具体满足一条件的:sql="select* from m3_program where "

    record.open sql,con

    if(record("p_name")="kai") then

    num=num+1;

    end if          

    if(not record.eof) then

    record.movenext

    msgbox("p_name")

    end if

    record.close

    set record=nothing

    con.close

    set con=nothing

    end sub                                   //如果没有查到内容,在结果中不会报错,也不会弹出窗口

     

    9.       

    vbcr----chr(13)回车符

    vblf----chr(10)换行符

    vbcrlf----chr(13)+chr(10)结合

     

    10.    stel run has two ways

     

    11.    对于时间,日期等的格式检查(一种是正则表达式,另一种是输出对比,如果不好对比,用mid截取一部分对比)

     

    12.   

  • (Quote)基础代码交流贴(随机数)

    2007-05-22 16:47:27

    这两周我开始学习QTP测试我们的web服务了;大体的软件使用操作流程是懂了,但具体实施起来特别是代码的组织及函数应用还有一些困难,因为自己只会vb没学习vbscrīpt,所以想和大家交流一下代码等一些基础知识;呵呵,一起学习,加强记忆与应用
    1 生产随机数列
    第一种方法
    randomize'更新反回的数据
    funcation rand(k)
    n=int((k-1)*rnd+1)
    rand=n
    end funcation

    第二种方法
    n=randomnumber.value(1,255)

    2  当运行到表中的某一行,自动导出表中的所有数据
    row=datatable.getcurrentrow
    if row="5" then
      datatable.export("d:\data.xml")
    end if

    3
    webedit("txtpass").setsecure"sdsdf...."
    如果参数化密码,可以直接在数据表中写入未加密的密码,它会自动识别,即不用把setsecure改为set

    4 如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证
    if browser("web_name").dialog("dialog_name").exist(1) then'如果不出现=false
         error_message=browser("web_name").dialog("diaglog_name").static("用户密码错误!".getRoproperty("text")
       if error_message<>(datatable.value("error_info"))then
             msgbox(error_message)
          end if
         browser("web_name").dialog("diaglog_name").close
      end if
    这里我总结了两点技巧:
      一是:对于dialog中,虽然提示信息对象名称是"用户密码错误",但如果信息对象名称是“该用户不存在”,不用更改会自动识别,我想主要是录制第一遍时,“用户密码错误”只是让运行时能找到这个控制,而不管它是什么内容,因为在对象仓库中,text不是决定该对象的属性
        二是:如果对于提示信息比较长的,可以用mid(error_message,n,m)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理

    5  datatable.value("num")只在global形式下的一种省略形式;完整形式是:
    datatable.value("num",dtlocalsheet)

    -----向某一列的单元格赋值:
    datatable.value("column_name",dtlocalsheet)="nanjing"

    -----取得某一行具体值:
    datatable.setcurrentrow(n)
    msgbox(datatable.getsheet("global").getparameter("column_name").Rawvalue)
    或者kk=datatable.Rawvalue("column_name","action1")

    ----在run-time时,动态添加表格与数据
    kk=datatable.addsheet("sheet_name").addparameter("column_name","value").name;

    7   wintreeview一些操作
    选择一个条目:wintreeview.select(item)'根是0
    根的名称:wintreeview.getitem(0)

    8   数据库检查点模块:
    sub database_check
    set con=createobject("adodb.connection")
    con.open "Descrīption=IBM_ODBC;DRIVER=SQL Server;SERVER=IBM;UID=sa;"&_
                     "PWD=123456;APP=Quick Test Pro;WSID=IBM;DATABASE=IBM_table"
    'access方式:con.open "DRIVER={Microsoft Access Driver (*.mdb)};DBQ=d:\test.mdb"
    'Orocle方式:con.open "DRIVER={Oracle in OraHome92};SERVER=CESHI;UID=CND_TEST;PWD=CND;DBQ=CESHI;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;GDE=F;FRL=Lo;BAM=IfAllSuccessful;MTS=F;MDI=Me;CSR=F;FWC=F;PFC=10;TLO=O;"
    set record=createobject("adodb.recordset")
    sql="select*from ibm_one_table"
    record.open sql,con
    DO
    if(record("ibm_table_column")="kai")then'//查找表格中有多少kai
    num=num+1;
    end if
    record.movenext
    loop until record.eof=true
    record.close
    set record=nothing
    con.close
    set con=nothing
    end sub

    9   换行符
        vbcr----chr(13)回车符// vblf----chr(10)换行符
        vbcrlf----chr(13)+chr(10)结合//type(chr(13)就相当于按了一上键盘上的enter

    10  Run from step有两种方式:
    在Keyword View模式会从本步骤运行到所有action结束
    在expert view模式仅会将本action运行结束

    11  由于对象属性原因,无法识别对象
    -----对于对象属性是变化的,可以参数化/或者用正则表达式
    -----报匹配多个对象错误,可以spy查看对象,添加一个该对象另一个唯一标识属性
    -----有时可以删除对象的变化的属性来解决识别问题
    ------对于多个完全相同的对象,可以采用添加index,location,createtime等特殊属性来识别
      (index:按照程序源码,绘制对象的先后标识对象,所以与其它相同对象是相互依赖,当其它对象发生
      变化后,原先的所有对象index属性要发生变化,开始是0;如index:=0;
            location:根据对象的位置进行确定,从上到下,从左到右;
      CreateTime:按照对象被浏览器打开的先后标识对象)
    ------另外换一种思维方式,采取等效的方法;比如用键盘代替鼠标或用操作系统本身特性去解决问题

    12  对系统文件的操作
    -------从系统的文件中获取信息及删除文件
      get_file_infor("c:\she.mpg")
       function get_file_infor(url)
        dim fso,f
        set fso=createobject("scrīpting.filesystemobject")
        set f=fso.getfile(url)
        f.name:f.size:f.type:f.datacreated'///获取文件信息
        fso.deletefile(url)'/////删除文件
       end function
    --------获取文件夹里所有文件信息
    get_folder_infor("c:\kai")
    function get_folder_infor(folder)
    dim fso,f,f1,n
    set fso=createobject("scrīpting,filesystemobject")
    set f=fso.getfolder(folder)
    set fc=f.files
    for each f1 in fc
    select case f1.name
    case"kai.mpg","she.mpg","dd.mp3"'//检查文件夹里是否含有这些文件
    end select
    next
    end function

    13   等待某个对象出现方法
    y=......waitproperty("visible",true,10000)

    14   防程序中断方法
    On error resume next
    On error goto handle

    15  数组的应用:
    name=array(1,2,"aa","bb")
    name(2)="aa"
    16  正则表达式应用模板
    进行日期YYYY-MM-DD的格式检查 :
    Function RegExpTest(patrn, strng)
      Dim regEx, Match, Matches      ' Create variable.
      Set regEx = New RegExp         ' Create a regular expression.
      regEx.Pattern = patrn         ' Set pattern.
      regEx.IgnoreCase = True         ' Set case insensitivity.
      regEx.Global = True         ' Set global applicability.
      Set Matches = regEx.Execute(strng)   ' Execute search.
      For Each Match in Matches      ' Iterate Matches collection.
        RetStr = RetStr & "Match found at position "
        RetStr = RetStr & Match.FirstIndex & ". Match Value is '"
        RetStr = RetStr & Match.Value & "'." & vbCRLF
      Next
      RegExpTest = RetStr
    End Function
    date_pattern="^((((19|20)(([02468][048])|([13579][26]))-02-29))|((20[0-9][0-9])|(19[0-9][0-9]))-((((0[1-9])|(1[0-2]))-((0[1-9])|(1\d)|(2[0-8])))|((((0[13578])|(1[02]))-31)|(((01,3-9])|(1[0-2]))-(29|30)))))$"
    result_message=RegExpTest(date_pattern, inputbox("请你输入要检查的时间:"))'用其它正则表达式更改此处
    Select case result_message
    Case ""
             msgbox("你输入的日期格式与标准不匹配")
    case else  MsgBox(result_message)
    end select

    17   返回一个字符串在另一字符串中的位置
    instr(string1,string2)

    18   有时回放出现找不到对象时,可能不是由于你的代码问题,而是由于你的操作系统等设置问题;
    举例说明1:
    比如:你录制一个选择磁盘中的文件动作
    会录制为:
    .winlistview("  ").drap 46,99
    .winlistview("  ").draponitem "she.mp3"
    下次录制的时候,如果你的系统文件改为不显示扩展名,下次执行的时候,QTP就找不到she.mp3,只能找到she;
    举例说明2:
    有时由于不同操作系统以及不同的ie,导致有些窗口不能识别,比如在2000下弹出的网页对话框的标题是:
    “web对话框",而在2003上是”网页对话框"

    19  "is+*"类型function
    isarray'是否是数组
    isconnected'判断QTP是否连接到TD
    isdate'是否是合法的日期类型
    isempty'判断是否初始化
    isNull'判断是否为空值
    isNumeric'判断是否是数字型
    isobject'判断是否一个功能对象
    isready'判断设备是否准备就绪
    isRootFolder'是否是根目录

    20 Action之间的参数传递
    例如:在Action1中,有如下代码:
    out_str="This is out_string"
    RunAction "Action2",oneIteration,out_str
    在Acton2中,在其step->Action Properties中的,input参数栏,加入out_str后,
    msgbox(parameter("out_str")),就能正确显示参数了 

    21 Wscrīpt.Shell的一些应用
    set WshShell =CreateObject("Wscrīpt.Shell")
    WshShell.SendKeys "{ENTER}"     '模拟键盘进行操作
    WshShell.AppActivate "Calculator"             '启动应用程序

    22 获取对象属性名称用法:
    GetRoProperty----从应用程序界面上获取对象属性(即,是脚本运行时,获取的对象动态属性值)
               例如:获取对象库中index属性值,似乎只能用GetToProperty,因为应用程序界面上对象没有该属性,只是QTP为识别该对象创立的描述属性;
    GetToproperty----从对象库中描述对象的属性,静态值
    GetToProperties----获取用于标识对象的属性集;对于这个集合,有count等属性方法

    23 FireEvent的使用-
    可以对一个对象进行更复杂的操作
    如:FireEvent("onfocus")   '使一个控件获取焦点
         FireEvent("ondblclick")  '实现双击/也可以在事件设定中针对该对象事件响应  

    24 模板的应用
    -----新建一个文本,输入一些新建Action时常包含的信息,然后保存为ActionTemplate.MST文件,
     并复制到QTP/dat目录下;这样每次新建action都会包含固定的信息了;
    例如:
    '-------------------脚本说明---------------
    '产品版本:      __Build(  )
    '测试员:
    '编写日期:
    '测试功能:
    '脚本类型:
    '被测试对象初始状态:
    '进展程度:
    '基本思路:
    '主要功能函数:
    '历史修改:
    '没解决的问题:
    '--------------------脚本内容-------------

    25 在对象库中,两个对象有时不能通过更改属性或命名来达到两个对象完全一致的替换;
    在web-mod项目中,我在对象库里添加了一个自动含有index标识属性的对象,然后每次通过SetToproperty来改变
    index值,对对象进行数据驱动,使其操作另一个对象,但脚本始终操作原先index属性值的对象;后来,把该对象
    删除掉,重新添加一个不自动含有index标识属性的该类对象,然后,手工添加,index标识属性,后来脚本能正常 工作了,可见两次的对象属性完全一致,但形成方式不一样,导致的结果往往也不一样;

    26 childobject的应用
    childobject可以返回界面上满足条件的对象集合,而且与对象库里是否有这些对象无关,这就可以简化对象库;
    返回的对象集合的count方法可以返回对象个数,这就可以通过下标对单个对象进行操作;在出现index标识对象时
    可以进行运用
    如:Set m_WinCheck=Descrīption.Create()
          m_WinCheck("nativeclass").Value="Button"
          set All_WinCheck=Window("").Dialog("").Childobject(m_WinCheck)
          n=All_WinCheck.Count()
         for i=0 to n-1
          All_WinCheck(i).Set "ON"
         next
    再加三个

    27 Create Log File:

    Dim LOGFile, fso, MyFile

    LOGFile="C:\Log.txt"
    Set fso = CreateObject("scrīpting.FileSystemObject")
        If fso.FileExists(LOGFile) = False Then
               Set MyFile = fso.CreateTextFile(LOGFile, True)
               MyFile.Close
        end if
    Set MyFile = fso.OpenTextFile(LOGFile, 8, True)
    MyFile.WriteLine("")
    MyFile.WriteLine(" " & Cstr(Now) & " ---------------------------------------------------------")
    MyFile.WriteLine("LOG Information!")
    MyFile.Close
    28 数据输入输出方法
    数据输入输出的方法:
    1  ExecuteFile"e:\kk.vbs"
    2  Environment.LoadFromFile("e:\k.xml")
    3  Datatable.ImportSheet/Import
    4  GetData from DataBase
    5  Datatable autofill
    6  Action input/output
    7  Use GetxxProperty to get data from Object
    8  Use Some Function to Product data

  • QTP中一个关于Action的实例

    2007-05-22 16:45:07


        本例还是以QTP安装后自带的Flight Reservation为例来录制脚本.首先我们把登录程序系统,然后新建定单,再打开定单,最后关闭系统.分别录制成5个action,设置一个主的action为main来分别先后调用login(登录),new order(新建定单),open order(打开定单),logout(退出).

    注明:设置拆分action,选择菜单功能split Action .选择independent of each other为并列的两个action.选择Nested为主次的两个action.

    全部录制完所有action后,在main action中代码如下:

    RunAction "login", oneIteration
    RunAction "new order", oneIteration
    RunAction "open order", oneIteration
    RunAction "logout", oneIteration

    其中RunAction是一个调用action的函数,后面跟action名和要传递的参数.

    说明:

    RunAction ActionName, [Iteration , Parameters]


    在这里我再引入action之间参数传递.在login action中选择菜单选项,在action properties中设置两input参数分别先后为username 和 passwd.

    这样我们就通过RunAction "login", oneIteration,"mercury","mercury"  把这两个变量分别传给username 和passwd.这边的变量先后关系分别依次对应了action properties里input参数的先后关系.

    这样我们就可以在login action中调用这两个变量了.

    Dialog("Login").WinEdit("Agent Name:").Set Parameter("username")
    Dialog("Login").WinEdit("Password:").Set Parameter("passwd")
    Dialog("Login").WinButton("OK").Click


    下面再来实现从一个action中传出一个变量给另一个action.

    那么我们在new order 中选择菜单选项,在action properties中设置一个output参数为orderno

    Window("Flight Reservation").WinEdit("Order No:").Output CheckPoint("Order No:")

    通过上面这句话把生成的定单号的值存放到这个ouput参数中

    RunAction "new order", oneIteration,order
    RunAction "open order", oneIteration,order

    再靠main action中这个order变量来传递,这个变量正好对应着new order里的output参数.从new order中传出来,再把这个变量传给open order.当然在open order中还要同样设置input参数.和这个order变量对应起来.

    这样就可以在open order中使用这个变量了.

    Window("Flight Reservation").Dialog("Open Order").WinEdit("Edit").Set Parameter("orderno")

    当然其实两个action之间传递参数还可以更简单点.比如一个脚本中 datatable和环境变量都是全局的,在一个脚本中的任何action都能使用.所以可以借用这两个来传递.

    通过这个例子最主要讲的是两点,拆分action和action之间的参数传递

  • QTP疑难问题解答(不能识别对象etc...)

    2007-05-22 16:19:37

    1.      运行错误:不能识别对象(Cannot identify object)

    出现了这个错误时,就表示当前被测程序的窗口中没有符合条件的对象。

    出现这种错误,可能的原因有以下两种:

    l         对象此时在程序中没有显示或不存在。

    l         在程序中存在该对象,但是它的描述在后来发生了改变,导致与对象仓库中存储的信息不匹配,从而QTP无法识别对象。

    如果你正遇到“Cannot identify object”的问题,解决方法见1.1。

     

    1.1 如何去识别对象描述(Idenfirying Test Object Descrīption Problems)

    如果你能在被测程序中看到对象,但仍出现了“Cannot Identify Object”错误信息,这就表示仓库中对象的描述与程序中对象的描述一定存在着差异。

    解决对象描述问题的第一步是找到差异,最简单的方法是将仓库中对象的属性值与程序中对象的属性值进行比较。(仓库中对象的属性值可在Object Repository窗口中查看,程序中对象的属性值可用Object Spy功能查看。)

    比较仓库中对象的属性值与程序中对象的属性值的操作见1.3。

    在完成比较后,是否发现存在差异?

    如果是,请参考1.4;

    如果否,请参考1.5。

     

    1.2 处理对象丢失问题(Solving Missing Object Problems)

    在运行脚本时,QTP偿试进行某种操作,而该操作的对象在程序中却没有出现,出现这种情况的原因有以下几种:

    l         对象不再存在。对象已经被从程序中删除。

    解决方法:见1.2.1。

    l         对象还没有装载。

    解决方法:见1.2.2。

    l         当前的程序页面(或窗口)不正确,不是对象所在的页面(或窗口)。

    解决方法:见1.2.3。

    l         前一个步骤没有正确执行。

    解决方法:见1.2.3。

    1.2.1 解决对象不再存在的问题

    如果对象已经不再在被测程序中存在,则应在脚本中修改或删除相关步骤。

    1.2.2 解决对象装载超时的问题

    如果对象丢失的原因是因为没有足够的时间装载,偿试以下解决方案:

    a.对于Web对象,增加Browser Navigation Timeout(File>Setting>Web页签)时间。

    b.在包括该对象的步骤前使用Wait语句,让QTP在执行该步骤之前等待一段时间。

    1.2.3 检查前面步骤的执行情况

    如果是因为打开了错误的页面(或窗口)导致对象丢失问题,或因为前一步骤执行措误导致对象丢失问题,则请按以下方法检查原因:

    a. 如果怀疑在完成脚本后,被测程序又发生了改变,则检查对象的继承关系以及对象描述。参考1.1。

    b. 如果怀疑脚本错误,则检查脚本的每一个步骤。你可能是遗失了某个步骤,也可能是使用了不正确的方法或参数。

     

    1.3 测试对象的属性值与Run-time对象的属性值的比较(Comparing Test Object and Run-Time Object Property Values)

    根据以下的步骤比较测试对象与Run-time对象的属性值:

    1)  进入Obecjt Repository窗口(Resources>Object Repository),选择对象。

    2)  用笔记下对象的class以及它的各个属性及属性值。

    3)  打开被测程序,并打开包含被测对象的页面或窗口。

    4)  在QTP中选择菜单Tools>Object Spy或点击Object Spy按钮,打开Object Spy对话框。

    5)  选择“Test Object Properties”选项。

    6)  点击右上角的按钮(带有手图标的),这时QTP窗口以及Object Spy对话框都被最小化。

    7)  在程序页面(或窗口)中点击目标对象,恢复Object Spy对话框,并在对话框中显示对象及其父对象(以树的形式显示),并在Properties页签中显示当前对象的属性及属性值。

    8)  这时Object Spy对话框的Properties页签中显示Run-time对象的所有属性,在此查看对象的class,以及它的属性及属性值,并将它与第2步中记下的内容进行比较。

     

    1.4 解决对象描述存在的问题(Solving Object Descrīption Problems)

    如果发现仓库中对象的属性值与程序中对象的属性值存在不同,你应该判断这个不同是个别对象的问题,还是其它同类对象也存在相同的问题。

    是所有(或多个)同类对象都存在问题吗?

    如果是,则参考1.6

    如果否,则参考1.7

     

    1.5 关于父对象描述的识别问题(Identifying Parent Object Descrīption Problems)

    对象的识别还与它所继承的父对象有关。

    如果你能在被测程序中看到对象,而且程序中对象的属性值与仓库中对象的属性值也是一致的,但仍然遭遇到了“Cannot identify object”错误,则这个错误可能与它的父对象有关(如仓库中父对象的属性值与程序中父对象的属性值不一致),也可能是仓库中的对象与程序中对象的继承关系不相同导致的。

    要判断是继承关系中的哪个父对象出现了问题,请偿试下面的方法之一:

    l         重新录制对象,比较新旧对象的父对象。

    欲了解如何完成比较,参考1.8。

    l         对继承关系中的每个父对象,分别插入一个Exist语句,并运行该部分脚本。

    欲了解如果创建Exist语句,参考1.9。

    注:你也可以使用Object Repository窗口中的Highlight in Application功能,在被测程序中定位对象。

    一旦找到了存在问题的父对象,接下来偿试以下方法:

    l         修复存在问题的父对象的描述。方法见1.4。

    l         在专家视图的模式下,查找所有继承存在问题的实例并进行修正。

    举例:1.8.1。

     

    1.6 解决某类对象的识别问题(Soving Object Identification Problems for a Test Object Class)

    如果你发现某类对象的对象描述对于被测程序来说都不是很合理,或你预期到对象描述中的某属性值是经常变化的,你可以在Object Identification对话框中改变该类的识别属性的设置,或定义该类的Smart Identification设置并启用Smart Identification机制,这样QTP就可以唯一识别对象了。

     

    1.7  解决单个对象的描述问题(Solving Individual Test Object Descrīption Problems)

    选择下列方法之一来解决对象的描述问题:

    l         如果被测程序中对象描述发生了改变,并且你也清楚改变的内容,并且该改变是永久性或长期性的,你可以直接手工修改仓库中对象描述中的相关属性值。

    l         如果被测程序中的对象的属性值依赖于前面的步骤或其它对象,则将该属性值参数化,这样就可以使用其它步骤的输出值为属性值。

    l         如果属性值的组成部分中,部分是固定的,部分是动态改变的,则可以将属性值设计为正则表达式。

    l         如果属性值是遵循某种规则变化的,或者是不可预期的,则从对象描述中移除该属性,并向对象描述中添加一个或多个属性以便于QTP进行对象识别。

    l         If you can only access the information on the property values during the run session, you can create and use functions that use programmatic descrīptions to identify the object using property values retrieved earlier in the run session.

    l         如果在录制过程中对象是唯一的,但现在程序中出现了两个或多个描述相同的对象,但是它们在页面(或窗口)中的位置不相同,则应在Object Properties或Object Repository窗口中,向对象描述中添加一个ordinal identifier(index或location)。

     

    1.8 重新录制对象,以判断父对象描述是否存在问题(Re-recording an Object to Identify Parent Object Descrīption Problems)

    根据下面的指引,来判断父对象的问题。

    通过重新录制对象,来判断它的父对象是否存在问题:

    1) 打开浏览器或程序,来到包含被测对象的页面或窗口。

    2) 在关键字视图模式,选择最后一个组件(component),或在专家视图模式,将光标放在最后一个脚本步骤的下面。

    3) 点击Record按钮,或选择Automation>Record。

    4) 点击(或操作)页面或窗口中的目标对象。

    5) 点击Stop按钮,或选择Automation>Stop,完成步骤添加。

    6) 右击新添加的步骤,并选择Object Properties右键菜单。

    7) 在Object Properties对话框中,点击Repository,打开Object Repository窗口,并选中了新对象。注意记下该对象的继承关系。

    8) 在Object Repository窗口中找到旧的对象(即存在问题的对象),将它的继承关系与新对象的继承关系进行比较。

    通过比较,可以检查到新旧对象是父对象的描述存在不同,还是它们的继承关系根本就不同。

    a. 如果是父对象的描述问题,则修改父对象的描述。参见1.4.

    b. 如果是对象的继承关系不正确(即具有不同的父对象)引起的问题,则在脚本中找到所有使用该继承关系的实例,将它们替换为正确的继承关系。

    举例:参见1.8.1。

     

    1.8.1 举例

    假设有一个带有Frame的网站,你录制了一个操作针对Image对象“Poster”的操作步骤。在Object Repository窗口,你可以Image对象的继承关系如下所示:

    MyCompany(Browser)

        MyCompany(Page)

            Main(Frame)

                 Poster(image)

    当你运行脚本时,网页看起来没有什么不同,但是识别Image对象时却出现了“Cannot identiry object”的错误提示。当你重新录制操作步骤,然后在Object Repository窗口中查看新的Image对象时,发现该对象的继承关系如下所示:

    MyCompany(Browser)

        MyCompany(Page)

             Poster(image)

    从中可以看出,Frame已经从Web Page中移除,所以尽管Image对象“Poster”的描述没有发生任何改变,但它的继承关系已经改变了。

    在Object Repository窗口,你可以看到新旧Image对象“Poster”是两个完全不同的对象:旧的位于已经被移除的Frame对象之下,而新的则直接位于Page“Mycompany”对象之下。

    修复这个问题,可以在脚本步骤中将旧的对象替换为新的对象。

    为了保持Object Repository窗口的整洁,你应删除那些已不再存在的对象(如本例中的Frame)。

     

    1.9 创建Exist语句,以判断父对象的描述是否存在问题

    QTP在录制发生在某个对象上的操作时,也会同时去了解对象以及它的继承关系。因此,如果在运行过程中,QTP不能识别继承关系中的任何一个父对象,都会导致目标对象的识别失败。

    使用带有Exist方法的Msgbox语句,可以方便的检查出是继承关系中的哪个父对象出现了问题。

    假设在运行下面脚本时,你遇到了“Cannot identify Object”错误信息(但是可以确定对象仓库中Link对象的描述与当前程序中对象的描述是完全一致的):

    Browser("Yahoo!").Page("Yahoo!").Link("Arts & Humanities").Click

    你可以在该语句前面插入以下语句:

    Msgbox Browser("Yahoo!").Exist

    Msgbox Browser("Yahoo!").Page("Yahoo!").Exist

    Msgbox Browser("Yahoo!").Page("Yahoo!").Link("Arts & Humanities").Exist

    然后你从头开始运行脚本,发现第1行语句运行成功,并且弹出信息框,内容为“True”。

     

    但是,当QTP运行到第2步时,就弹出信息框,内容为“False”,表示不能找到Page object。这就证明Page对象存在问题。

    确定了出现问题的父对象以后,修复该问题。参见1.4。

    2.      运行错误:对象不唯一(The object is not unique)

    在被测页面或窗口中的同一父对象下,找到多个与仓库中对象描述相符的Run-tim对象。

    请确定是只有个别对象存在此问题,还是此类对象的所有对象(或部分对象)存在此问题。

    此类对象的所有对象(或部分对象)都存在此问题吗?

    如果是,参考2.1;

    如果否,参考2.2。

     

    2.1 为某对象类设置能唯一识别对象的描述规则(Configuring Unique Test Object Descrīptions for a Test Object Class)

    如果你发现某类对象的对象描述都不足以唯一识别对象,你可以在Object Identification对话框中,改变该类的识别属性的设置,或定义该类的Smart Identification设置并启用Smart Identification机制,这样QTP就可以唯一识别对象了。

     

    2.2 设置通唯一识别对象的对象描述(Creating a Unique Test Object Descrīption for an Object)

    查看当前对象的描述,并偿试在程序中找到其它具有相同描述的对象并查看它们的描述。

    l         如果你找到了可以将它们区别开来的一个或多个属性,则修改仓库中对象的相关属性(如向描述中添加属性等),以使QTP在运行时可以唯一识别它。

    l         如果它们的识别属性完全相同,则在对象描述中为对象添加一个ordinal identifier(index或location)。

     

    3.      运行错误:找不到父对象(Parent not found)

    识别对象时,会先识别它的父对象是否正确。如果遇到“Parent not found”的错误信息,请偿试以下解决方法:

    l         修复出现问题的父对象的描述。参见1.4。

    l         在脚本中找到继承关系不正确的实例,并修改为正确的继承关系。例如1.8.1。

     

    4.      运行错误:无效的参数(Invalid arguments)

    一个或多个方法的参数是无效的。

    参数无效可能是参数类型错误,也可能是参数个数不正确。

    根据以下建议,找到方法的正确语法:

    l         在Keyword模式,如果方法包括参数,则在Value栏会显示该方法的参数提示。

    l         在Expert模式,如果方法包括参数,则当你插入方法然后按下Shift+Ctrl+Space键时,QTP会显示该方法的参数的提示信息。(注:只有在Editor Options对话框的General页签中打开了Statement completion功能时才可以看到参数的提示信息。)

    5.      运行错误:不能识别item(Cannot identify item)

    QTP不能识别方法参数中指定的列表或树对象的item时,请确认指定的item是否存在于对象之中。

    l         如果item不存在,则删除相关脚本步骤,或修改item。

    l         <SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'; mso-ansi-lang


  • QTP学习指南

    2007-05-22 16:18:15

     

    1.         介绍

    使用QTPautomation object model,可以对QTP进行自动化编程,从而自动对QTP进行选项设置、自动运行测试(或组件),而无需使用QTP界面手工进行这些操作。

    如果要重复多次的完成同一项工作任务,或重复多次运行同一测试(或组件),或需要快速配置QTP选项,则QTP的自动化编程是非常有用的。

    本部分内容包括:

    自动化QTP操作

    决定什么时候使用QTP自动化编程

    选择设计或运行自动化程序的语言与开发环境

    了解自动化程序的基本元素

    创建自动化程序脚本

    1.1.       自动化QTP操作

    使用QTPAutomation Object Model进行自动化编程,实现QTP操作的自动化。QTPAutomation Object Model提供了objectsmethods、以及properties,使我们可以在其它的应用程序中控制QTP的操作。

    1.2.       决定什么时候使用QTP自动化编程

    我们使用QTP设计测试(或组件),创建一个有用的自动化程序也需要一个计划、设计、测试的过程。

    下面是几个实用的QTP自动化编程的例子:

    l         Initializtion programs(初始化编程)-你可以编写一个程序,来自动地启动QTP,配置操作选项及录制设定。

    l         Maintaining your tests or components(维护测试或组件)-你可以编写一个程序,作用于一系列已有的测试或组件上,以统一达到某一目的。例如:

    n         Updating values-使用合适的插件环境打开每个测试或组件,并以update的模式运行它(当然必须对应相应的已升级的被测应用程序),然后保存测试或组件以保存更新后的值。

    n         Applying new options to existing tests of components(对已有的测试或组件应用新的操作选项)-当QTP版本升级以后,你可能发现有某些新的选项设置可应用到当前已有的测试或组件中。你可以编写一个程序,打开每个已有的测试或组件,为它们设置新的选项设置,然后保存并关闭它。

    l         Calling QuickTest from other application(在其它应用程序中调用QTP)-You can design your own applications with options or controls that run QuickTest automation programs. For example, you could create a Web form or simple Windows interface from which a product manager could schedule QuickTest runs, even if the manager is not familiar with QuickTest.

    1.3.       选择设计或运行自动化程序的语言与开发环境

    现有多种面向对象的编程语言,可用于实现QTP的自动化编程。对于每种语言,都有多种开发环境的支持,在该开发环境中,可用以设计或运行自动化程序。

    编写自动化程序

    你可以在任何一个支持automation的语言与开发环境中编写QTP自动化程序,如VBscrīptJavascrīptVisual BasicVisual C++Visual Studio.NET等等。

    有的开发环境support referencing a type libraryA type library是一个二进制文件,包括了对象模型的描述、界面、以及其它定义。

    如果你选择的环境support referencing a type library,在你编程的过程中,你就可以享受到以下好处,如智能提示的功能、语句自动完成的功能、在状态栏显示帮助提示的功能。QTPautomation object model提供了一个type library文件,文件名为QTObjectModel.dll,这个文件存储于QTP安装目录的bin目录下。

    如果你选择了一个support referencing a type library的开发环境,在编写或运行程序之前,确保装载了QTPtype library。例如:如果你选用了Microsoft Visual Basic,在Microsoft Visual Basic的菜单中选择Project>References,打开References对话框,然后选择QuickTest Professional<版本号>Object Library

    运行自动化程序

    很多应用程序都可以运行自动化程序,你甚至可以在命令行使用WSH来运行自动化程序。

    例如:Wscrīpt.exe /E:VBscrīpt myscrīpt.vbs

    1.4.       了解自动化程序的基本元素(Element

    与大部分automation object modes一样,QTPautomation object model根对象Application对象。这里的Application对象代表QTP应用程序。使用它,可以返回其它QTP元素如Test对象(它代表一个测试或组件文件)、Options对象(它代表Options对话框)、Addins集合(它代表Add-in管理对话框中一系列的add-in)等,并可以完成以下操作如装载add-in、启动QTP、打开并保存测试或组件、以及关闭QTP

    Application对象返回的每一个对象,又可以返回其它对象,以完成其它与该对象相关的操作,并获取(或设置)与该对象相关的属性值。

    每个自动化程序从创建QTP Application对象开始,创建此对象并不是启动QTP,它仅仅是提供一个对象,以便于你从该对象获得通道,以通向其它QTP automation object model的对象、方法以及属性。

    如果你在程序中需多次的启动或退出QTP,你可以只创建一个Application对象实例,而不必多次创建QTP Application对象。

    1.4.1.       创建Application对象

    对于不同的语言,创建Application对象的过程稍有不同。下面例子中,是使用VBscrīpt语言,实现创建Application对象,并以visible的模式打开QTP程序的操作。

    Dim qtApp

    Set qtApp=CreateObject(“QuickTest.Application”)      创建Application对象

    qtApp.Launch                                    启动QTP

    qtApp.visible=True                                设置QTP为可见模式

     

    1.4.2.       建设自动化程序的其它部分

    如何建设自动化程序的其它部分,与你的编程目标有关。

    在启动QTP之前,你可以完成一些其它操作,如获取相关的add-in、装载add-in、并指导QTPvisible模式打开QTP等。

    当完成这些预备步骤后,如果QTP还没有被打开,你可以使用Application.Launch方法打开它。自动化程序的其它操作一般都是位于Launch方法之后。

    当完成这些必需的操作之后,或你想要实现的操作需要关闭并重新启动QTP如修改插件的装载),则使用Application.Quit方法。

    1.4.3.       在远程电脑中运行自动化程序

    默认情况下,当你在自动化程序中创建一个Application对象时,该对象创建于本地电脑中(使用QTP的本地副本)。你也可以选择在远程QTP电脑中运行自动化脚本。为了实现这个目标,你必须:

    l         确保远程电脑的Distributed COMDCOM)配置属性已设置为允许你运行QTP自动化脚本。

    l         在自动化程序的创建Application对象的脚本行,指定远程电脑的名称,例如在VBscrīptCreateObject函数中使用可选参数location

     

    名词:COM-组件对象模型。COM提供了一套允许同一台计算机上的客户端和服务器之间进行通信的接口。

    DCOM-分布式组件对象模型。是一系列微软的概念和程序接口,利用这个接口,客户端程序对象能够请求来自网络中另一台计算机上的服务器程序对象。

    设置远程电脑中的DCOM配置属性

    要在远程电脑中运行自动化程序,必须确保在远程电脑的DCOM设置中,给了你装载及设置QTP COM 服务器的权限。

    下面描述了在远程电脑中设置DCOM的过程。注意因为远程电脑的操作系统的不同,DCOM配置对话框中显示可能不同。

    (下面的图片都是WinXP操作系统中的):

    1.         在远程电脑中,选择Start>Run,打开Run对话框。

    2.         在命令栏输入“dcomcnfg”后,点击OK,打开DCOM配置对话框或组件服务窗口(这与操作系统有关),并显示当前电脑中有效的COM应用程序。

    3.         在列表中选择“QuickTest Professional Automation”,打开属性对话框。

    4.         QuickTest Professional Automation对话框中,选中Security(安全)页签。

    5.         在“launch permissions”(启动和激活权限)部分,选择custom(“自定义”)选项,然后点击EDIT(“编辑”)按钮。

    6.         使用AddRemove操作选择网络用户或组,让用户或组就可以在本地电脑中通过自动化程序,远程让QTP脚本在本电脑上运行。当完成设置用户或组后,点击OK保存设置。

    7.         重复56步,设置“configuration permissions”部分,设置用户或组,让用户或组可以通过自动化程序,远程修改本电脑的QTP的选项配置。

    8.         QuickTest Professional Automation对话框中,点击Identity(标识)页签,选择interactive user选项。

     

    9.         点击OK保存QuickTest Professional Automation属性设置。

    10.     点击OK关闭DCOM配置对话框,或关闭组件服务窗口。

    在远程电脑中创建Application

    当远程电脑的DCOM设置完成后,你就可以在自动化程序中指定该远程电脑。

    VBscrīpt中,你可以在CreateObject函数的可选参数location中指定远程电脑名称。例如:在一个名为MyServer的远程电脑上运行自动程序,你可以编写以下脚本:

    Dim qtApp

    Set qtApp=CreateObject(“QuickTest.Application”,”MyServer”)

    1.5.       创建自动化程序脚本

    Test Setting对话框中的Properties页签、Options对话框的General页签、以及Object Identification对话框中,都有一个Generate scrīpt按钮。点击此按钮可以生成一个自动化脚本文件(.vbs),该文件包含了相关对话框的当前设定。

    你可以运行这些脚本,运行该脚本可以打开QTP,并且QTPOptions设置使用的是脚本中的设置;你也可以将脚本中的内容复制到你自已的自动化脚本中。

    例如,你在Options对话框中通过Generate scrīpt功能创建了一个脚本,脚本的内容应该是下面这样的:

    Dim App 'As Application

    Set App = CreateObject("QuickTest.Application")

    App.Launch

    App.Visible = True

    App.Options.DisableVORecognition = False

    App.Options.AutoGenerateWith = False

    App.Options.WithGenerationLevel = 2

    App.Options.TimeToActivateWinAfterPoint = 500

    ...

    ...

    App.Options.WindowsApps.NonUniqueListItemRecordMode = "ByName"

    App.Options.WindowsApps.RecordOwnerDrawnButtonAs = "PushButtons"

    App.Folders.RemoveAll

     


  • Table检查点、Database检查点的区别

    2007-05-22 14:34:28

    Table是可见的,可以录制的。对于ActiveX Table,还可以检查它的object 属性。

    DataBase不是录制下来的,而是通过查询语句得到的。执行检查时,是检查预期数据与运行时的Table数据是否匹配。

    生成Table检查点时,是生成“standard checkpoint”;生成DataBase检查点时,是生成“Database Checkpoint”。执行检查时,是检查预期数据与查询出来的数据是否匹配。

  • 几种信息提示方法(二)

    2007-05-22 14:33:40

    3.      InputBox函数

    弹出对话框,等待用户输入内容或点击按钮。返回值是输入的内容。

    Ø         语法

    InputBox(prompt[, title][, default][, xpos][, ypos][, helpfile, context])

    Ø         Arguments

    prompt 将在对话框中显示的信息。最大长度为1024字符。如果内容有多行,可以用(Chr(13))来表示回车符,或用(Chr(10))表示换行符,或用(Chr(13) & Chr(10))表示回车-换行符。

    title 弹出框的标题,将显示在标题栏。

    default 输入框的默认值。

    Ø        

    Dim Input

    Input = InputBox("Enter your name")

    MsgBox ("You entered: " & Input)

     

    4.      WshSell对象的Popup Method

    在一个弹出框中显示文本信息。

    Ø         语法

    intButton = object.Popup(strText,[nSecondsToWait],[strTitle],[nType])

    Ø         Arguments

    object  WshShell对象.

    strText 希望在弹出框中显示的文本信息。

    nSecondsToWait 可选。希望弹出框保持显示的最长时间。(单位秒)。

    strTitle 弹出框的标题

    nType 一个数值,代表希望在弹出框中显示的按钮或图标。这个值决定了如何使用信息框。

    IntButton 返回值。表示用户点击的按钮值。

    Ø         注意

    无论which host executable file is running (Wscrīpt.exe or Cscrīpt.exe)Popup method都会弹出信息框。

    如果nSecondsToWaitis 0,弹出框一直等到用户干预才关闭。如果nSecondsToWaitis 大于0,如果没有用户干预,则弹出框一直等到nSecondsToWaitis时间后自动关闭。

    如果不设置“strtitle”,则弹出框的标题默认为"Windows scrīpt Host."

    nType”的意思与MessageBox functionntype相同。

    按钮值

    描述

    0

    显示OK按钮.

    1

    显示OKCancel按钮。

    2

    显示Abort, Retry, Ignore按钮。

    3

    显示Yes, No, Cancel按钮。

    4

    显示YesNo按钮。

    5

    显示 Retry Cancel按钮。

    图标类型值

    描述

    16

    显示"Stop Mark"图标。

    32

    显示 "Question Mark"图标。

    48

    显示 "Exclamation Mark"图标。

    64

    显示"Information Mark"图标。

    返回值

    如果用户没有在窗口等待的时间范围内(nSecondsToWait点击按钮,则返回-1

    描述

    1

    OK按钮

    2

    Cancel 按钮

    3

    Abort 按钮

    4

    Retry 按钮

    5

    Ignore 按钮

    6

    Yes 按钮

    7

    No 按钮

    Ø         Example

     [VBscrīpt]

    Dim WshShell, BtnCode

    Set WshShell = Wscrīpt.CreateObject("Wscrīpt.Shell")

    BtnCode = WshShell.Popup("Do you feel alright?", 7, "Answer This Question:", 4 + 32)

    Select Case BtnCode

       case 6      Wscrīpt.Echo "Glad to hear you feel alright."

       case 7      Wscrīpt.Echo "Hope you're feeling better soon."

       case -1     Wscrīpt.Echo "Is there anybody out there?"

    End Select

  • Reporter对象的ReportEvent方法

    2007-05-22 14:32:39

    描述

    test result中报告测试结果。

    语法

    Reporter.ReportEvent EventStatus, ReportStepName, Details [, in]

     Argument  Type  Descrīption
     EventStatus  Number or pre-defined constant

    状态值:

    0 micPass:将本步骤的运行结果状态设置为“Pass”,并向Result中产生报告信息。

    如果想在报告中生成“通过”报告,用本状态值。

    1 micFail: 将本步骤的运行结果状态设置为“Fail”,并向Result中产生报告信息。当脚本中运行本语句时,整个测试的结果状态是“fails”

    如果想在报告中生成“失败”报告,用本状态值。如果运行了本语句,则整个测试的状态为“Fail”。

    2 micDone:仅向Result中产生报告信息,但不影响整个测试的结果状态。

    如果想在报告中生成“完成”报告,用本状态值。

    3 micWarning: SResult中产生报告信息,但是不会中断测试的运行,也不影响测试的 pass/fail status

    如果想在报告中生成“警告”报告,用本状态值。运行这个语句后,整个测试结果状态为“Warning”。

     ReportStepName  String 将在报告中显示的步骤名称(object name).
     Details  String 报告的详细信息。这些信息是本条报告的“Details”信息。
     in  N/A  Not in use

    举例: 下面的例子使用ReprotEvent方法来报告一个失败信息。

    Reporter.ReportEvent 1, "Custom Step", "The user-defined step failed."

  • Action的“Action call properties”与“Test-Setting”的Run页签中属性的区别

    2007-05-22 14:31:26

      一个是Action的属性,一个是Test的属性。Action运行的反复次数取决于它的DataSheet的数据的行数,Test运行的反复次数取决于Global Sheet的数据行数.
    通过Action的右键菜单“Action call properties”打开Action Call Properties对话框,Run页签中有三个选项:

    Run one iteration
    运行所调用的Action一次,运行时根据当前globaliteration数,来决定获取action data sheet中的哪行数据。如果Actiondata sheet的数据条数少于global sheet,则以后的每次运行都总是取action data sheet的最后一条数据。例如,当actionsheet2行数据,global sheet4行数据,如果调用action时选择了“Run one iteration”,但是在设置test时选择了run iterations on all rows of the global data sheet,那么在运行test的每一轮中,这个action只运行一次,每次参数时都是根据test的“轮数”来决定获取哪一行的数据。在运行第1轮测试时,获取action sheet的第1行数据,在运行第2轮测试时,获取第2行数据,第3轮或第4轮时,参数总是获取第2行(action sheet的最后一行)的数据。

    Run on all rows
    运行action的所有行的数据,即ation的运行次数取决于action的数据行数。

    Run from row  to row
    指定action运行的数据范围,从而决定action运行的次数及取数范围。

     

    通过菜单Test>Setting打开Test Setting对话框,Run页签中有三个选项:

    Run one iteration only
    仅运行test一次。运行时获取global sheet的第1行数据。

    Run on all rows
    根据global sheet的数据行数来决定test的运行轮数,每轮测试依次获取global sheet中的数据。

    Run from row to row 
    指定test的运行轮数。每轮测试依次获取指定范围的行的数据。

  • 在QTP中定义变量

    2007-05-22 14:30:31

     将一个Object定义为一个变量,应使用Set语句,如:

     Function ShowFreeSpace(drvPath)
       Dim fso, d, s
       Set fso = CreateObject("scrīpting.FileSystemObject")
       Set d = fso.GetDrive(fso.GetDriveName(drvPath))
       s = "Drive " & UCase(drvPath) & " - "
       s = s & d.VolumeName  & "<BR>"
       s = s & "Free Space: " & FormatNumber(d.FreeSpace/1024, 0)
       s = s & " Kbytes"
       ShowFreeSpace = s
    End Function

     

        也可以使用DIM语句申明其它类型的变量,如strings(字符型), integers(整型), 以及 arrays(数组)

        DIM语句不是必须的,但是使用DIM语句可以使脚本清晰。

        定义数组变量:

     Dim A
    A = Array(10,20,30)
    B = A(2)   ' B is now 30.

        定义字符或整型变量:

     Dim MyVar, MyNum

     

  • 421/3123>

    数据统计

    • 访问量: 41546
    • 日志数: 55
    • 图片数: 6
    • 书签数: 1
    • 建立时间: 2007-05-22
    • 更新时间: 2007-12-12

    RSS订阅