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

发布新日志

  • sql 2005能安装在xp上吗

    2010-06-24 10:51:29

    SQL2005 分五个版本,如下所列,1.Enterprise(企业版),2.Development(开发版),3.Workgroup,(工作群版)4.Standard,(标准版)5.Express.(嗯,估且就叫它简易版吧)
    Enterprise版的数据库引擎只能安装在Win2003Server(或其他Server)。

    如果你想安装在WindowsXP Pro系统上,你应该安装SQL2005Development版(开发版)。

    因此,如果你是初学者,如果你只是想要在家里学习学习,如果你的环境是 WindowsXP Pro,那么,你应该选择的是 SQL2005Development(开发版),而不是SQL2005Enterprise(企业版)或SQL2005Express(简易版)。
  • 【转】关于 Sql Server 2005 和三核兼容性如何解决的方法

    2010-06-24 10:40:50

     
    2009-04-27 00:34

    我的 Sql Server 2005 是装在 VMWare 中的另外一个 Windows Server 2003 系统的,并且已经升级到 SP2,Sql Server 2005 SP2 支持三核,所以在我换三核之后,直接使用原来的虚拟机系统并没有遇到什么问题,但是网上很多人都安装不了,因为未升级之前的 Sql Server 2005 同样有类似 Sql Server 2000 SP4 的问题。我搜索了微软的知识库,找到了一篇文章,说该问题确实存在,而且不是存在于升级 Server Pack 的过程(如果只是不能升级 Server Pack,至少数据库还能启动),而是存在于安装 Sql Server 2005 本身,即是说,连安装都成问题了,谈何启动和升级。但是有个 Workaround,使用的方法此我前面的尝试方法之一类似,但是我的方法对 Sql Server 2000 SP4 无效,难道该方法对 2005 有效?不清楚,我没有尝试,因为我不需要重新安装。可是升级到 SP2 的 Sql Server 2005 能兼容三核 CPU 是事实,否则我的 Sql Server 2005 也已经出问题了。

    方法大致是这样:通过 msconfig 工具,在 boot.ini 的高级设置里将操作系统利用 CPU 核心的数量限制为 2 的次方。XP 里是 NUMPROC 选项,Vista、Server 2003 是处理器数量选项,比如 1、或者 2(就是不要 3 啦)。然后重新启动系统,安装 Sql Server 2005,这时安装过程可以顺利通过,然后暂时不要改回来,等安装完 SP2 之后,再用 msconfig 工具重新改回正常启动,这样就能正常使用了。我估计 Sql Server 2005 是通过操作系统间接获取 CPU 属性,因此才能使用这个方法,因为 Sql Server 2000 SP4 用这个方法无效。

    可以参照下面的图片,找到设置的地方。


    Vista 设置 CPU 核心数量

    XP 设置 CPU 核心数量

    恢复正常启动

  • 安装虚拟机时要注意的两点

    2010-06-24 09:27:30

    安装虚拟机前,设置虚拟机属性时,关于网络链接,要选择桥接,不能选NAT (默认是选中NAT的)

    安装完虚拟机后,要马上安装虚拟机的工具,这样就能平衡物理机与虚拟机间的性能了。

  • 如何解决 因不小心删了虚拟机的硬盘而导致无法打开虚拟的问题

    2010-06-21 16:35:11

    更改vmware虚拟系统设置时不小心删了它的硬盘,现在无法打开虚拟系统了。更改vmware虚拟系统设置时不小心删了它的硬盘,现在无法打开虚拟系统了。该怎么办呢?

     

    解决方法:

    虚拟机(VM)-设置(settings)-添加(add),选择硬盘(hard disk),选择使用已存在的虚拟磁盘(use an existing disk),找到你原来的硬盘文件(例如Windows Server 2008.vmdk)就可以了。

  • 打开TD首页(html页面)显示的是源码

    2010-06-21 15:32:15

    按照安装步骤安装完成之后,访问地址为

    http://futest(计算机明)/TDBIN/start_a.html

    这种情况下打开的页面内容是源码

    改为http://localhost/TDBIN/start_a.html后,页面显示就正常了。

  • 无法备份数据库,提示“无法备份全文目录,因为“全文检索”处于脱机状态

    2010-06-03 14:29:15

    这是因为在数据库中的全文目录没有联机。若要进行完整备份 SQL Server 2005 要求的所有数据库文件和联机数据库中的全文目录。

    全文目录可能是脱机的,因为一个或多个下列条件:
    • 全文目录文件夹被删除,或者已损坏。
    • 未启用数据库的全文本索引。
    • 从 Microsoft SQL Server 2000 数据库备份还原数据库。因此,在其中恢复数据库在服务器上不存在全文目录数据库中的文件夹。
    • 您所运行的 SQL Server 2005 实例已从 SQL Server 2000 升级。但是,全文搜索服务无法在升级过程中进行访问。
    • 在数据库连接中的某个位置。但是,您指定附件的过程中的全文目录文件夹的不正确的位置。

    注意在 SQL Server 2005 SP2,SQL Server 错误日志中记录的全文目录没有联机,原因。请参阅 SQL Server 错误日志,这种行为的特定原因。

    从第一个开始分析,全文目录没有被删除,不太清楚它是否损坏,就往下看了第二个原因:未启用数据库的全文本索引。

    我通过右键数据库,然后选择属性菜单,发现全文索引复选框未被选中,就选中了它,然后再备份数据库,就ok了。

     

     

     

  • 【转帖】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”的问题


     

  • [转载]LoadRunner思考时间与事务响应时间的区别与关系

    2010-04-16 10:02:08

    思考时间lr_think_time 就是一个事务要开始时思考的时间;比如,你要点击一个“登录按钮”,我们都要点击这个按钮要先思考下,就是人为脑袋思维的延迟,还有手指点击鼠标的这个动作的时间 一般是1-5秒,这就是思考时间,性能测试模拟思考时间就是模拟真实人为动作的方式来做压力测试。

      一般在脚本中思考时间是这样写比较合理,在一个事务的结束点另一个事务的起始点,两者中间定义思考时间。

      lr_end_transaction("登录", LR_AUTO);

      lr_think_time(3);

      lr_start_transaction("计算连接");

      正常情况下思考时间越短,对服务器的压力会越大。

      事务的响应时间就是指从客户端发起一个请求开始,到客户端接收到从服务器端返回的响应结束,这个过程所耗费的时间。

      响应时间= 网络响应时间+ 应用程序响应时间

      一般在测试结果分析时,要分析事务的响应时间,要过滤掉思考时间。

  • init,Action,end 虚拟用户的加载模式

    2010-04-07 11:53:34

     

    如果1套脚本设置15个用户模拟,那么就是15次init,run,end前提是你的场景设置为run until complite

  • 脚本vuser_init、Action、vuser_end中return不同的返回值有什么含义【转载】

    2010-04-07 11:36:43

    问题:
      在创建和录制脚本的时候,发现在脚本vuser_initActionvuser_end三部分,都会有一条“return 0;”语句,那么我们平时在编写脚本时如何应用return语句,return不同的返回值又有什么含义呢?
    问题解答:
    Return标识一个过程的结束,在LoadRunner 中用return 不同的返回值根据脚本不同的返回值,表示脚本的成功或者失败。“return + 大于等于零的数字 ;”表示成功,反之,则表示失败。
  • 转载[自动化测试一点思考]

    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}"”即可。

    先录制取得初始脚本,再做简单的修改和参数化,再进行封装形成可重用的函数,最后回放调试,形成了最终的脚本。
1274/7<1234567>
Open Toolbar