一位高人的QTP学习笔记


一个高人的QTP笔记供大家学习。


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


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(*) from oa_receivebumf where BUMFNAME='"&nn&"'"


//注释,sql语句,等于时sql语句


// sql="select count(*) from oa_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




第二部分


1、Datatable方法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")


   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)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理



9、数据库检查点模块:


sub database_check


set con=createobject("adodb.connection")


con.open "Description=IBM_ODBC;DRIVER=SQL Server;SERVER=IBM;UID=sa;"&_


"

一位高人的QTP学习笔记_Text

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_TEST

一位高人的QTP学习笔记_Text

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

一位高人的QTP学习笔记_Text

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




第三部分


15、Do 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)值,如Property为Value


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").Set DataTable("p_Text", dtGlobalSheet)


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



Browser("测试登录").Page("办公自动化系统").Frame("mainFrame_2").WebEdit("addressVO.unitTel").Set DataTable("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 in OraHome92};SERVER=HKORACLE;UID=USER22

一位高人的QTP学习笔记_Text

WD=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&"' and address='"&address&"' and unitTel='"&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("VB Script 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 为sheet的index


例如: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 the data sheet."



7:GlobalSheet Property方法


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导入sheet,index为1,sheet名称为:name



10:LocalSheet Property 方法


DataTable.LocalSheet


例子:DataTable.LocalSheet.AddParameter("Time", "5:45")



11:SetCurrentRow方法


DataTable.SetCurrentRow(RowNumber)


例子:DataTable.SetCurrentRow (2)


例子2:DataTable.SetCurrentRow (i)



12:SetNextRow方法


DataTable.SetNextRow


例子:


DataTable.SetNextRow



13:Value Property方法


1:DataTable.Value(ParameterID [, SheetID]) 或者 DataTable(ParameterID [, SheetID])


2:DataTable.Value(ParameterID [, SheetID])=NewValue


或者 DataTable(ParameterID [, SheetID]) =NewValue



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



例子2:DataTable("addressid", dtGlobalSheet)=Cstr(res(0))


'Cstr(res(0))为一变量,addressid为sheet一列名称




14:取datatable中某一行值


datatable.getsheet(“global”).getparameter("列名").valuebyrow(i)


如果想取第一行,就将i变为1



21、ReportEvent Method 方法


Reporter.ReportEvent EventStatus, ReportStepName, Details [, in]


'EventStatus状态:pass:0,失败:1,done:2,警告:3,


状态:0 or micPass,1 or micFail,2 or micDone,3 or micWarning:


ReportStepName为Name of the intended step in the report (object name)



例子1:


Reporter.ReportEvent micFail, "Custom Step", "The user-defined step failed."


例子2:


row = DataTable.GetCurrentRow



Reporter.ReportEvent 1, "Row Number", row



row为一变量




22、reusable action参数的传递方法1


注:action1和action2都是reusable action,在action3中调用action1和action2



1:action1中参数化,datatable参数名称为:p_Text,Global类型的


2:action2中,编写代码如下:


Dim name1


name1=DataTable.value("p_Text","Global")


Browser("测试登录").Page("办公自动化系统_2").Frame("mainFrame").Link("收文名称001").SetTOProperty "text",name1


//text为对象的属性


3:在action3中,直接调用action1和action2就可以。多个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)



我们不难发现在QTP的Action之间关系



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



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




24、关于datatable和Sheet例子


datatable.AddSheet("husheet") 'datatable添加一个sheet


datatable.ImportSheet "c:\test.xls","testsheet","husheet" '从外部导入一EXCEl为test.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