偶是测试新手,希望前辈们能多多指教。

发布新日志

  • QTP加载外部文件函数,三种方法比较【转载】

    2011-03-10 11:41:03

    QTP加载外部文件函数,三种方法比较

    Author :Terry Yu     Orz : Terry's Station

    方式1:Executefile
    方式2:加到QTP的Resorece
    方式3:ExecuteGlobal方法

    在比较之前先简明叙述一下使用方法,以给初学者由浅入深的理解
    比如我们有一个函数Terry.vbs放在了C:盘下, 其中有如下函数(获取本机的IP地址):
    Function GetIPAddr()
    Set bjWMI = GetObject("winmgmts://./root/cimv2")
    Set colIP = objWMI.ExecQuery("Select * from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")
    For Each IP In colIP
    temp = IP.IPAddress(0)
    Exit For
    Next
    GetIPAddr = temp
    End Function

    方式1的使用方法:
    直接在QTP中打:
    Executefile "c:\Terry.vbs"
    随后就可以引用wally.vbs中的任意函数了,如 msgbox GetIPAddr()

    方式2的使用方法:
    点击QTP菜单的File->Settings->Resources,之后添加Terry.vbs到QTP的resource中
    随后就可以引用Terry.vbs中的任意函数了,如 msgbox GetIPAddr()

    方式3的使用方式:
    ExecuteGlobal是VBS的函数而非QTP特有的函数,ExecuteGlobal的功能可以引入其它vbs文件的函数,就和C++的include,Java的import一样。使用范例:
    dim fso : set fso = createobject("scripting.filesystemobject")
    executeglobal fso.opentextfile("c:\Terry.vbs", 1).readall
    set fso = nothing
    大家可以看到其实它是把Terry.vbs全部读入内存中
    随后就可以引用Terry.vbs中的任意函数了,如 msgbox GetIPAddr()

    下面是一些我使用中的心得:
    方式1:Executefile的好处:
    QTP可以使用这个函数方便了自己写语句来引入函数,灵活性非常高
    方式1:Executefile的缺点和解决方案:
    1.会使得QTP的语句执行的黄色指针工作异常,狂跳
    2.Debug很头疼。我以前的上周有一段经历,一个很小的Bug,调试的时候Step into不进正确的函数体,竟然跳到了一行空行。后来这个小Bug竟然足足花了我3整天的时间。这个应该是QTP的Bug,希望它后续的版本可以改进
    3.会莫名其妙的执行一些本不应该有的操作,大大降低QTP执行时间效率,之间屏幕在闪,但是不知道在执行些什么。我曾经遇到过这样的情况:任其自然执行,屏幕狂闪,执行了半小时;我单步执行,只花了5分钟执行完毕。可见这会使得原本就受质疑的QTP的Performance更受谴责
    解决方案:
    以上三点我找不出解决方案,属于Hp的严重Bug还是需要HP来完善

    方式2:加到QTP的Resorece的好处:
    毕竟是QTP自带的引用外部VBS函数的,非常稳定
    方式2:加到QTP的Resorece的缺点和解决方案:
    灵活程度大打折扣,经常的情况是使用同一个测试框架对于不同的项目需要引入不同的VBS文件,非常不灵活
    解决方案:
    不过这也是有方法可以解决的:在外部调用AOM的函数中添加:
    Set bj = CreateObject("QuickTest.Application")
    Set qtLibraries = obj.Test.Settings.Resources.Libraries ' Get the libraries collection object
    If qtLibraries.Find("C:\Terry.vbs") = -1 Then
    qtLibraries.Add "C:\Terry.vbs", 1
    End If
    这样子就可以通过外部文件调用QTP对象模型来加载指定的VBS,也可以非常灵活

    方式3:ExecuteGlobal方法的优势:
    1.自己写代码,非常灵活
    2.外部函数由于从内存中读取,避免了I/O,执行速度加快,而且通过这个方法调用其它文件函数非常稳定
    方式3:ExecuteGlobal方法的缺点:
    1.一下子把可能需要用到的VBS文件全部读入内存,势必会增加内存开销
    2.Debug时候Step into不到指定的函数,调试不方便
    解决方案:
    对于1的解决方案的答案是没有解决方案,因为采取了ExecuteGlobal方法后内存开销增大是不可避免的。但是这点内存对于运行QTP来说并不是个不可承受的内存,微不足道
    对于2的解决方案其实可以在需要调试的时候手工加入到QTP专家视图窗口,调试完毕后再采用ExecuteFile调用

    事实上如果要我排个序的话我的优先顺序是:
    方式2:加到QTP的Resorece >> 方式3:ExecuteGlobal >> 方法方式1:Executefile
  • QTP中“无法识别控件”“错误回放过程未知弹出窗口”等问题的解决方法

    2010-06-24 15:09:59

    以下是我经常遇到的问题:

                   一、无法识别控件。

                   二、错误回放过程未知弹出窗口。

                   三、加载.net插件后和TD的关联问题。

                   四、动态加载元素的识别问题。

                   五、调用外部dll的问题。

                   六、随机验证码的问题。

            问题一,解决办法有三种:

               1、更改QTP自身对某控件的识别方式,在 tools——Object Identification 中。在这里列出了所有QTP能识别的控件,以及控件的识别方式。你可以给他添加X、Y坐标进行识别。或更明显的,列表中的信息,不按名称识别,而是按ID识别。这个修改可以解决一些问题,具体的赶紧动手试试吧……

               2、使用虚拟物件,来定义一个控件,在 tools——Virtual Object 中。在这里可以自定义一个控件。例如在ASP的程序中,程序出错,在客户端的表现形式大部分是一样的,你可以把整个错误页面当成一个控件来识别(感觉不错)。如果加一个判断,出错后你想做什么就由你自己定了。

               3、使用低级录制或鼠标录制。用 Test——LowLevelRecording/AnlogRecording 吧,用它录制就不需要什么设置了,他会记录你的程序控件相对屏幕的位置。用LowLevelRecording还有代码可改,用AnlogRecording动作就被封装了(维护性极差)。两者因实际环境更取其长吧……

            问题二的解决过程:

            关于弹出提示的问题,我当时需要情况是这样的。一个信息录入系统,由于数据量很大,查询需要一段时间。QTP回放时动作比较快,点了保存,程序还没反应过来它就进行了下一步操作。这时的操作就和录制时不一样了,程序给出一个提示,但这个提示是录制过程没有的。弹出框是一般都是POP形势(至上)的,导致QTP无法继续回放,结果就是回放失败。

            解决办法有两个:

                    1、进行判断,当出现这个提示时,点是/否/取消按钮。

                    2、通过 Tools——Recorvery Scenario Manager 设置默认操作。

                我最初就是用的第一种方法。写一个函数判断是否出现这个提示,如果出现就点“取消”然后wait(2)。    每个可能出现弹出框的动作后都调用一次这个函数。虽然可以解决这个问题,但回放的效率就低了,而且需要你预知提示框的信息。

                当我知道了第二种方法,显然更科学^_^。它可以对所有预知甚至不知的提示进行指定的操作。

                实际上,当程序出现了未预知的提示时,可能就是程序的BUG,所以使用上述办法解决工具问题时,也要考虑是否会掩盖程序的缺陷。

            问题三的解决办法:

                  用好QTP后,会不自觉的和TD关联起来。但从TD直接启动QTP时,程序只会加载QTP自带的插件,如果你安装了其它插件(如.net、java、etc.),默认是不加载的。这会导致上传的脚本无法正确执行。解决办法很简单,去 Test——Setting里进行Modify 吧。从本地打开的脚本,这里不能进行Modify的。所以办法很简单,但如果不知道的话就很难了。当初为这个问题我可是废了八牛三虎之力呢……

            问题四的解决过程:

                 当我开始改代码时,定义一个动作,然后可以生成N个动作。假设N个动作产生了N个结果,你要对这结果进行处理时,你会发现这N个结果都不能被识别:

            网页上有个表格,是往数据库里加数据的。

            两个表格显示在同一个页面上,左边为父表,右边为子表。

            点击左表,右表显示其子项目。

            结构如下:

            A

            ├─1

            ├─2

            ├─3

            └─4

            B

            ├─1

            ├─2

            ├─3

            └─4

                                ……

            思想很清晰:

            添加一个父项A、选中此父项A、对其添加子项1、2、3、4

            添加一个父项B、选中此父项B、对其添加子项1、2、3、4  ……

            代码也很简单:

            dim M          '定义父项数

            dim N          '定义每个父项包含的子项数

            For i=1 to M

                  Call 添加父项( i )

                  选中父项( i )              '问题就出在这里

               For j=1 to bwfl step 1

                   Call 添加子项( j )

                Next

            Next

            现在问题出来了,思路应该没有问题(除非这方法真的行不通),循环也是顺着思想来的。

            问题是,无法实现选中的父项(最多识别到一个)。

            由于此循环可以在录制过程进行,如果不改变变量名称,循环可且只可以成功运行一次。问题是这个名称都是从DataTable里获取的。

            因为,在运行过程中生成的项目没有加到对象库中,无法被识别。

               这个问题最后是从思想上解决的。答案是我做的是功能测试,为什么不先加父项,检查父项的功能是否正常,然后再去测子项的功能。不去改变名字,因为那没有必要。核心答案“功能测试、测试功能”。即对测试工具首先需要有正确的认识。

               当然,这个问题可以用代码去实现,但那需要有一定的编程功底且耗时,可维护性不一定好。有需要的朋友可以去试一下,然后把你的经验也共享一下。问题五,是对QTP很大的一个扩充。

                对于QTP调用外部DLL的功能,由于我的编程功底不够,没有相关人士配合我,我只能望之垂涎了!

                如果能调用外部DLL的话,QTP的功能就可以变得很强大。自己写的程序,自己编一些过程用QTP进行测试,我想“后果很严重”  。真想有一次给我尝试的机会……

            问题六,解决办法有4个:

                1、测试的时候,让程序员把这块限制去掉,免去验证这关。

                2、让程序员提供一个万能验证码,测试可以绕过这一关。

                3、请程序员提供识别的方法,从获取的图片读出验证数据,再传给QTP。

                4、进行位图检查,将验证码分段进行图像验证。

                实际上,验证码的目的就是防止用程序灌水或机器录入信息。所以有点为难我们测试了。

            方法1,如果程序已在发布并有客户使用,危险性是可想而知的。方法2虽然可以解决验证这一关,但跳过了输入码与验证码一致性问题。方法3就需要程序员配合了,可能就需要调用DLL了。方法4却将图像分段,把获取的图像和已经的图像进行比对,比对通过取对应的值;这个在数字验证会好做一点,因为最多就四个图像的比对。

    google_protectAndRun("render_ads.js::google_render_ad", google_handleError, google_render_ad);
  • 【转帖】QTP相关的25个小技巧

    2010-06-02 15:44:25

    1.Q:runaction后面能不能接变量(动态调用action,所以从数据库取数据做action名字了,但是调用总是找不到)?

    2.Q:QTP8.2中调用VB函数的问题(用VBscrīpt写了一些测试脚本需要的几个通用函数,有没有办法可以用类似include的方式进行调用,而不需要每次都把这些函数Copy到新的脚本中)?

    3.Q:QTP如何做回归测试(300多个TestCase,TD是否可以管理)

    4.Q:qtp自动截图功能

    5.Q:在QTP中如何设置使用别的浏览器(XP系统,用IE访问程序时,每次总提示屏蔽安装ActiveX插件,需要手动安装.但把这个过程录制到QTP后,回放一次是成功的。当我给某个输入框参数化了好多数据后,回放过程中,某些就会失败.

    6.Q:checkpoint 检查网页,是否能实现只要网页出现乱码就返回错误报告?

    7.Q:WSH的应用方法

    8.Q;从EXCEL中导出数据进行测试

    9.Q:关于dtGlobalsheet与dtGlobalsheet

    10.Q:移动当前位置的行

    11.Q:如何能记录到页面的校验码?(Output value能不能得到web页面的校验码,一般的校验码是由图片随即生成的 ,用QTP怎么录脚本在登陆前得到校验码并输入到校验码一栏)

    12.Q:QTP正则表达式的帮助

    13.自动测试实施计划

    14.Q:一个Action里如何调用在另一个Action中定义的函数、过程(或变量、常量)

    15.Q:如何管理QTP的源代码?(QTP生成的源代码比较多,而且和环境控件都有关,假如需要多人同时开发, 请问如何管理源代码?)

    16:Q:脚本不能回放,IE中的AtiveX设置有问题??

    17.Q: 如何参数化link

    18. Q:QTP 在Debug狀態,在Export View 區域不能寫入任何東西

    19.Q:动态变化值如何获取

    20.Q:如何一一获得Table中 某栏 link 的 text?

    21.Q:网页下拉框的选择

    22.Q:将测试数据单独拿出来

    23.Q:和TD连接

    24:Q:处理Windows弹出窗口

    25.Q:查询结果的比较

    1.Q:runaction后面能不能接变量(动态调用action,所以从数据库取数据做action名字了,但是调用总是找不到)?  

       A:脚本中原有RunAction "testbase [case1]", oneIteration

    把引号中的内容放到Global表中的第22行,然后将代码修改为:

    datatable.getsheet("Global")

    datatable.setcurrentrow(22)

    strLogin=DataTable("ActionName","Global")

    RunAction strLogin, oneIteration

    help中也有相关帮助

    如:

    Syntax

    RunAction ActionName, [IterationMode , IterationRange , Parameters]

    ActionName : String : The name of the action

    2.Q:QTP8.2中调用VB函数的问题(用VBscrīpt写了一些测试脚本需要的几个通用函数,有没有办法可以用类似include的方式进行调用,而不需要每次都把这些函数Copy到新的脚本中)?

       A:程序开头加上ExecuteFile "..\..\..\project\DeVariable.vbs"

    3.Q:QTP如何做回归测试(300多个TestCase,TD是否可以管理) ?

       A:TD可以实现,可以生成测试集,一个测试集可以包含若干个测试脚本

    QTP8.2本身提供一个工具Test Batch Runner但是运行完没有报告。

    MI有另一个工具叫MTM(multitestmanager)

    4.Q:qtp自动截图功能

    A:具体可参考此帖:http://www.51testing.com/cgi-bin ... d=17663&fpage=1

    5.Q:在QTP中如何设置使用别的浏览器(XP系统,用IE访问程序时,每次总提示屏蔽安装ActiveX插件,需要手动安装.但把这个过程录制到QTP后,回放一次是成功的。当我给某个输入框参数化了好多数据后,回放过程中,某些就会失败.

    可能有两个方面可以解决这问题1、每个动作设置延迟时间 2、设置为用别的浏览器。)

    (失败的提示信息是   object not visible)

       A:1.延迟可用WAIT X(X单位是秒)

    2.可以安装插件添加新的浏览器

       SystemUtil.Run "file” "params" "dir" "op'' "mode"

       QTP运行可执行文件的方法及其参数

        ps: 建议是用IE浏览器,或者IE内核浏览器做测试

    6.Q:checkpoint 检查网页,是否能实现只要网页出现乱码就返回错误报告?

       A:Text not displayed能解决问题

    关于 Text Checkpoint 的总结。

    1)Text Checkpoint 的检查部分分为三个部分。Checked Text 、Text Before 、Text After。在默认的情况下,Checked Text执行的是精确检查,其余两个部分执行的是模糊检查。Text Before(After)检查的内容可以比实际的内容少。但是不能有和是实际内容不相符的地方,否则就失败。

    2) Exact match选项。如果选择了这个选项,三部分完全都进行精确检查。个人觉得和只检查checked Text部分没有区别。

    3) Text not displayed。这个选项本质上就是一个结果取反的过程。就是把检查的结果给反过来,把pass变成Fail,Fail变成pass。我觉得这样就很容易理解。

    7.Q:WSH的应用方法

       A:WSH 实际上是一个脚本语言的运行环境,它之所以具备强大的功能,是在于其充分挖掘了脚本语言的潜力。因此,如果抛开脚本语言而空谈 WSH ,那实际上就没有了意义。而如果再展开来讲述脚本语言,显然就离开了今天的主题。

    在这种情况下,只好采取一种折衷的方法:给大家推荐几个脚本文件利用 WSH 执行任务的实例,希望大家能通过这些例子对 WSH 的使用有一个初步的认识。

      脚本文件的编写十分方便,你可以选用任意一个文字编辑软件进行编写,编写完成后,只需将它保存为 WSH 所支持的文件名就可以了(如.js 文件和.vbs 文件)。最常用的就是记事本编辑器,下面的实例都是以它作为工具编写的。

    打开记事本编辑器,在上面编写如下内容:

      Wscrīpt.Echo("走近 WSH")

      将它保存为以 .vbs 或 .js 为后缀名(千万不要写成了 .txt)的文件并退出记事本。双击执行这个文件。

      这一次,我们要利用 WSH 完成一次创建十个文件夹的工作。代码如下:

      dim objdir

      set ōbjdir=wscrīpt.createobject("scrīpting.filesystemobject")

      for k=1 to 10

      anewfolder="c:\chapter" & k

      objdir.createfolder(anewfolder)

      next

    同样,将它存为 .vbs 文件并退出。运行后,我们会发现,C 盘根目录下一次性多出了十个新文件夹。

    最后,再举一个在服务器上的运用。下面的代码将帮助你重新启动指定的 IIS 服务:  ' define a constant for stopped services

      Const ADS_SERVICE_STOPPED = 1

    ' get an ADSI object for a computer

      Set ōbjComputer = GetObject("WinNT://MYCOMPUTER,computer")

    ' get an object for a service

      Set ōbjService = objComputer.GetObject("Service","MYSERVICE")

    ' check to see if the service is stopped

      If (objService.Status = ADS_SERVICE_STOPPED) Then

    ' if the service is stopped, then start it

      objService.Start

      End If

    将它以 startsvc.vbs 为名保存在 C: 盘根目录。并通过如下命令执行:Cscrīpt C:\STARTSVC.VBS。运行后,经你指定的 IIS 服务项将被重新开启。

    其实,在 Windows 的 samples 目录下,有个 WSH 文件夹,那里面有不少很具代表性的 .vbs 和. js 脚本文件。

    此外,利用 WSH 还可以自己编写脚本文件来提高网络管理方面的效率。

    8.Q;从EXCEL中导出数据进行测试

    datatable.AddSheet("51sheet")

    datatable.ImportSheet "f:\test.xls","testsheet","51sheet"

    Dim i,RowCount '定义两个变量

    i=0

    RowCount=datatable.GetSheet("51sheet").GetRowCount '设置RowCount等于51sheet中的行数。

    msgbox RowCount

    Do while i<rowcount

    i=i+1 '第一次进入循环,执行这句后,i=1

    'datatable.getsheet("51sheet").setcurrentrow(i)   这句话被我注释掉了,正确的写法应该是下面这样,分开写。

    datatable.getsheet("51sheet")

    datatable.setcurrentrow(i)

    '执行过上面两句后,CurrentRow是第一行。

    tempData=DataTable.GetSheet("51sheet").GetParameter("Name").Value

                  

    '现在,我们调用msgbox看看下面这种调用方法得到的是什么值?没错,是第一行的值,下一次循环呢?

    '得到的是第二行的值么?

    msgbox "GetParameter-Name:"&tempData '这里弹出我们要看的值。

    '下面我们用另外一种方法来得到。

    msgbox "GetParameter-i:"&DataTable.GetSheet("51sheet").GetParameter(1).Value '这里我用GetParameter(1)去得到sheet中第一列的值。

    loop

    9.Q:关于dtGlobalsheet与dtGlobalsheet

    1) dtGlobalsheet只有一个,它的index值比较特殊,它有两个index值,一个是1还有一个是内置的默认的1000。

    你可以用1或者1000去引用它都是正确的。当然了,如果你用dtGlobalsheet来引用它也是正确的。这个sheet的Name叫做"Global"。注意:SheetName是区分大小写的。

    2) dtLocalsheet可以用index:1001来引用,当然,也可以用2来引用。至于其它自定义的sheet嘛,你就只能用index:3来引用了。

    它没有内置的默认的类似前两个那样的index值。

    3) datatable这个对象只有一个。就是所有sheet的集合。或许你把它理解为excel文件比较好。

    dtsheet呢?就是其中的每个sheet。所不同的就是MI为他们做了一些默认值。在我们的应用中,可能会有多个action,如:actiion1,actiion2,actiion3

    这些action也分别对应有各自默认的LoaclSheet.即:actiion1,actiion2,actiion3。

    如果每个action中,我们都只用到一个sheet,那就好办了,在每个action中都可以用localsheet来引用,但是如果我们有两个及两个以上的sheet.那么就比较容易乱套了。

    10.Q:移动当前位置的行

    For i=1   to 3

    datatable.getsheet("Global")

    datatable.setcurrentrow(i)

    DataTable("C","Global") = DataTable("nodename","Global") ‘把表Global中的nodename字段中的内容取出来。

    Next

    11.Q:如何能记录到页面的校验码?(Output value能不能得到web页面的校验码,一般的校验码是由图片随即生成的 ,用QTP怎么录脚本在登陆前得到校验码并输入到校验码一栏)

    A:1)一个很简单的方法:测试时叫开发屏蔽掉检验码的功能后,再录制脚本。检验码的功能可以手工很简单测试出来。

        2)想得到图片的校验码,唯一的方法就是跟程序员拿程序,然后自己在脚本里面写FUCNTION!

           其它就要手动输入了!

    12.Q:QTP正则表达式的帮助

    A: QTP regular expression usage.doc (到Google里勾吧)

    13.自动测试实施计划

    1)分析实施自动化测试可能存在的风险:就是决定是否实施, 用成本 时间 效果 。。

    2)制定实施的时机:也就是在什么阶段

    3)研究所要测试的功能 性能

    4)分析在测试中可能遇到的问题 和困难

    5)预估所需要的人时和相应的硬件

    7)确定负责人员和相关测试人员

    6)制定详细的测试计划 方案

    7)最后是执行计划

    14.Q:一个Action里如何调用在另一个Action中定义的函数、过程(或变量、常量)

    例如:

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

    'Action_A

       Public strURL

           ...... ......

    Function QueryList()

           ...... ......

           ...... ......  

    End Function

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

    'Action_B

    '如何调用 QueryList函数和strURL

    A:1)可以把这些变量和Function放在vbs文件作为resource文件共享,在每个Action中添加该文件.      

    如果function中出现控件调用,那么必须确保该控件在相应的Action的object repository中是存在的.

      2)定义一个可被调用的ACTION里面唯一的放一个FUNCTION

    15.Q:如何管理QTP的源代码?(QTP生成的源代码比较多,而且和环境控件都有关,假如需要多人同时开发, 请问如何管理源代码?)

    A: 一个是代码你可以通过vss,cvs等来进行管理

        一个是通过td或者qc的基于用例的代码管理    

    其实第一种方法是基于版本控制来进行的,第二种方法是基于用例管理进行的

        角度不同,管理方法也不同,不过团队协作需要的大家分工明确,进度控制。代码管理可以借鉴开发的方法。

    16:Q:脚本不能回放,IE中的AtiveX设置有问题??

    A: TOOL---OPTIONS----Ative screen

        然后点开advanced..,把LOAD   ACTIVEX CONTROLS打勾

        TOOL---OPTIONS----Ative screen

        然后点开advanced..,run scrīpts-->disabled!

    17.Q: 如何参数化link

    Browser("Browser").Page("Page").Sync

    Browser("Browser").Navigate "http://www.51testing.com/cgi-bin/index.php"

    Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Sync

    Set tags=Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Object.links

    Dim i,j, arr()

    i=0

    For Each element in tags

    If Ucase(element.tagname)="A" and left(element.InnerText,1)="[" Then

    ReDim Preserve arr(i+1)

           arr(i)=element.InnerText

    i=i+1

    end if

    Next

    For j=0 to i

    Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Link("[ 版主讨论区 ]").SetTOProperty "Text",arr(j)

             Browser("Browser").Page("51Testing软件测试论坛---软件测试,软件质量工程师").Link("[ 版主讨论区 ]").Click

    Browser("Browser").Back

    Next

    这段代码先是打开一个空的页面,然后输入url.

    到达论坛首页。

    然后得到所有版面的名称,也就是link的名称。

    存到数组里面。

    然后使用SetTOProperty更换录制时候录下的link的属性。

    这时候再click

    18. Q:QTP 在Debug狀態,在Export View 區域不能寫入任何東西

    A: 如果你的目的是在debug过程中修改已执行过的命令,可以在Debug view的Command中执行命令,如重新执行已经执行过的命令,修改变量的值等等。

    如:Window("Flight Reservation").WinEdit("Name:").Set "51testing"

    已经执行,如果现在想修改“51testing”为“testing”,可以在command中执行

    Window("Flight Reservation").WinEdit("Name:").Set "testing"

    19.Q:动态变化值如何获取

    A:VAL=Browser("欢迎使用我的工作台").Page("欢迎使用我的工作台").Frame("managePlace_7").WebRadioGroup("userAccountId_0").GetROProperty("Value")

    Browser("欢迎使用我的工作台").Page("欢迎使用我的工作台").Frame("managePlace_7").WebRadioGroup("userAccountId_0").select val

    20.Q:如何一一获得Table中 某栏 link 的 text?

    A:通过上面link 的学习. 我终于融会贯通,完成了我的问题: 与大家共享:

    //////////////////////////////////////////////////////////////////////////////////////

    Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Image("Tplus").Click

    Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Image("Tplus_2").Click

    Browser("Login").Page("Page").Frame("contents").ViewLink("treeview").Link("开课设置").Click

    Browser("Login").Page("Page").Frame("main").WebList("drpStatus").Select "任意"

    Browser("Login").Page("Page").Frame("main").WebButton("查找").Click

    Browser("Login").Page("Page").Sync

    Dim finded,findCode,Nowout

    'define a constrat for find

    findCode = 110901

    finded = false

    Function MaxPage(pageString)

    'msgbox pageString

    Dim ilen,i,j

    ilen = len(pageString)

    i=ilen

    While i>0

           j = mid(pageString,i,1)

       'msgbox j

       If instr("123456789",j)>0 Then

              MaxPage = j

       'msgbox MaxPage

       Exit function

       End If

       i=i-1

    Wend

    End Function

      

    Dim trowcount,maxp

    trowcount = Browser("Login").Page("Page").Frame("main_8").WebTable("开课代码").RowCount

    msgbox "Rowcount: "&trowcount

    Nowout = Browser("Login").Page("Page").Frame("main_8").WebTable("开课代码").GetCellData(trowcount,1)

    Nowout = trim(Nowout)

    maxp = MaxPage(Nowout)

    msgbox "max page: "& maxp

    Dim nowPage,checkid

    For nowPage = 1 to maxp

    If   finded Then

       Exit for

    End If

       ' link to the 当前所需page

       If nowpage>1 Then

    Browser("Login").Page("Page").Frame("main_8").Link("[2]").SetTOProperty "Text","["&nowpage&"]"

    Browser("Login").Page("Page").Frame("main_8").Link("[2]").Click

    Browser("Login").Page("Page").Sync

    end if

       ' Get the rowcount of table in now page

    trowcount = Browser("Login").Page("Page").Frame("main_8").WebTable("开课代码").RowCount

    msgbox "Rowcount: "&trowcount

       'link every record in the table of the page

    for i = 2 to trowcount   - 2

    Nowout = Browser("Login").Page("Page").Frame("main_8").WebTable("开课代码").GetCellData(i,2)

    'msgbox i&": "&Nowout

    checkid = "dgCourse:_ctl" &(i+1)& ":_ctl0"

    Browser("Login").Page("Page").Frame("main_8").WebCheckBox("dgCourse:_ctl3:_ctl0").SetTOProperty "name",checkid

    Browser("Login").Page("Page").Frame("main_8").WebCheckBox("dgCourse:_ctl3:_ctl0").Set "ON"

    Browser("Login").Page("Page").Frame("main_8").Link("0901").SetTOProperty "Text",Nowout

    Browser("Login").Page("Page").Frame("main_8").Link("0901").Click

    Browser("开课设置详细信息").Page("开课设置详细信息").Sync

    'wait(1)

    msgbox "begun"

    msgbox findCode

    msgbox Nowout

    msgbox "finished"

    If   trim(findCode) = trim(Nowout) Then

           finded = true

    msgbox "find is ok!"

    wait(2)

    Exit for

    End If

    Browser("开课设置详细信息").Close

    Browser("Login").Page("Page").Sync

       next

    Next

    21.Q:网页下拉框的选择

    A:For i =1 to 10

    Randomize

    IndexNum=Int((10 - 5 + 1) * Rnd + 5)

    Browser("Mercury Tours").Page("Find Flights_2").WebList("arrive").Select "#"&IndexNum

    wait(3)

    Next

    Sub ChildObjects_Example()

    'The following example uses the ChildObjects method to find all the

    'list objects on a Web page, and then to select an item in each list.

    Set ōDesc = Descrīption.Create()

    oDesc("micclass").Value = "WebList"

    Set Lists = Browser("Mercury Interactive").Page("Mercury Interactive").ChildObjects(oDesc)

    NumberOfLists = Lists.Count()

    For i = 0 To NumberOfLists - 1

    Lists(i).Select i + 1

    Next

    End Sub

    22.Q:将测试数据单独拿出来

    A:取得一个

    Browser("Browser").Page("").WebList("fid").GetItem (1)

    取得全部

    Browser("Browser").Page("").WebList("fid").GetROProperty("all items")

    以下可以在自带的例子中实现

    Window("Flight Reservation").WinComboBox("Fly From:").Select "Frankfurt"

    a=window("Flight Reservation").wincombobox("Fly From:").GetItem(1)

    reporter.ReportEvent 2,"下拉列表的值",a

    23.Q:和TD连接

    A:在QTP中不是有个Quality Center Connection,选择服务器连接,服务器处输入类似http://computer_name/tdbin,其中computer_name为服务器的名字,连接后在测试结果中添加defect就可以与TD相连了。

    24:Q:处理Windows弹出窗口

    A:IF Not Window("Flight Reservation").Exist(1) Then

    'Calling   open flight

                If not Dialog("Login").Exist(1)   Then

           Browser("管理系统").Dialog("Microsoft Internet Explorer").WinButton("确定").Click

        End If

    25.Q:查询结果的比较

    这是查询一个字段的,对查询结果多页的情况也涉及了,其实应该把所有查询字段联合起来的,也就是改改sql语句和判断条件。

    [i]Set Conn = CreateObject("ADODB.Connection")

    Set Rs = CreateObject("ADODB.Recordset")

    Conn.Open "Descrīption=kml-it;DRIVER=SQL Server;SERVER=KML-IT;UID=sa;PWD=password;APP=QuickTest Professional;WSID=KML-MICHELLE;DATABASE

  • QTP学习总结-【2010-04-26】

    2010-04-26 11:44:08

    1,不执行  IF    num1 <> 0  and  nums  =  num1  Then  
    原因:nums=Browser("**************").Page("************").Frame("PageFrame_2").Object.getElementById("ctl00_cntGrid2_IoPagination1_lblRecSum").innertext  是字符串型的,num1是数字型,类型不匹配,所以不执行,但程序并没有报错,只是不执行这句,走了else

      
    2,
    set  table=Browser("****************").Page("*************").Frame("PageFrame").Object.getElementById("ctl00_cntGrid1_dgdData")
    set rowsobj=table.rows

      For i=1 to rows-1
                          cells=rowsobj(i).cells.length

    If  cells=9  then
    msgbox "Rst(0)="&Rst(0)&"rowsobj(i).cells(3).innertext==="&rowsobj(i).cells(3).innertext
    If       Rst(0)=rowsobj(i).cells(3).innertext Then

     

    不知为什么第一行数据的行号(rows)是1????

    3, If     j  =  num1   Then 中j不等于num1
               
     j放到了for循环的里面,导致j的结果不准确了 , 


    20100205:
    QTP无法录制选中下拉菜单(winMenu)的步骤 
    解决方法:利用低级录制,按下下拉菜单项的快捷键 


    20100222:
    在windows 20003上安装TD8.0失败,安装到40%到50%时,提示"Automaiton error the system cannot find the path specified Creating Virtual Directory failed"

    网上查到的原因:
    TD安装后,将部署到IIS的默认网站下,如果默认网站中的有一点变化,都会导致TD失败,所以一般在IIS安装后,第一个安装TD

    将使用的解决方案:
    新建一个干净的windows 2003 的虚拟机到本机上,

    20100223:
    点击run开始运行,无法执行脚本,弹出“can't find  object....virifiy 。。application” 用obj  spy查看对象,发现web对象被识别成winObject
    解决方法:
    网上资料:工具->Internet选项->程序->管理加载项
    QTP用来识别Web元素的控件BHOManager Class由禁用改为启用后QTP就可以恢复正常
    但其实本机的BHOManager Class确实是启用状态,只好使用将其改为禁用再改为启用的方法来解决web对象被识别成winObject的问题,同时也解决了无法执行脚本,弹出“can't find  object....virifiy 。。application”的问题


     

  • 转载[自动化测试一点思考]

    2010-04-07 11:31:58

        自动化测试首先要有自动化测试用例。自动化测试用例应该在需求完成后与功能测试用例一起由专门的人员来负责编写。如果项目不是太大的话,当然也可以测试人员即写功能测试用例,又写自动化测试用例。但是,有一点,就是自动化测试用例必须单独提取出来。自动化,首先要在有测试用例的基础上才能进行。如果连测试用例都没有,那就不要做了。自动化测试用例的选择,可以是一些通用功能。如登录,查询功能。也可以是一些主要业务,要求准确度高的。这个就根据项目的自动化程度来决定了。不过对于初次自动化的项目,可以做一些通用功能的测试用例。

        其次,自动化测试的测试环境。因为程序发布时肯定有测试环境,也有开发环境。开始我认为自动化只是在测试环境,不能在开发环境进行。但后来一件事情改变了我的看法。今天正式环境发现查询的下拉列表数据出不来。其实,这个正式环境的问题就可以用自动化测试来解决。我们也可以在正式环境中做一些通用的,但不做业务操作的自动化测试。

        再一个问题,就是自动化测试的实施。自动化测试应该是在系统每次上线时都对其他已有的功能进行一遍自动化测试,确保程序的稳定。对一些需要长期投入人力开发的项目,自动化测试还是很有用的。但对一些短期项目,自动化测试就作用不大了。

        再剩下的问题就是自动化测试框架了。这个框架我也没有研究过。不过对于自动化一开始就实施框架,我觉得不是太好。也许应该等到公司自动化实施一段时间,时机成熟了,再实施框架会好一些。

  • 每个函数结尾处将set过的对象都set成nothing,减少内存泄露。

    2010-02-06 11:27:52

    a. 作成一个vbs文件,里边追加一些vbs共通方法(例:log出力处理),注意在每个函数结尾处将set过的对象都set成nothing,减少内存泄露。

    b. 给【对象,输入值,输出值】通过【datatable,环境变数,外部文件读入】进行参数化

  • 在软件测试工具中如何使用QC远程启动QTP

    2010-02-06 11:03:14

     

    随着测试团队不断扩大,QTP测试脚本不断增多,我们需要用多台电脑来运行QTP脚本,如果大家要登录到每台机器上去跑脚本,就太不方便了,而且各个机器上的脚本版本还有是否统一的问题。
     
        如果我们能用一台电脑,指挥多台装了QTP的电脑运行脚本,岂不爽哉。
     
        Mercury公司开发的Quanlity Center(简称QC),就可以实现这个功能。
     
        要使用QC远程调用QTP,需要进行一系列的设置才能实现。在这篇文章里,我们把部署了QTP的电脑叫做“测试机”,把远程控制测试机的电脑叫做“控制台”,方便说明。
     
        在测试机装完QTP后,还要安装一个插件:TDPlugin。这个插件的安装程序在安装盘的TDPlugin目录下面,安装后重启。
     
        下面的设置非常重要,在QTP的安装指南中有详细的描述,我这里把几个重点说明一下。安装指南文件名是:QT_Install_Guide.pdf。具体内容在“Modifying DCOM Permissions Manually to Enable Remote QuickTest Execution”这一章。
     
        先要设置windows登录用户的权限,指南文件的说明是假定测试机和控制台都已经加入域,其实不加入域也一样可行,只是设置有些不同。我们这里先讲没有加入域的情况。比如我们用 ctrlUser这个用户登录控制台的windows,那么,就必须在测试机里也增加一个同名并且密码也相同的ctrlUser用户,并且把这个用户添加到系统管理员组。
     
        如果两台机器都加入域,就更好办了,比如控制台的登录域用户是ctrlDomainUser,那么只要在测试机的系统管理员组里,添加这个用户即可,也就是说,登录控制台的用户拥有测试机的管理员权限。
     
        下一步是设置测试机的防火墙,主要是开放135端口和添加AQTRmtAgent.exe代理程序到防火墙的例外列表中。
     
        然后是设置DCOM的权限,这里的设置步骤比较多,在安装指南文档里面说的比较清楚,主要是把一些用户和组添加到允许访问的列表中。
     
        设置完DCOM以后,我们打开QTP,在option中的Run分页,把“Allow other Mercury products to run tests and components”选中。
     
        好,现在打开一个Test,然后将QTP和QC连接,把这个Test保存到QC上面。在控制台上登录QC,新建一个测试集,把刚才那个Test加入这个测试集。然后在“主机管理器”里面,把测试机的ip添加进来。回到测试集窗口,把这个Test的“计划主机名”指定为测试机的IP,好,现在运行测试集就大功告成了。
     
        这时测试机的QTP会自动启动,run这个Test,run结束以后,测试结果会自动保存在QC服务器上,我们可以在任意电脑上查看测试结果。

  • QTP自动化测试流程

    2010-02-06 11:01:56

    )准备TestCase
            - 在进行自动化之前,将测试内容进行文档化,不建议直接录制脚本
            - 在录制脚本之前设计好脚本,便于录制过程的流畅
            - 由于测试用例设计和脚本开发可能不是同一个人完成,便于团队合作
            - 便于后期的维护
            - 文档化的方式:TD或者文档
     
    2)配置QTP
            QTP支持不同的开发环境,在正式录制之前,需要根据被测程序的开发环境,选择合适的Add-In,并进行加载。
     
    3)录制脚本
            启动QTP的录制功能,按照Test Case的操作步骤描述执行,QTP自动记录每一步操作,并自动生成VBscrīpt脚本。
     
    4)修改增强脚本
            刚刚录制好的脚本可能包含错误,或者没有达到预期的目的,这就需要在录制脚本的基础上,进行修改增强
            - 删除录制过程中多余的以及错误的操作,以最少的脚本完成任务
            - 如果前面操作的输出是后面操作的输入,则需要使用变量或者输出值来进行替换
            - 不是所有的操作都可以通过录制产生的,有些需要通过手工编码实现这些功能
            - 录制产生的脚本是线性的,可以加入条件、循环控制语句,实现更复杂的流程
            - 对脚本进行结构化
            - 加入注释,便于阅读和维护
     
    5)调试脚本
            - 回放通过的脚本,不一定是正确的,也可能会包含错误
            - 在测试脚本正式使用之前,要保证其本身的正确性
            - 避免测试脚本故障和被测程序故障搅在一起,不容易定位
     
    6)回放脚本
            - 对于回放的错误,不要急于马上提交Bug,首先要判断是脚本本身的错误还是程序的错误,确认后再提交。
     
    7)脚本维护
            - 随着工作的不断推进,脚本量会越来越多
            - 被测试程序的不断更新,也需要更新相应的测试脚本
            - 采用版本管理工具保存脚本,如CVS、VSS,可以随时获取历史版本
            - 采用统一的脚本架构
            - 采用统一的命名规范
            - 添加充分的注释,避免时间久了,自己都不能马上读懂脚本

    全部脚印 不留脚印 留下脚印:
  • QTP中DataTable操作大全

    2010-02-06 11:00:47

     序曲

       假设现在有一个Excel文件:D:\data.xls,里面的具体内容如下:有两个Sheet,第一个叫Login,第二个叫InsertOrder;

       当前QTP的Test中有两个Action:LoginAction和InsertAction。当然该Test中对应的DataTable应该有三个:Global、LoginAction和InsertAction;

    下面就详细的说一下DataTable是如何操作这些数据的:

    正文

    DataTable.Import "D:\data.xls" '将data.xls中第一个叫Login表单内容导入到Test的Global表单中,将InsertOrder表单的内容导入到Test的LoginAction表单中,依次类推;感觉怪怪的,所以这个方法比较适合只导入Excel中第一个表单的内容

    DataTable.ImportSheet "D:\data.xls","Login","LoginAction"'将data.xls文件中的Login表单内容导入到当前Test的LoginAction表单中

    DataTable.GetSheet("Global").SetNextRow'设置下一行,红色表示要操作的表单名字
    columnCount = DataTable.GetSheet("Global").GetParametercount'取得Global表单中的总列数
    DataTable.GetSheet("Global").DeleteParameter ("列名")'运行时向Global表单中删除列

    DataTable.GetSheet("Global").SetPrevRow'设置上一行
    cellValue = DataTable.GetSheet("Global").GetParameter("列名")'取得Global表单中某列的值,可以这样写:DataTable.Value("列名","表单名字"),我喜欢这种写法

    rowCount = DataTable.GetSheet("Global").GetRowCount'取得Global表单中的总行数
    DataTable.GetSheet("Global").SetCurrentRow(3)'设置当前行为第3行
    DataTable.Value ("列名", "表单名字")="twf"'运行时设置某列值,例如DataTable.Value ("username", "LoginAction")="twf"

    DataTable.Export "D:\result.xls"'将当前Test的所有表单(LoginAction和InsertOrderAction、Global)中的所有内容全部导出到result.xls中

    DataTable.ExportSheet "D:\result.xls","LoginAction"'将当前Test的LoginAction表单中的内容导出到D:\result.xls文件中

    有问题多多指教,共同进步!您的关注会使俺快乐!!!

  • qtp把web页面对象识别成WinObject类型的解决方法

    2010-02-06 10:51:43

    对于其不能准确识别的对象,QTP会把它识别成WinObject类型,这时常常会导致相应的测试脚本录制工作无法继续进行下去。

    这几天在使用QTP的过程中,遇到这种情况,有些QTP曾经能识别的Web页面对象,在后来没法正确识别,用spy察看会发现识别为WinObject类型了,解决办法总结如下:

    一、 察看在IE的加载项中,QTP用来识别Web元素的控件是否被禁用,如下图所示,把BHOManager Class由禁用改为启用后QTP应该恢复正常。

    进入IE加载项的步骤:

    工具->管理加载项 或者

    工具->Internet选项->程序->管理加载项

    二、如果用第一步的方法不能解决问题,则把QTP关闭重新打开,不行则重启电脑。

  • QTP录制脚本设置(1)—录制前IE设置

    2010-02-06 10:43:39

    QTP录制脚本设置(1)—录制前IE设置(2008-07-04 15:34:26)

    确保你的IE运行正常

    依次点击菜单 查看 --> 工具栏,一定要将上网助手等插件卸载掉,如3721和一些拦截广告的软件

      修改浏览器的设定,设置不让浏览器帮你自动输入帐号和密码,确保所有操作都会录制下来。

    一:取消[自动完成]的设定

    1. 开启IE浏览器,点选[工具]-[Internet选项]-[内容]   

    2. 点选 个人信息中的[自动完成],进入自动完成设置.

    3. 取消[表单上的用户名和密码]选项

    4. 点选确定,关闭对话框

    二:  ActiveX控件设置 IE-> 工具-> Internet 选项->  安全->  自定义级别

    三:解决录制过程中显示弹出窗口问题 IE-> 工具->Internet 选项->安全->自定义级别

  • webRadionGroup和webtable的使用技巧

    2009-11-17 16:03:30

     
    2009-01-06 10:31

    '   演示环境 http://newtours.demoaut.com/mercuryreservation.php51Testing软件测试网 F V G c1? J Z
    Browser("Find a Flight: Mercury\").Page("Find a Flight: Mercury").WebRadioGroup("tripType").Select "oneway"
    g e M G w!v L X10393' all items 获取所有单选框的对象,51Testing软件测试网 ^ z L Y x ^ v
    msgbox Browser("Find a Flight: Mercury").Page("Find a Flight: Mercury").WebRadioGroup("tripType").GetROProperty("all items")51Testing软件测试网-c!n,p ^ B(t*F Z N&~ o[
    'items count 获取单选框的个数51Testing软件测试网 | S%x Q7y!b7h*V3f
    msgbox Browser("Find a Flight: Mercury").Page("Find a Flight: Mercury").WebRadioGroup("tripType").GetROProperty("items count")
    M y$Q f @(L R H'x10393
    W W ~&n g-N10393 'selected item index   获取当前所选对象index 51Testing软件测试网3s;p a N N9O m b k b
    msgbox Browser("Find a Flight: Mercury").Page("Find a Flight: Mercury").WebRadioGroup("tripType").GetROProperty("selected item index")51Testing软件测试网 R3a ^.v ?2A A#^
    msgbox Browser("Find a Flight: Mercury").Page("Find a Flight: Mercury").WebRadioGroup("tripType").GetROProperty("value")

    如图,知道其中黄色部分,要找到器绿色部分的信息,同时,在本页找不到的情况下,翻页继续找,直到最后一页!

    具体代码如下:

    Browser("欢迎使用信贷综合管理系统").Window("查询 -- 网页对话框").Activate
    )k,@;m `/? J#g-@ e a#F10393'Browser("欢迎使用信贷综合管理系统").Window("查询 -- 网页对话框").Page("查询").Link("5").Click

    If
    51Testing软件测试网/f"{ @3M3f'H T E6K
    msgbox Browser("欢迎使用信贷综合管理系统").Window("查询 -- 网页对话框").Page("查询").WebTable("序号").GetCellData(2,3)51Testing软件测试网 k { [ [(b
    Dim row ,link
    3~$~ D e*B A[10393row = Browser("欢迎使用信贷综合管理系统").Window("查询 -- 网页对话框").Page("查询").WebTable("序号").GetRowWithCellText(DataTable("p_Text", dtGlobalSheet), 2, 3)51Testing软件测试网6V F g V3H c B
    msgbox row

    Set Link = Browser("欢迎使用信贷综合管理系统").Window("查询 -- 网页对话框").Page("查询").WebTable("序号").ChildItem(row, 1, "Link", 0)

    Link.Click

    同时,webtable常用的方法还有

    if Browser("欢迎使用信贷综合管理系统").Window("查询 -- 网页对话框").Page("查询").WebTable("序号").Exist then

    reporter.ReportEvent 0,"pass","系统显示了所有的资讯列表!"

    else
    ;k*q {&s { C10393 reporter.ReportEvent 1,"fail","
    系统没有显示资讯列表!

    end if获取表格行数:51Testing软件测试网'i D C7t2i T `4pb l
    Browser("欢迎使用信贷综合管理系统").Window("查询 -- 网页对话框").Page("查询").WebTable("序号").RowCount

  • QTP代码方面的小知识

    2009-11-17 14:07:55

    1 检查页面是否存在
    对象exist可以检查某一个页面是否存在。
    代码:
    if Browser("…").Page(“…").Exist then
    ‘在运行结果中显示的报告, “micPass”的状态是通过, micFail是不通过
       reporter.ReportEvent micPass ,“页面存在“,”通过“  
       else
       reporter.ReportEvent micFail ,"页面不存在“,"不通过"
    end if

    7.2 防止程序中断的方法
    在回放脚本的时候,有时因为错误导致运行的脚本中断,不能自动运行。为了能达到真正无人职守的状态可以在脚本的最前面加上如下的代码:
    On error resume next ‘遇到错误返回到脚本的下一行继续执行。
    On error goto 0 ‘错误处理的控制权,平时是由QTP控制的(这个叫默认的),当有on error resume next 时,是交给on error处理,当on error goto 0时,就换给QTP

    7.3 同步点的设定
    等待某一对象出现后继续执行,为了防止qtp找不到对象而设定同步点。有2种方法:1种是用wait加等待的时间,如wait 5(qtp等待5秒钟后继续执行)。另一种方法是等待要执行对象的出现,如果出现就继续执行,否则一直等待,代码如下:
    y=......waitproperty("visible",true,10000)
    If y=true then
       ‘执行下一条语句
       else
        ’对象不出现就一直等待,直到过了10000秒后程序找不到对象报错
    End if

    7.4 截屏
    在优化脚本时,如果想查看某一页面在执行后的页面效果,可以采取截屏的办法截取当前的操作页面并保存到本地。代码:
        desktop. capturebitmap “c:\***.bmp“,ture     ’在脚本中想要查看的一行插入,运行后图片保存到设置的路径下
    7.5 导入execl文件并参数化数据方法
    Qtp自带了datatable表,可以把要参数化的数据写在里面,但这样写脚本和数据不能分离,后期不好维护脚本。现在采用从外部导入execl文件的方法导入数据。代码如下:
       datatable.ImportSheet “D:\...\data.xls”,“sheet1”,“global“
       ‘第一个参数是要导入文件的路径,第二个是execl的第一个表格,第三个参数是在execl的全局范围内查找

       另外datatable对象还有很多操作,比如:获取表中字段的行数,插入表数据,删除数据等,下面是获取表中数据的代码:datatable("A","dtglobalsheet)
    7.6 为描述性编程自动创建注释
       当希望在每一个新建action时都增加一些头部说明,比如作者、创建日期、说明等信息,那么用action template 来实现最简单快捷。 方法:用记事本等文本编辑器,输入如下类似的内容:           'Company:东方般若            'Date: Date          然后将文件保存为ActionTemplate.mst,并存放到QTP安装目录下的dat目录。

    7.7 导入vbs文件
    想要实现脚本的函数化,并更好的维护它,可以把一些公用的函数写到vbs里面,用qtp来调用它。
    实现调用vbs的方法有2种:
    1.函数executefile加vbs文件的路径
    executefile “c:\...\funcation.vbs”

    2.设置QTP test/settings/resources/+函数目录

    7.8 时间差函数

    统计两个日期时间段之间的间隔,还有多少小时
    Dim timediff
    timediff=datediff(“H”,now,“2008-8-8” )
    Print timediff
    7.9 获取web下拉框中数据的行数和数据值
    1.获取行数:首先将webtable添加到对象库中,查看对象库里有该webtable的属性后
    count=Browser("…").Page("Page").Frame("…").WebTable("...").RowCount
       Msgbox count ‘查看行数
    2.获取数据值,
       for i=1 to count    
    value=Browser("…").Page("Page").Frame("…").WebTable("...").getcelldata(i,1)
       msgbox value
       next
    获取到列表中的数值后,qtp的对象库中没有这个WebElement的对象,一般采用描述性编程的方法获取对象,比如:用getcelldata获取的表中数据的innertext属性是“普通岗”,那么就可以用如下代码:
    for i=1 to count    
       value=Browser("…").Page("Page").Frame("…").WebTable("...").getcelldata(i,1)

       Browser(“…”).Page(“Page”).Frame(“…”). WebElement(“innertext:=“&value,”index:=1”).click
    next

    7.10 对象获得焦点
    判断某个webedit输入框是否获取了焦点,如果没有获取就给它焦点,然后输入数值。代码如下:

    if not browser("**").page(“**").webedit(“
    **").object.isdisabled then
             .object.focus
             .object.set "输入数值“

    7.11 获取对象当前属性值
    用GetROProperty可以获取对象的当前属性值,比如一些对象的属性经常发生变化,用getroproterty就能定位对象当前的属性状态来执行相应的操作。
    Dim pro
    pro= browser("**").page(“**").webedit(“
    **“). GetROProperty(“property”,value)
    Msgbox pro ‘弹出窗口,查看获取的属性。

    7.12 Systemutil对象的应用
    利用systemutil可以实现的功能:回放qtp脚本时禁止鼠标和键盘的输入;打开应用程序或web;通过句柄关闭进程;通过进程名关闭进程等。下面的代码是打开百度网页:
    systemutil.run “iexplore.exe”,“http://www.baidu.com”,“”,“”,“”,3        ‘打开百度的首页,最后面的参数“3” 代表打开ie后最大化

       SystemUtil.CloseProcessByName(“iexplore.exe”)      ‘关闭ie

       
    7.13 Action的使用
    action分为内部调用和外部调用2种方法:内部调用使用split划分;外部调用时被调用的action设置成share,并共享对象库。
       split action:RunAction "action", oneIteration
    7.14. 随即数

    在测试中有时会用到随即数,有多种方法:
       
    第一种 :n=randomnumber.value(1,255) ’n的值从1到255之间随即产生

    第二种 :randomize      ‘更新反回的数据          dim n
                 n=int (10*rnd())
                 msgbox n        ‘n为10以内的整数


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

    打开对象库resources->object repository,或者用快捷方式:ctrl+r来打开。

    1.Qtp中的对象库和脚本是一一对应的,如果脚本中某个对象在对象库中不存在,则无法回放成功,会提示找不到对象。

    2.对无法识别的对象用spy工具获得后添加到对象库中。

    3.有时候脚本回放失败就是找不到对象的原因,可以通过用spy工具查看找不到对象的属性,然后打开对象库,比较二者的属性信息,如果属性有不相同的说明就是属性的原因,可以通过更改属性的方式统一对象属性。

    7.17 调试脚本

    1.脚本编写完毕,可以用按ctrl+f7来查看脚本是否有语法错误。

    2. Msgbox和print:在回放脚本时可以方便的查看自己想看到的信息。


    3.设置断点:为了测试某一小段脚本的功能,而当整个action很长的时
    候,可以设置断点单步debug。
    7.18 强制退出
    遇到问题退出可以用exittest或 exit for,例如下面代码:

    Public function text_exit()
         for i=0 to 10
                if i=3 then
                    exittest
                    ‘exit for
                end if
         next
    End function

    Text_exit()
          
    7.19 连接数据库_增删改
    Dim conn,strSql    '定义变量
    set conn = CreateObject("ADODB.Connection")   '创建连接
    conn.ConnectionString="Provider=SQLOLEDB.1;Password=isaac121379;Persist Security Info=True;User ID=sa;Initial Catalog=WisdomCRM;Data source=192.168.12.29"   '设置连接字符串
    conn.open '开启连接
    'strSql="insert into UM_User values(1,'UserID')" '设置插入语句
    strSql="drop table TM_Task_14_Target"
    'strSql="select * from UM_User"

    If conn.state=0 Then   '如果连接状态为0,表示连接失败,写入reporter对象中,否则表示连接成功
        Reporter.ReportEvent micFail,"testing","数据库连接失败"
        conn.close
        Set conn = nothing
    else
       Reporter.ReportEvent micPass,"testing","数据库连接成功"
       conn.execute strSql    '执行更新语句
       conn.close
       Set conn = nothing
    End If
    7.20 连接数据库_查
    Dim conn,res,strSql    '定义变量
    set conn = CreateObject("ADODB.Connection")   '创建连接
    conn.ConnectionString="Provider=SQLOLEDB.1;Password=isaac121379;Persist Security Info=True;User ID=sa;Initial Catalog=WisdomCRM;Data source=192.168.12.29" '设置连接字符串
    conn.open '开启连接
    Set res = CreateObject("ADODB.RecordSet")   '创建一个记录集对象
    strSql="select * from UM_User" '设置查询雨具
    If conn.state=0 Then   '如果连接状态为0,表示连接失败,写入reporter对象中,否则表示连接成功
        Reporter.ReportEvent micFail,"testing","数据库连接失败"
        res.close                               '关闭结果集和连接,并且置为空
        Set res = nothing
        conn.close
        Set conn = nothing
    else
       Reporter.ReportEvent micPass,"testing","数据库连接成功"
       res.open strSql,conn    '执行查询语句
       res.MoveFirst        '将记录集游标指到记录集的最开始
       Do
          Reporter.ReportEvent micPass,"file",cstr(res(0))+" : "+cstr(res(1)) '循环遍历查询结果,并且保持到reproter对象中,直到记录集到达末尾,循环结束
          res.MoveNext
       Loop until res.eof = true
       res.close
       Set res = nothing
       conn.close
       Set conn = nothing
    End If
    低级录制
    在无法识别对象时使用
    利用Vbs运行外部程序
    WSH也就是用来解析Vbs的宿主,本身包含了几个个常用对象:
    1、scrīpting.FileSystemObject —> 提供一整套文件系统操作函数
    2、scrīpting.Dictionary —> 用来返回存放键值对的字典对象
    3、Wscrīpt.Shell —> 提供一套读取系统信息的函数,如读写注册表、查找指定文件的路径、读取DOS环境变量,读取链接中的设置
    4、Wscrīpt.NetWork —>
    提供网络连接和远程打印机管理的函数。(其中,所有scrīpting对象都存放在SCRRUN.DLL文件中,所有的Wscrīpt对象都存放在WSHOM.ocx文件中。)
    现在我们需要的是第三个对象,好了,让我们先连接一下对象看看,在记事本的编辑窗口中输入:
    Set ōbjShell = CreateObject(“Wscrīpt.Shell”)
    objShell.Run “notepad”
    Objshell.run “calc”
    自建日志
    Public Sub logfile(message)
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Dim fileSystemObj, fileSpec
    Dim currentTime
    currentDate = Date
    currentTime = Time
    testName = "log"
    Set fileSystemObj = CreateObject("scrīpting.FileSystemObject")
    fileSpec ="f:\log.txt"
    If Not (fileSystemObj.FileExists(filespec)) Then
    Set logFile = fileSystemObj.CreateTextFile(fileSpec, ForWriting, True)
    logFile.WriteLine("###############################################")
    logFile.WriteLine (currentDate & currentTime & " Test: " & environment.Value("TestName") )
    logFile.WriteLin("######################################")
    logFile.Close
    Set logFile = Nothing
    End If
    Set logFile = fileSystemObj.OpenTextFile(fileSpec, ForAppending, False, True)
    logFile.WriteLine (currentDate & " "& currentTime & " " & message)
    logFile.Close
    Set logFile = Nothing
    Set fileSystemObj = Nothing
    End Sub
    logfile(“ok")
    Vb6生成dll
    Environment对象
    检查页面文字显示颜色
    Set Elements = Browser(“WisdomCRM客户关系管理系统”).Object.Document.all.tags(“div”)’tags(“td”)为在td中检查
    For each Element in Elements
    If Element.InnerText="执行团队" Then
        strhtml=Element.Innerhtml
        n=instr(strhtml,"color=red")
        If n=0 Then
          msgbox "Text color is red!"
       exit for
        End If
    End If
    Next
    关闭重复的页面
    Dim loginwin
    Set loginwin = descrīption.Create()                                                  '创建对象名为loginwin的对象
    loginwin( "name").value="WisdomCRM客户关系管理系统"   ',对象属性及值


    Set child=desktop.ChildObjects (loginwin)
    cout=child.count
    msgbox cout
    For i=1 to cout
       child(i-1).close '循环寻找这个对象
    Next
    获取当前测试的路径
    Path = environment("TestDir")'获取当前测试的路径
    msgbox path
    获取本机ip
    set IPConfigSet = GetObject("winmgmts:{impersonationLevel=impersonate}").ExecQuery _
    ("select IPAddress from Win32_NetworkAdapterConfiguration where IPEnabled=TRUE")

    for each IPConfig in IPConfigSet
    if Not IsNull(IPConfig.IPAddress) then
    for i=LBound(IPConfig.IPAddress) to UBound(IPConfig.IPAddress)
    Msgbox IPConfig.IPAddress(i)
    next
    end if
    next
    点亮对象
    highlight
    fireEvent用法
    针对Link对象,onmouseover时间, 还有onchange, onclick, ondblclick, onblur, onfocus, onmousedown, onmouseup, onmouseout, onsubmit, onreset, onpropertychange事件可以使用
    sendkeys实例
    Set wshshell=createobject(“wscrīpt.shell”)
    其使用格式为:object.SendKeys string “object”:表示WshShell对象 “string”:表示要发送的按键指令字符串,需要放在英文双引号中。 1.基本键   一般来说,要发送的按键指令都可以直接用该按键字符本身来表示,例如要发送字母“x”,使用“WshShell.SendKeys "x"”即可。当然,也可直接发送多个按键指令,只需要将按键字符按顺序排列在一起即可,例如,要发送按键“happy”,可以使用“WshShell.SendKeys "happy"”。
    sendkeys实例
    2.特殊功能键 对于需要与Shift、Ctrl、Alt三个控制键组合的按键,SendKeys使用特殊字符来表示: Shift---------WshShell.SendKeys "+" Ctrl---------WshShell.SendKeys "^" Alt---------WshShell.SendKeys "%" 由于“+”、“^”这些字符用来表示特殊的控制按键了,如何表示这些按键呢? 只要用大括号括住这些字符即可。例如: 要发送加号“+”,可使用“WshShell.SendKeys "{+}"” 另外对于一些不会生成字符的控制功能按键,也同样需要使用大括号括起来按键的名称,例如要发送回车键,需要用“WshShell.SendKeys "{ENTER}"”表示,发送向下的方向键用“WshShell.SendKeys "{DOWN}"”表示。 Space---------WshShell.SendKeys " " Enter---------WshShell.SendKeys "{ENTER}" ←---------WshShell.SendKeys "{RIGHT}" ↑---------WshShell.SendKeys "{UP}" F1---------WshShell.SendKeys "{F1}" Tips:如果需要发送多个重复的单字母按键,不必重复输入该字母,SendKeys允许使用简化格式进行描述,使用格式为“{按键 数字}”。例如要发送10个字母“x”,则输入“WshShell.SendKeys "{x 10}"”即可。

    先录制取得初始脚本,再做简单的修改和参数化,再进行封装形成可重用的函数,最后回放调试,形成了最终的脚本。
  • QTP8.2 中无法显示Active Srceen

    2009-11-13 11:45:24

    当前电脑上安装的是IE7或以上版本,安装完QTP8.2,打开之后发现无法显示Active Screen,

    原因:IE7卸载,恢复IE6,(我将QTP也重装了)之后打开QTP可以显示Active Screen

     疑问:在恢复IE6之后不知道需不要再重装QTP,因为当时QTP也存在其他问题,所以顺便把QTP也重装了。

  • 如何设置让对象库不产生重复对象

    2009-09-23 16:02:16

    如何设置让对象库不产生重复对象

    tools --options---web ---page/frame. optinons
    都选择第二项.就OK了.
  • 提高QuickTest 性能

    2009-09-23 15:08:15

    录制时:1,QuickTest 启动时,不要在加载项管理器中加载不必要的加载项。这将缩短录制时间并提高测试运行性能。

    2,如果编辑测试时没有使用Active Screen,请在编辑测试时隐藏Active Screen 以缩短编辑反应时间。选择“视图”>“Active Screen”,或切换Active Screen 工具栏按钮隐藏Active Screen。

    3,1)如果正在测试Windows Applications,可以选择在每一步保存所有的Active Screen 信息、只在某些步骤保存信息或完全禁用Active Screen 捕获。可以在“选项”对话框中的“Active Screen”选项卡上设置该首选项。

    2)如果正在测试Web 应用程序,则可以禁用Active Screen 中所有步骤的屏幕捕获。在“选项”对话框中的“Active Screen”选项卡上,单击“自定义级别”打开“自定义Active Screen 捕获设置”对话框。
    [选择“禁止Active Screen 捕获”选项。这将缩短录制时间。]


    运行时:1,在“快速模式”下运行测试。在“选项”对话框中的“运行”选项卡上,选择“快速”选项。这将指示QuickTest 运行测试而不为每个步骤显示执行箭头,从而加快测试运行速度。


    当保存一个新测试,或使用“另存为”用新名保存测试时,可以通过清除 “保存”或“另存为”对话框中的“保存Active Screen 文件”选项。如果已经完成了测试设计并且计划将测试只用于测试运行时,该操作尤其有用。没有Active Screen 文件的测试打开速度更快,并且使用的磁盘空间明显更少。

    确定希望何时为测试结果捕获并保存应用程序图像。在“选项”对话框中的“运行”选项卡上,从“将步骤屏幕捕获内容保存到结果中”框中选择一个选项。可以通过保存屏幕捕获内容(仅在某些情况下),或根本不保存图像来缩短测试运行时间和减少磁盘空间。

    提示:保存无Active Screen 文件的测试后,如果需要恢复Active Screen 文件,请重新录制必要的步骤或使用“更新运行”选项为测试中的所有步骤重新捕获屏幕。

  • 当应用程序发生更改时如何维护QTP测试脚本?

    2009-09-23 14:59:22



    应用程序发生更改时维护测试的方法取决于应用程序更改的程度。这就是应创建一个小测试组而不是为整个应用程序创建一个大测试的主要原因之一。当应用程序发生更改时,可以重新录制部分测试。如果更改不重要,可以手动编辑测试将其更新。

    还可以使用QuickTest 的操作功能设计更多模块和有效测试。进行录制时,可以基于功能将测试划分为多个操作。当应用程序发生更改时,可以重新录制特定操作,而无需更改其余测试。尽可能插入对可重用操作的调用,而不是在几个测试中创建相同的脚本。这样,对原始可重用操作的更改就自动应用到调用该操作的所有测试上。

    如果有很多包含相同测试对象的测试和操作,建议使用共享对象库,这样就可以在一个集中位置更新对象信息。

    要更新检查点、Active Screen 中的信息,或更新有关对象属性更改时测试对象属性的信息,或要在不重新录制步骤的情况下在Active Screen 中添加新的对象或步骤,请使用“更新运行”选项。

    完成录制测试后是否可以增加或减少Active Screen 信息?

    如果发现录制后保存在Active Screen 中的信息不能满足测试编辑需要,或者不再需要Active Screen 信息,并且要缩减测试的大小,有多种方法可以更改与测试一起保存的Active Screen 信息量。

    要减少测试使用的磁盘区间,可以通过选择“另存为”删除Active Screen 信息,并清除“保存Active Screen 文件”复选框。

    如果选择在测试Windows Applications 时不将所有信息保存在Active Screen 中,则可以使用多种方法之一增加Active Screen 中保存的信息。

    确认“选项”对话框中“Active Screen”选项卡上的Active Screen 捕获首选项已设置为捕获所需要的信息量,然后执行下列操作:

    执行“更新运行”操作,为所有现有步骤在Active Screen 中保存所需信息量。

    重新录制包含要添加到Active Screen 中的对象的步骤。

    要重新录制步骤,请选择要在其后录制步骤的步骤,放置应用程序以匹配测试中的选定位置,然后开始录制。或者,在测试中要在其前面添加步骤的步骤处放置一个断点,然后运行测试到断点。这将把应用程序放到正确的位置以便录制步骤。
  • QTP一些很有用的代码

    2009-09-23 10:45:03

    QTP中一些很有用的代码

    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("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 "Description=IBM_ODBC;DRIVER=SQL Server;SERVER=IBM;UID=sa;"&_
                     "WD=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_TESTWD=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=FFC=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("scripting.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("scripting,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 WScript.Shell的一些应用
    set WshShell =CreateObject("WScript.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=Description.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
  • QTP捕获鼠标右键

    2009-09-21 16:31:55

    VbWindow("frmLogin").VbEdit("txtUserID").Set "admin"

    VbWindow("frmLogin").VbButton("Login(L)").Click

    VbWindow("frmMain").WinMenu("Menu").Select "Template Manager(T)"

    VbWindow("frmMain").VbWindow("frmTemplates").WinListView("ListView20WndClass").Select(0), micRightBtn

    Dim wshShell

            Set wshShell=CreateObject("WScript.Shell")

            For  i=1 to 1

                    wshShell.SendKeys  "{DOWN}"

                   

     

            Next

            wait  1

            wshShell.SendKeys  "{ENTER}"

     

    VbWindow("frmMain_2").VbWindow("frmTemplates").VbWindow("FrmDocumentType").VbButton("Add(A)").Click

    VbWindow("frmMain_2").VbWindow("frmTemplates").VbWindow("FrmDocumentType").VbWindow("FrmInput").VbEdit("Text1").Set DataTable("DoucmentTypeName", dtGlobalSheet)

  • checkpoint的返回值

    2009-09-21 12:25:36

    代码是check checkpoint(),你需要在check后面加一个(),使代码变为check .(checkpoint())并且在整行的前面加上一个变量(变量无需提前定义)

    a = Browser("").Page("").Frame("reportFrame").Check (CheckPoint("列表"))

    这样检查点的返回值就可以被a记录下来,那么就可以通过判断a的值来确定检查点是否通过

251/212>
Open Toolbar