QTP脚本编写常用技巧

来源:互联网 发布:2841财神一码数据分析 编辑:程序博客网 时间:2024/05/16 05:01

 文章比较长,一共三部分:

1、连接数据库查询例子,无参数化
//
查询收文操作,通过数据库查询记录数是否正确
//1
、输出记录数值,例如78  2、获取输出的记录数值  3、连接数据库,查询记录数
4
、输出记录数值和从数据库中查询记录数值,相比较,相等则成功,不等则失败
Browser("
湛江信息化测试登录").Page("湛江东兴石油企业有限公司办公自动化系统").Frame("mainFrame").Output CheckPoint("78")
Dim mm
'mm=DataTable.GlobalSheet.GetParameter("mainFrameOutput_Text_out").Value  
//
注释,获取datatable值与DataTable("mainFrameOutput_Text_out",dtGlobalSheet)一致
mm=DataTable("mainFrameOutput_Text_out",dtGlobalSheet)
MsgBox mm
Dim res,cmd,sql
Set res=createobject("adodb.recordset")
Set cmd=createobject("adodb.command")
Cmd.activec
Cmd.CommandType = 1
sql="select count(*) from oa_receivebumf  where BUMFNAME
like '%收文测试%'"
'sql="select  count(*)  fromoa_receivebumf  where BUMFNAME='"&nn&"'"
//
注释,sql语句,等于时sql语句
// sql="select  count(*)  fromoa_receivebumf  where BUMFNAME like '%nn%'" //like
sql语句
Cmd.CommandText = sql
Set res = Cmd.Execute()
//msgbox res("name")

MsgBox res(0)
If   Cstr(res(0)) = Cstr(mm)Then
      Reporter.ReportEvent micPass, "test",  "
查询成功"     
  else
Reporter.ReportEvent micfail, "test",   "
查询失败"
End If
Set res = nothing
Set cmd.ActiveConnection = nothing
Set Cmd= nothing
2
、登记用户,查看是否登记成功
   //
登记用户,查询用户是否存在在数据库中
     1
参数化 2、取参数化值  3、查询语句中,赋值给查询条件
     4
、从数据库中查询出用户名,与参数化中值做比较
   
脚本如下:
Browser("
测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.name").Set DataTable("p_Text",dtGlobalSheet)
Dim xname
xname=DataTable("p_Text", dtGlobalSheet)
MsgBox  xname


Dim res,cmd,sql
Set res=createobject("adodb.recordset")
Set cmd=createobject("adodb.command")
Cmd.activec
Cmd.CommandType = 1
sql="select  name from address_list t where name ='
"&xname&"'"
Cmd.CommandText = sql
Set res = Cmd.Execute()
'msgbox res("name")
MsgBox res(0)
Set res = nothing
Set cmd.ActiveConnection = nothing
Set Cmd= nothing

 

 

第二部分

1Datatable方法GetRowCount
   DataTable.GetSheet("Action1").GetRowCount   //
获取总行数
  
使用如:
  CountNum=DataTable.GetSheet("Action1").GetRowCount

2
Datatable方法SetNextRow
   DataTable.GetSheet("Action1").SetNextRow    //
取得下一行
   datatable.setcurrentrow(n)   //
取得某一行

3
Datatable方法getcurrentrow   //获得当前行数
   
例如:datatable.getcurrentrow

4
、获取datatable
   4.1  DataTable("p_Text",dtLocalSheet)  //
取得datatable中参数名称为:p_Text的值
  4.2  DataTable.GlobalSheet.GetParameter("p_Text").Value  //
获取参数值方法和DataTable("p_Text", dtLocalSheet)一样
   
例如:xname为变量,dim xname
   xname=DataTable("p_Text", dtLocalSheet)
   xname=DataTable.GlobalSheet.GetParameter("p_Text").Value

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

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

6
、字符转换Cstr
   dim mm
   Cstr(mm)

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

8
、如果弹出对话框就获取上面提示信息并与表中的信息对比,不统一证明弹出的提示出错,主要用来验证
if browser("web_name").dialog("dialog_name").exist(1) then'
如果不出现=false
    error_message=browser("web_name").dialog("diaglog_name").static("
用户密码错误!".getRoproperty("text")
iferror_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)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理

9
、数据库检查点模块:
sub database_check
set con=createobject("adodb.connection")
con.open "Description=IBM_ODBC;DRIVER=SQLServer;SERVER=IBM;UID=sa;"&_
                "PWD=123456;APP=Quick TestPro;WSID=IBM;DATABASE=IBM_table"
'access
方式:con.open"DRIVER={Microsoft Access Driver (*.mdb)};DBQ=d:\test.mdb"
'Orocle
方式:con.open"DRIVER={Oracle inOraHome92};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

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

11
for方法1,参数化时选择:dtLocalSheet
Dim CountNum
CountNum=DataTable.GetSheet("Action1").GetRowCount
For i=0 to CountNum-1
----xunhuanti------
DataTable.GetSheet("Action1").SetNextRow    //
使用SetNextRow方法
Next

12
for方法2,参数化时选择:dtLocalSheet
dim countNum
countNum = DataTable.GetSheet("Action1").GetRowCount
For i=1 to countNum
DataTable.GetSheet("Action1").SetCurrentRow(i)  //
使用SetCurrentRow(i)方法
―――ddd―――
next
13
while方法1,参数化时选择:dtLocalSheet
Dim CountNum,i
i=1
CountNum=DataTable.GetSheet("Action1").GetRowCount
While i<=CountNum
------xuhuanti---
DataTable.GetSheet("Action1").SetNextRow
i = i+1
Wend

14
while方法2,参数化时选择:dtLocalSheet
Dim CountNum,i
i=1
CountNum=DataTable.GetSheet("Action1").GetRowCount
While i<=CountNum

DataTable.GetSheet("Action1").SetCurrentRow(i)
----xuhuanti---
i = i+1
Wend

 

 

第三部分

15Do while方法
Dim i,RowCount '
定义两个变量
i=0
RowCount=DataTable.GetSheet("Action1").GetRowCount '
设置RowCount等于Action1中的行数。
msgbox RowCount
Do while i<rowcount
i=i+1 '
第一次进入循环,执行这句后,i=1
'DataTable.GetSheet("Action1").SetCurrentRow(i)  
这句话被我注释掉了,正确的写法应该是下面这样,分开写。

datatable.getsheet("Action1")
datatable.setcurrentrow(i)

----xunhuanti----
loop

16
、取对象属性(Property)值

Dim usname
usname =Browser("
测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.name").GetRoProperty("Value")  '获取对象属性(Property)值,如PropertyValue
MsgBox usname

17
、取得要删除的id,并删除
'url
在查看该新增记录的信息页面对象中取得,所以录制的时候,登记,查看(修改),删除

Dim strUserid,id,strId

     id=Browser("
测试登录").Page("办公自动化系统").Frame("mainFrame_4").GetROProperty("url")'url这个属性值中存在我需要删除记录的ID信息
  strId=Mid (id,instr(60,id,"=")+1)  '
这一步是把需要的id值取了出来,例如:strId=Mid(id,instr(1,id,"=")+1)
     strUserid =strId  'strUserid
是我要删除的记录前的复选框属性值当中的ID信息
Browser("
测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("value:="&strUserid).Set"ON"这样就把想删除的记录选中了。
Browser("
测试登录").Page("办公自动化系统").Frame("mainFrame").WebButton("").Click'这样就删除掉啦,呵呵

17.2
通过数据库取得id值,并赋值进行删除

Browser("
测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.name").SetDataTable("p_Text", dtGlobalSheet)
Browser("
测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.address").SetDataTable("p_Text1", dtGlobalSheet)

Browser("
测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.unitTel").SetDataTable("p_Text2", dtGlobalSheet)

Dim xname,address,unitTel
xname=DataTable("p_Text", dtGlobalSheet)   '
datatable中取值
address=DataTable("p_Text1", dtGlobalSheet)
unitTel=DataTable("p_Text2", dtGlobalSheet)

Dim res,cmd,sql
Set res=createobject("adodb.recordset")
Set cmd=createobject("adodb.command")
Cmd.activeconnection="DRIVER={Oracle inOraHome92};SERVER=HKORACLE;UID=USER22;PWD=ZJLH;DBQ=HKORACLE;DBA=W;APA=T;EXC=F;XSM=Default;FEN=T;QTO=T;FRC=10;FDL=10;LOB=T;RST=T;BTD=F;BAM=IfAllSuccessful;NUM=NLS;DPM=F;MTS=T;MDI=Me;CSR=F;FWC=F;FBS=60000;TLO=O;"
Cmd.CommandType = 1
'sql="select  addressid from address_list t where name='"&xname&"'"
'sql="select  addressid from address_list t where name='"&xname&"'
sql="select  addressid from address_list t where name='"&xname&"' andaddress='"&address&"'  andunitTel='"&unitTel&"'"
Cmd.CommandText = sql
Set res = Cmd.Execute()

MsgBox res(0)  '
打印res(0)
DataTable("addressid", dtGlobalSheet)=Cstr(res(0))   '
输出值到datatable

Browser("
测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("value:="&res(0)).Set"ON"
Set res = nothing
Set cmd.ActiveConnection = nothing
Set Cmd= nothing


18
、赋值语句有:
1
Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("value:="&strUserid).Set"ON"
2
Browser("湛江信息化测试登录").Page("湛江东兴石油企业有限公司办公自动化系统").Frame("mainFrame").WebCheckBox("value:="&res(0)).Set"ON"
3
Browser("测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("IDS").SetTOProperty"value",Cstr(res(0)) 'Cstr为转换成小数方法
4: Browser("
测试登录").Page("办公自动化系统").Frame("mainFrame").WebCheckBox("IDS").SetTOProperty"value",strUserid

19
、取字符串方法:
1
instr方法
InStr([start, ]string1, string2[, compare])
这个函数需要的的参数是起始位置、主体字符串、要查找的字符串;Compare是可选参数。指定字符串比较。此compare参数是可以省略的,也可以是 0, 1 2
指定0(缺省)做二进制比较。指定1做不区分大小写的文本比较。例如我们要查找在字符串“abcdefg”中是否存在“cd”并返回其位置,则使用下面的语句就可以实现:

pos=InStr(1,"abcdefg","cd")
pos会返回3表示查找到并且位置为第三个字符开始。这就是查找的实现,而查找下一个功能的实现就是把当前位置作为起始位置继续查找。
或者:id=87444=ddddd
instr(1,id,"=")
,从位置为第一个字符起,查找=字符

2
mid方法
Mid(string, start[, length])
如:MyVar=Mid("VB Script is fun!", 4, 6)  'MyVar contains"Script".从第4位字符开始,后面6位字符
例如:MyVar2=Mid("VBScript is fun",4)  'MyVar contains "Script is fun!"
'
从第4位字符开始,后面的字符

3:Right
方法
Right(string, length)
例子:
Dim AnyString, MyStr
AnyString = "Hello World"      ' Define string.
MyStr = Right(AnyString, 1)    ' Returns "d".
MyStr = Right(AnyString, 6)    ' Returns " World".
MyStr = Right(AnyString, 20)   ' Returns "Hello World".


20
datatable方法
1
AddSheet方法
DataTable.AddSheet(SheetName)
如:Variable=DataTable.AddSheet("MySheet").AddParameter("Time", "8:00")
global中,添加sheet,并在sheet添加列和列值
2
DeleteSheet方法
DataTable.DeleteSheet SheetID
例如:DataTable.DeleteSheet"MySheet"
3
Export方法
DataTable.Export(FileName)
例如:DataTable.Export("C:\flights.xls")

4
ExportSheet方法
DataTable.ExportSheet(FileName, DTSheet)   'DTSheet
sheetindex
例如:DataTable.ExportSheet"C:\name.xls" ,1

5
GetCurrentRow
DataTable.GetCurrentRow
例子:row= DataTable.GetCurrentRow

Reporter.ReportEvent 1, "Row Number", row

6
GetRowCount
DataTable.GetRowCount
例子:
rowcount = DataTable.GetSheet("MySheet").GetRowCount

Reporter.ReportEvent 2, "There are " &rowcount, "rows in thedata sheet."

7
GlobalSheetProperty方法
DataTable.GlobalSheet
例如:DataTable.GlobalSheet.AddParameter"Time", "5:45"

8
Import方法
DataTable.Import(FileName)
例子:DataTable.Import("C:\flights.xls")

9
ImportSheet方法
DataTable.ImportSheet(FileName, SheetSource, SheetDest)
例子:
DataTable.ImportSheet "C:\name.xls" ,1 ,"name"
'
name.xls导入sheetindex1sheet名称为:name

10
LocalSheetProperty方法
DataTable.LocalSheet
例子:DataTable.LocalSheet.AddParameter("Time","5:45")

11
SetCurrentRow方法
DataTable.SetCurrentRow(RowNumber)
例子:DataTable.SetCurrentRow(2)
例子2DataTable.SetCurrentRow(i)

12
SetNextRow方法
DataTable.SetNextRow
例子:
DataTable.SetNextRow

13
ValueProperty方法
1
DataTable.Value(ParameterID[, SheetID])或者 DataTable(ParameterID [, SheetID])
2
DataTable.Value(ParameterID[, SheetID])=NewValue
或者DataTable(ParameterID [, SheetID]) =NewValue

例子1DataTable.Value("Destination", "ActionA")="New York"

例子2DataTable("addressid",dtGlobalSheet)=Cstr(res(0))
'Cstr(res(0))
为一变量,addressidsheet一列名称


14:
datatable中某一行值
datatable.getsheet(“global”).getparameter("
列名").valuebyrow(i)
如果想取第一行,就将i变为1

21
ReportEventMethod方法
Reporter.ReportEvent EventStatus, ReportStepName, Details [, in]
'EventStatus
状态:pass0,失败:1done:2,警告:3
状态:0or micPass1 or micFail2 or micDone3 or micWarning:
ReportStepName
Name of the intended step in the report (object name)

例子1
Reporter.ReportEvent micFail, "Custom Step", "The user-definedstep failed."
例子2
row = DataTable.GetCurrentRow

Reporter.ReportEvent 1, "Row Number", row

row
为一变量


22
reusableaction参数的传递方法1
注:action1action2都是reusableaction,在action3中调用action1action2

1
action1中参数化,datatable参数名称为:p_TextGlobal类型的
2
action2中,编写代码如下:
   Dim name1
   name1=DataTable.value("p_Text","Global")
   Browser("
测试登录").Page("办公自动化系统_2").Frame("mainFrame").Link("收文名称001").SetTOProperty"text",name1
//text
为对象的属性
3
:在action3中,直接调用action1action2就可以。多个reusable也类似这么做。


23
action 参数传递方法2(没有验证过)
不知道你是不是想把Action2的一些值传递给Action3
Action Param
既可以作输入也可以作输出,所以他们之间的参数传递是很简单的。
Action1里面只要实现如下代码就可以了:
RunAction "Action2", oneIteration, InputParamToAction2,OutputParamFromAction2
RunAction "Action3", oneIteration, OutputParamFromAction2
上面的变量OutputParamFromAction2就同时作为Action2的输出和Action3的输入。


23
action 参数传递方法3(没有验证过)
Action
级别的参数调用:

1
设置参数

Action  Properters >> Action Parameter

增加input的参数和output的参数

2
Action 1的脚本:

parameter("output")="Action1 Output"

msgbox("Action1 Input:"&parameter("input"))

msgbox("Action1 Output:"&parameter("output"))

3
Action 2 的脚本:

RunAction "Action1", oneIteration,"Action2 Input",action2

msgbox("Output in Action2:"&action2)

我们不难发现在QTPAction之间关系

作为被调用Action1,都是使用parameter("参数名")来使用的。

作为调用Action1Action2而言,input参数是可以往被调用Action1的操作输入的参数。Output的参数是从被调用的Action1返回的值。


24
、关于datatableSheet例子
datatable.AddSheet("husheet")       'datatable
添加一个sheet
datatable.ImportSheet"c:\test.xls","testsheet","husheet"  '
从外部导入一EXCEltest.xls

Dim i,RowCount '
定义两个变量
i=0
RowCount=datatable.GetSheet("husheet").GetRowCount '
设置RowCount等于51sheet中的行数。
msgbox RowCount
Do while i<rowcount
i=i+1 '
第一次进入循环,执行这句后,i=1
'datatable.getsheet("51sheet").setcurrentrow(i)  
这句话被我注释掉了,正确的写法应该是下面这样,分开写。

datatable.getsheet("husheet")     
datatable.setcurrentrow(i)

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

tempData=DataTable.GetSheet("husheet").GetParameter("Name").Value

                  
'
现在,我们调用msgbox看看下面得到的是什么值?每次循环都能得到每行的值,下次循环得到的是第二行
msgbox "GetParameter-Name:"&tempData '
这里弹出我们要看的值。
'
下面我们用另外一种方法来得到。
msgbox"GetParameter-i:"&DataTable.GetSheet("husheet").GetParameter(1).Value'
这里我用GetParameter(1)去得到sheet中第一列的值。
loop

 

0 0
原创粉丝点击