基础代码交流贴 (from others')

上一篇 / 下一篇  2011-02-18 10:20:59 / 个人分类:QTP


生 活和工作在这个技术性软件测试生活当中,周围所有人的都感染了我,自己都想去探讨去思想一些软件测试的工具,我开始学习QTP测试,大体的软件使用操 作流程是懂了,但具体实施起来特别是代码的组织及函数应用还有一些困难,因为自己只会vb没学习vbscript,所以想p和大家交流一下代码等一些基础 知识;呵呵,一起学习,加强记忆与应用。
1 生产随机数列

第一种方法 复制内容到剪贴板 代码: Randomize   '更新返回的数据(Initialize random-number generator)
Function rand(k)
n = Int((k-1)* Rnd +1)
rand = n
End Function

第二种方法 复制内容到剪贴板

1.  代码: 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)

5.1 向某一列的单元格赋值:  复制内容到剪贴板 代码: datatable.value("column_name",dtlocalsheet)="nanjing"

5.2 取得某一行具体值: 复制内容到剪贴板 代码: datatable.setcurrentrow(n)
      msgbox(datatable.getsheet("global").getparameter("column_name").Rawvalue)
      或者kk=datatable.Rawvalue("column_name","action1")

5.3 在run-time时,动态添加表格与数据 复制内容到剪贴板
      代码:kk=datatable.addsheet("sheet_name").addparameter            
               ("column_name","value").name;

6  .wintreeview一些操作 复制内容到剪贴板 代码: 选择一个条目: wintreeview.select(item)'根是0
      根的名称:wintreeview.getitem(0)

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

8 .  换行符 复制内容到剪贴板 代码: vbcr----chr(13)回车符// vblf----chr(10)换行符
    vbcrlf----chr(13)+chr(10)结合//type(chr(13)就相当于按了一上键盘上的enter

9 . Run from step有两种方式: 复制内容到剪贴板 代码: 在Keyword View模式会从本步骤运行到所有action结束
在expert view模式仅会将本action运行结束

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

11  对系统文件的操作 复制内容到剪贴板 代码:   11.1 从系统的文件中获取信息及删除文件
      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
11.2  获取文件夹里所有文件信息
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

12.   等待某个对象出现方法 复制内容到剪贴板 代码: y=......waitproperty("visible",true,10000)

13   防程序中断方法 复制内容到剪贴板 代码:  On error resume next
        On error goto handle

14  数组的应用:  复制内容到剪贴板 代码:  name=array(1,2,"aa","bb")
      name(2)="aa"

15 . 正则表达式应用模板 复制内容到剪贴板 代码: 进行日期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

16 .  返回一个字符串在另一字符串中的位置 复制内容到剪贴板 代码: instr(string1,string2)

17 .  有时回放出现找不到对象时,可能不是由于你的代码问题,而是由于你的操作系统等设置问题; 复制内容到剪贴板 代码:
       举例说明1:比如你录制一个选择磁盘中的文件动作

       会录制为:
      .winlistview("  ").drap 46,99
      .winlistview("  ").draponitem "she.mp3"
       下次录制的时候,如果你的系统文件改为不显示扩展名,下次执行的时候,QTP就找不到she.mp3,只能找到she;

       举例说明2:有时由于不同操作系统以及不同的ie,导致有些窗口不能识别,比如在2000下弹出的网页对话框的标题是:
       “web对话框",而在2003上是”网页对话框"

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

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

20. WScript.Shell的一些应用 复制内容到剪贴板 代码: set WshShell =CreateObject("WScript.Shell")
WshShell.SendKeys "{ENTER}"     '模拟键盘进行操作
WshShell.AppActivate "Calculator"             '启动应用程序

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

22.  FireEvent的使用
      可以对一个对象进行更复杂的操作 复制内容到剪贴板 代码: 如: FireEvent("onfocus")   '使一个控件获取焦点
       FireEvent("ondblclick")  '实现双击/也可以在事件设定中针对该对象事件响应  

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

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

25 .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

TAG:

 

评分:0

我来说两句

Open Toolbar