发布新日志

  • 关于QTP中保存时提示General Error while saving the test的解决方法

    2008-09-07 21:27:09

    今天使用qtp的时候突然发现保存的时候提示General Error while saving the test,

    以前从来没有见过这个毛病。

    我到网上查了下, 发现了篇讲述了如何解决这个问题。

    如果是win2000,运行如下命令RegSvr32 C:\WINNT\SYSTEM32\scrrun.dll
    如果是xp则运行RegSvr32 C:\WINDOWS\system32\scrrun.dll
  • QTP基础代码[收藏]

    2008-09-07 13:11:06

    这两周我开始学习QTP测试我们的web服务了;大体的软件使用操作流程是懂了,但具体实施起来特别是代码的组织及函数应用还有一些困难,因为自己只会vb没学习vbscrīpt,所以想和大家交流一下代码等一些基础知识;呵呵,一起学习,加强记忆与应用。

            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 "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;BA

            M=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

Open Toolbar