资源描述
,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,*,*,QTP脚本编写,1,QTP识别对象原理,QTP里的对象有两个概念,一个是Test Object(简称TO),一个是Runtime Object(简称RO),TO就是是仓库文件里定义的仓库对象,RO是被测试软件的实际对象,QTP识别对象,一般是要求先在对象仓库文件里定义仓库对象,里面存有实际对象的特征属性的值。,然后在运行的时候,QTP会根据脚本里的对象名字,在对象仓库里找到对应的仓库对象,,接着根据仓库对象的特征属性描述,在被测试软件里搜索找到相匹配的实际对象,最后就可以对实际对象进行操作了。,仓库对象TO一般在录制/编写脚本时加入仓库文件,它不仅可以在录制编写时进行修改,,也可以在运行过程中进行动态修改,以匹配实际对象。,和TO、RO相关的几个函数有:,GetTOProperty():取得仓库对象的某个属性的值,GetTOProperties():取得仓库对象的所有属性的值,SetTOProperty():设置仓库对象的某个属性的值,GetROProperty():取得实际对象的某个属性的值,2,QTP操作对象的原理,QTP为用户提供了两种操作对象的接口,一种就是对象的封装接口,另一种是对象的自身接口。,对象的自身接口是对象控件本身的接口,只要做过软件开发,使用过控件的人应该很清楚。,对象的封装接口是QTP为对象封装的另一层接口,它是QTP通过调用对象的自身接口来实现的。,两种接口的脚本书写格式的差别在于:,自身接口需要在对象名后面加object再加属性名或方法名,,封装接口就不用在对象名后面加object。,具体格式如下:,对实际对象的操作:,对象.object.自身属性,对象.object.自身方法(),对象.GetROProperty(封装属性),对象.封装方法(),对仓库对象的操作:,对象.GetTOProperty(封装属性),对象.GetTOProperties()获取所有封装属性的值,对象.SetTOProperty(封装属性,封装属性值),3,QTP获取文本框里的值的两个方法,1.使用用QTP自带的out值,Window(Windows Internet Explorer).WinObject(Internet Explorer_Server).Output CheckPoint(Internet Explorer_Server),然后调用:XXX.Set DataTable(“Internet Explorer_Server”,dtGlobalSheet),2.使用GetROProperty,把对象text的属性取出来。ButtonName=Browser(QA Home Page).Page(QA Home Page).WebButton(Submit).GetTOProperty(Name),例如获取文本Web文本框的运行时的值:,XXX.GetTOProperty(Value),4,QTP获得随机数的两个方法,1.qtp 提供的一个获取随机数的函数,取得 1 到 100 之间的一个数,x=RandomNumber(0,100),Msgbox x,2.使用 Randomize 函数来产生随机数,Randomize 用于初始化 Rnd 函数,的随机数产生器。,Dim MyValue,初始化随机数产生器,Randomize,MyValue=Int(10*Rnd+0),5,QTP读写本地Excel文件,Company:,chenhuaProduct:家校网Function:不同状态的家长和老师登陆查看是否有班级树Date:2010-01-29,arrRange=ReadFile(D:OfficialLoginTesting不同状态家长和老师登陆的班级树情况.xls,Sheet1),For j=2 to Ubound(arrRange)SystemUtil.Run C:Program FilesInternet Exploreriexplore.exe,wait(2)Browser(title:=南通家校网).Page(title:=南通家校网).WebEdit(html id:=passport).Set arrRange(j,2)Browser(title:=南通家校网).Page(title:=南通家校网).WebEdit(html id:=password).Set arrRange(j,3)Browser(南通家校网).Page(南通家校网).Output CheckPoint(南通家校网)Browser(title:=南通家校网).Page(title:=南通家校网).Webedit(html id:=proof_code).Set Trim(DataTable(验证码,dtGlobalSheet)Browser(title:=南通家校网).Page(title:=南通家校网).WebButton(value:=登录).Click,6,把下载的记录 写到 EXCEL 保存 Dim xlApp Dim xlBook Dim xlSheet Set xlApp=CreateObject(Excel.Application)创建EXCEL对象 Set xlBook=xlApp.Workbooks.Open(D:OfficialLoginTesting不同状态家长和老师登陆的班级树情况.xls)打开已经存在的EXCEL工件簿文件 xlApp.Visible=True 设置EXCEL对象可见(或不可见)Set xlSheet=xlBook.Worksheets(sheet1)设置活动工作表 xlsRowCount=xlSheet.UsedRange.Rows.Count xlsColumnCount=xlSheet.UsedRange.Columns.Count If(Browser(南通家校网).Page(南通家校网_2).Image(open).Check(CheckPoint(open)Then xlSheet.Cells(j,7)=P 给单元格(row,col)赋值xlSheet.Cells(j,8)=有班级树 给单元格(row,col)赋值 xlBook.Close(True)关闭工作簿 xlApp.Quit 结束EXCEL对象 Set xlApp=Nothing 释放xlApp对象,Else xlSheet.Cells(j,7)=F 给单元格(row,col)赋值 xlSheet.Cells(j,8)=没有班级树 给单元格(row,col)赋值 xlBook.Close(True)关闭工作簿 xlApp.Quit 结束EXCEL对象 Set xlApp=Nothing 释放xlApp对象 End If Browser(title:=南通家校网).CloseNext,7,输入:sFileName:Excel文件 sSheetName:表单名称 返回:包含Excel数据的数组Function ReadFile(sFileName,sSheetName)Dim oExcel Dim oSheet Dim oRange Dim arrRange On Error Resume Next 创建Excel应用程序对象 Set oExcel=CreateObject(Excel.Application)If err.Number 0 Then MsgBox 未能初始化Excel&vbCrLf&_ 请确保Excel已安装,vbCritical Exit Function End If On Error Goto 0 On Error Resume Next 打开Excel文件 oExcel.Workbooks.Open(sFileName)If err.Number 0 Then MsgBox 未能加载Excel文件&vbCrLf&_ 请确保Excel文件路径正确或格式正确,vbCritical Exit Function End If On Error Goto 0,8,获取表格的使用范围 Set oSheet=oExcel.Worksheets(sSheetName).UsedRange 获取从A列到F列,从第1行到第100行的范围i中的所有值(需要根据实际情况修改的)Set oRange=oSheet.Range(A1:C4)把Excel数据转换到数组 arrRange=oRange.Value 关闭工作簿 oExcel.WorkBooks.Item(1).Close 退出Excel oExcel.Quit Set oExcel=Nothing 返回包含Excel数据的数组 ReadFile=arrRangeEnd Function,9,得到随机的固定长度字符串,Function makeStr(inputlength),If IsNumeric(inputlength)Then,For i=1 To inputlength,把希望加入的字符放到数组中,A=Array(a,b,c,d,1,2,&,!,#,$,%,&,*),Randomize,x=RandomNumber(0,15),B=A(x),makestr=makestr+B,Next,置 返回 值,makeStr=makestr,Else,msgbox(错误的输入数据:&inputlength&,请输入正确的数值!),End If,End Function,MsgBox makeStr(5),10,判断字符串是否符合要求,Function ValidateStr(strPattern,strContent),Dim regEx,strTemp,Set regEx=New RegExp 建立正则表达式。,Dim blnMatche,regEx.IgnoreCase=true 设置是否区分字符大小写。,regEx.Global=True 设置全局可用性。,regEx.Pattern=strPattern 设置模式。,blnMatche=regEx.test(strContent),ValidateStr=blnMatche 置 返回值,Set regEx=Nothing,End Function,检查日期格式 为 YYYY-MM-DD 的正则表达式 验证 邮箱的是 A=w+(-+.w+)*w+(-.w+)*.w+(-.w+)*,A=(19|20)(02468048)|(1357926)-02-29)|(200-90-9)|(190-90-9)-(01-9)|(10-2)-(01-9)|(1d)|(20-8)|(013578)|(102)-31)|(01,3-9)|(10-2)-(29|30)$,B=2010-02-023,msgbox ValidateStr(A,B),11,使用本地数据源连接Oracle数据库1,使用数据源连接oracle数据库,Dim StrCon,Dim Res,Cmd,Set Res=CreateObject(ADODB.Recordset),Set Cmd=CreateObject(ADODB.Command),以下为建立连接,StrCon=Provider=MSDASQL.1;Password=xuexi6;Persist Security Info=True;User ID=community_xuexi6;Data Source=AURORA;Mode=Read;,Cmd.activeconnection=StrCon,Cmd.CommandType=1,以下为执行sql,根据实际情况替换之,Cmd.CommandText=select count(*)from spaces,Set Res=Cmd.Execute(),展示结果,Do while not Res.eof,Msgbox(Res(0),Res.MoveNext,Loop,以下为关闭数据库连接,Set Res=nothing,Set Cmd.activeconnection=nothing,Set Cmd=nothing,12,不使用本地数据源连接Oracle数据库2,Dim StrCon,Dim Res,Cmd,Set Res=CreateObject(ADODB.Recordset),Set Cmd=CreateObject(ADODB.Command),以下为建立连接,StrCon=Driver=Microsoft ODBC for Oracle;Server=AURORA;Uid=community_xuexi6;Pwd=xuexi6;,Cmd.activeconnection=StrCon,Cmd.CommandType=1,以下为执行sql,根据实际情况替换之,Cmd.CommandText=select count(*)from spaces,Set Res=Cmd.Execute(),展示结果,Do while not Res.eof,Msgbox(Res(0),Res.MoveNext,Loop,以下为关闭数据库连接,Set Res=nothing,Set Cmd.activeconnection=nothing,Set Cmd=nothing,13,QTP 为描述性编程自动创建注释,当希望在每一个新建action时都增加一些头部说明,比如作者、创建日期、说明等.,用action template 来实现最简单快捷。,方法:用记事本等文本编辑器,输入如下类似的内容:Company:,Author:Ailan Chen Product:,Function:Date:Date然后将文件保存为ActionTemplate.mst,并存放到QTP安装目录下的dat目录。,14,检查被测页面中对象是否存在,在手工编写脚本时,常常需要检查一下页面中某个个需要测试的对象是否存在,如果对象存在,用例被正常执行;否则应设置提示或报错退出或者报告测试结果。,检查文本框对象是否存在(通过查源文件找出该对象的name值),If Browser(“title:=南通家校网).Page(title:=南通家校网).WebEdit(html id:=passport“).Exist Then,MsgBox(“用户名输入框存在),Else,MsgBox(“用户名输入框不存在),End if,15,QTP中调用共享文件2个方法,1.利用ExecuteFile函数来调用.vbs文件,ExecuteFile(“F:test.vbs”)直接调用执行.vbs文件,2.利用QTP本地共享资源文件(可以调用*.sql;*.vbs;*.txt 三种后缀文件),Dim order,order=1,writeorderno order,Function writeorderno(orderno),Dim fso,myfile,Set fso=CreateObject(scripting.FileSystemObject),Set myfile=fso.openTextFile(D:qtp resourcesresult.txt,8,false),myfile.writeline orderno,myfile.close,End Function,16,QTP的几种同步等待方法,设置对象的默认等待时间。,QTP,识别对象时,会有一个默认的等待时间,可以在,File-Settings-Run-Object synchronization,中设置,默认时间是,20,秒,2.,使用,.Sync,方法,等待百度这个页面完全打开,才继续执行下面操作,Browser(“Browser”).Navigate,Browser(Browser).Page(,百度,).Sync,3.Wait,等待固定秒数,4.,同步点,QTP,脚本在执行过程中如果遇到同步点,则会暂停脚本的执行,直到对象的属性获取到了预先设定的值,才开始执行下一条脚本,后面单位是毫秒,例如:,Browser(,百度一下,你就知道,).Page(,百度一下,你就知道,).WebEdit(wd).WaitProperty visible,True,100000,5,编程实现,Do until Browser(,百度一下,你就知道,).Page(,百度一下,你就知道,).WebEdit(wd).Exist()Wait(1)Loop,17,QTP检查链接对象的2个方法,1.使用 CheckProperty 方法,Browser(Welcome:Mercury Tours).Page(Welcome:Mercury Tours).Link(REGISTER).CheckProperty(url,=Browser(Welcome:Mercury Tours).Page(Welcome:Mercury Tours).Link(REGISTER).Object.href,如果地址不正确,则报告错误,If NOT href=Then,Reporter.ReportEvent micFail,Link Error,href,ExitAction,End If,18,自动化测试获取和删除cookies的方法,1.,Set document=browser(“taobao”).page(“taobao”).object,a=document.cookie,document.cookie=”userId=828;expire=”+date.toGMTString();,2.qtp中的WebUtil,A=WebUtil.GetCookies(url)获取cookie,WebUtil.DeleteCookie(domain,cookies)删除cookie,Webutil.DeleteCookies,3.原始方法,录制IE清楚Cookies的步骤,19,单选框的几个方法,1.获取当前选择单选框的index 值,a.Browser(百度一下,你就知道).Page(百度用户注册).WebRadioGroup(sex).GetROProperty(selected item index),b.Browser(百度一下,你就知道).Page(百度用户注册).WebRadioGroup(sex).GetROProperty(value),2.获取单选框的长度(就是有几个选择项),Browser(百度一下,你就知道).Page(百度用户注册).WebRadioGroup(sex).GetROProperty(items count),3.获取单选框的所有值,Browser(百度一下,你就知道).Page(百度用户注册).WebRadioGroup(sex).GetROProperty(all items“),4.设置单选框的选择,Browser(百度一下,你就知道).Page(百度用户注册).WebRadioGroup(sex).Select 2,20,复选框的2个方法,1.,设置复选框选中,Browser(,百度一下,你就知道,).Page(,百度个人中心登录,).WebCheckBox(mem_pass).Set ON“,2.,选中某个页面上的所有复选框,Set MyDescription=Description.Create(),MyDescription(html tag).Value=INPUT,MyDescription(type).Value=checkbox,Set Checkboxes=Browser(“title:=,学习乐教育社区,”).Page(“title:=,学习乐 教育社区,).ChildObjects(MyDescription),NumOfChildObjs=Checkboxes.Count,For Counter=0 to NumOfChildObjs-1,Checkboxes(Counter).Set ON,Next,21,脚本回放出错跳过代码,在回放脚本的时候,有时因为错误导致运行的脚本中断,不能自动运行。On error resume next 遇到错误返回到脚本的下一行继续执行。On error goto 0 错误处理的控制权,平时是由QTP控制的(这个叫默认的),当有on error resume next 时,是交给on error处理,当on error goto 0 时,就换给QTP,22,Datetable简单操作方法,QTP自动生成的写法,其中,dtLocalSheet就是当前Action的DataTable,dtGlobalSheet就是Global的DataTable,Col是列名,DataTable(Col,dtLocalSheet),DataTable(Col,dtGlobalSheet),读取Action2的Col列。,DataTable(Col,Action2),读取Action2的第一列,不管第一列叫什么名字,都能读,DataTable(1,Action2),循环读取Action2的110列,For i=1 To 10,MsgBox DataTable(i,Action2),Next,表也可以用数字代替,读取第二个Action表的第一列,DataTable(1,2),使用DateTable的一个好处是可以跨Action使用数据,不过在一个Action里读取另外一个Action的列时要注意另外一个Action的当前行,比如你在Action1里读取Action2的某列,如果Action1运行到第二行,你读取的Action2还是第一行的数据,解决办法就是写上这句:,DataTable.GetSheet(Action2).SetCurrentRow(2),你也可以用GetCurrentRow来获取Action1的行,然后再用SetCurrentRow来保持两个Action的当前行一致:,CurrRow=DataTable.GetSheet(Action1).GetCurrentRow,DataTable.GetSheet(Action2).SetCurrentRow(CurrRow),23,Datetable操作方法进阶,假设现在有一个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文件中,24,关于时间的2个方法,1.获得当前时间,Dim currentTime,currentTime=Time,2.计算2时间差 datediff,Function TimeSpace(),datediff(d,起始日期,结束日期),其中d代表以天为单位,M以月为单位,H代表小时;now代表当前日期,a=datediff(H,now,2008-8-8),MsgBox(a),End Function,25,IE窗口的几个方法,1.打开,SystemUtil.Run“iexplore.exe”,关闭,SystemUtil.CloseProcessByName(“iexplore.exe”),3.重新导航,Browser(百度一下,你就知道).Navigate 方法,屏蔽鼠标键盘操作的方法,SystemUtil.BlockInput,SystemUtil.UnblockInput,26,QTP访问DOM,1.QTP支持直接访问DOM(Document Object Model),可以通过DOM来访问HTML标签,On Error Resume Next Set Doc=Browser(Google).Page(Google).Object 循环获取Page中的所有对象For Each Element In Doc.all TagName=Element.TagName 获取标签名 InnerText=Element.innerText 获取inner text.把信息写入测试结果 Reporter.ReportEvent 0,TagName,InnerText Next,27,Dictionary Object使用,1.在QTP中,可以把Dictionary 当成数组来用,而且可以随时添加数据,而不需要预先定义大小,Set Dic=CreateObject(Scripting.Dictionary)创建Dictionary对象,For Iterator=1 To 3 Step 1 ,添加,Dictionary的key和value,Dic.Add CStr(Iterator),Iterator&_Value,Next,For Iterator=1 To Dic.Count Step 1 循环,读取,Dictionary的key和value,Msgbox Dic.Item(CStr(Iterator),Next,DicArray=Dic.Items,For I=0 To Dic.Count,For I=0 To UBound(DicArray),Msgbox DicArray(I),Next,If Dic.Exists(2)Then 判断是否存在某个Key,如果存在,则把其,去掉,Msgbox Dic.Item(2),Dic.Remove(2),End If,Msgbox Dic.Count,清空,所有 Key和Value,Dic.RemoveAll(),Msgbox Dic.Count,28,测试输入框输入的最大允许字数1,Function checkMaxinput(myObject,maxSize),myObject.Click,wait(1),Setting.WebPackage(“passport”)=2 配置使用浏览器事件或鼠标运行鼠标操作的式 1-使用浏览器事件运行鼠标操作,2-使用鼠标运行鼠标操作。,Set obj=createobject(wscript.shell),i=0,old=a,xin=b,while oldxin,old=myObject.GetROProperty(value),i=i+1,obj.sendkeys“1“WshShell.SendKeys ENTER 模拟键盘进行操作,xin=myObject.GetROProperty(value),wend,If i-1=maxSize Then,checkMaxinput=true,else,checkMaxinput=false,End If,Setting.WebPackage(passport)=1,End Function,29,测试输入框输入的最大允许字数2,Set tempObject=Browser(学习乐教育社区).Page(学习乐教育社区).WebEdit(passport),If checkMaxinput(tempObject,20)eqv true Then,reporter.ReportEvent 0,学习乐注册,用户名输入框允许输入的最大字符功能正确,PASS,Else,reporter.ReportEvent 1,学习乐注册,用户名输入框允许输入的最大字符功能错误,FAIL,End if,30,添加附件,还没找到 好方法,31,其他,调试脚本1.脚本编写完毕,可以用按ctrl+f7来查看脚本是否有语法错误。,32,寄语,路还很长,Thanks,祝大家新年快乐!,Ailan Chen,江苏北极光科技有限公司,33,
展开阅读全文