《精通QTP—自动化测试技术领航》

场景恢复Recovery Scenarios

设置场景恢复

Resources ——> Recovery Scenario Manager新增,具体参照向导设置;

在File ——> Settings ——> Recovery中进行添加,Activate recovery scenarios中应选择“On error”。

不能场景恢复的情况:

测试脚本中含有的对象不在对象库中;

VBScript脚本语言自身错误;

当MsgBox切断测试。

官方提供的场景恢复文件:安装目录\recovery\WebRecovery.qrs

Reporter函数 ReportEvent方法

语法:Reporter.ReportEvent 状态, 步骤名称, 详细说明, [截图路径] 


ReporterEvent后面必须跟一个空格,micPass对应数字0,micFail对应数字1,micDone对应数字2,micWarning对应数字3.

状态优先级从高到低排列:micFail>micWarning>micPass>micDone

与CheckProperty区别:

CheckProperty只有Pass和Fail两种状态,ReportEvent有四种;

CheckProperty检查属性,ReportEvent可检查各种代码逻辑;

CheckProperty的步骤名和详细说明是系统自动生成的,ReportEvent可自由编写;

ReportEvent可将截图写在测试报告中。

自定义验证点HTML模式脚本:

截图到测试报告中:

FileName3="E:\zlp\3.png"

Browser("个人空间管理").Page("个人空间管理").CaptureBitmap FileName3,True

IfROValue="123456"Then

Reporter.ReportEvent micPass,"第三步检验访问密码","验证实际输入访问密码是否与设定一致:成功",FileName3

Else

Reporter.ReportEvent micFail,"第三步检验访问密码","验证实际输入访问密码是否与设定一致:失败",FileName3

EndIf

Data Table

在QTP11.5版本中首先需要双击列名,输入数据表列名,默认列名是为空的。

语法:

     DataTable.Value(列名,Sheet名)

     或

     DataTable(列名,Sheet名),会自动出现代码提示所有当前(Local Sheet)Sheet下的列名。

注意:Sheet名区分大小写。

Global Sheet

     1. Global Sheet是一个全局变量,有几行数据(中间有行为空也会执行),程序就要回放几次,不用写循环语句;

     2. 若Global Sheet中有多行数据,即使没有使用该Sheet,有几行数据脚本就会执行几遍;

     3. 打开File—>Settings—>Run,设置Data Table iterations数据表迭代,Global Sheeet受该设置控制;


Local Sheet

1. Local Sheet是局部变量,且不受Data Table iterations数据表迭代,无论有多少行数据,都只运行一次;

     2. Local Sheet不能将值传递给另一个脚本或另一个Action。

     3. 下图的设置时针对Local Sheet下的测试数据。


区别:

Global Sheet执行所有行,是执行所有脚本,如有多个Action,则每个Action都会执行;

Local Sheet是只执行自身的Action多次;

如Global Sheet开启所有行,Action1开启所有行:则执行Global Sheet第一行,Action1执行所有行;Global Sheet 执行第二行,Action1执行所有行。

Object Identification对象识别

QTP自动化测试原理:

     (1)转化:封装真实被测对象并转化为QTP对象到对象库;

     (2)对比:对比对象库里的对象鉴别属性和与形式的真是被测对象的鉴别属性;

     (3)匹配:对比后若一致,则说明对象成功匹配并可继续对该真实被测对象进行后续操作,如果两者不一致则报错,提示为对象无法识别。

Object Identification对象识别:Tools—>Object Identification


     在Object Identification对话框中设置的属性,在对象库中可查看到。Mandatory Properties(强制属性)该区域设置的属性,在被测对象与对象库匹配时,只要有一个属性不一致就会报错。Assistive Properties(辅助属性),QTP默认所有的对象模型在这个区域都没有属性。

     QTP11.5版本中,在Object Identification中增加或删除Mandatory Properties,对已存在对象库中的对象属性是没有影响的,只有之后增加的对象属性才会有改变。

顺序标识符

Index索引- 指示该对象在应用程序代码中相对于其他描述都相同的其他对象的显示顺序,index顺序标识是从左到右进行的。

     1) 在"相同描述的对象"出现多个的情况下就一定有index,在一个对象现有"描述属性"已经能唯一标识一个对象的情况下,index是不会出现的。此时的index属性QTP里面标识为"none";

     2) index在对象是唯一的情况下,没有任何意义和价值;

     3)当index,CreationTime属性在对象库中为none的时候,不能使用SetTOProperty赋值index属性,赋值能够成功,但是无法使用赋值后index属性来正确识别对象;

     4)index属性是QTP自己标识的.和程序编程里的index无关,index属性的生成是按照相同对象出现的顺序来排列的,就是用ChildObjects方法获得的对象集合中item(i)索引的顺序;

     5) index属性我们只能尝试改变对象库中的,不能改变实际对象

Location位置- 指示该对象在父窗口、框架或对话框中相对于其他描述都相同的其他对象的显示顺序,location顺序标识是用上到下进行的。

CreationTime- 仅对浏览器对象生效,按对象产生时间先后顺序排列。

自动化测试介绍

1、概念

自动化测试是以程序测试程序,以代码体现思想,以脚本的运行代替手工测试的过程。

2、优势

快速、高效、可完成手工测试相当困难或无法完成的测试、可重复性等。

回归侧四更方便、可靠;

可运行更多、更繁琐的测试,且快速、高效;

可执行一些对于手工测试来说相当困难或根本做不到的测试;

更好地利用资源,使资源的使用更有价值;

具有一致性和可重复性的特点;

自动化定华测试脚本完全具有复用性;

使软件更有信任度;

多环境下测试。

3、不足

永远不能代替手工测试;

无法完全保证测试的正确性;

发现的bug远少于手工测试;

成本大。

4、适合项目(人力资源不考虑)

项目周期长,系统版本多;

需求变更不频繁;

测试对象可被自动化工具识别;

需反复测试的项目。

5、何时引入

项目只有在经历了完整的系统测试后才具备基本引入自动化测试的条件。

6、流程

可行性分析、测试需求分析(需要确定测试覆盖率以及自动化测试粒度,测试用例的筛选)、制定测试计划(时间人员安排等)、设计(框架、用例)、脚本开发、执行(环境搭建、执行脚本)、提交测试产物、脚本维护。

说明:自动化测试需要回归原点,即执行完的场景需要恢复到执行前的初始状态,否则会出现第一次脚本执行正确,第二次报错的情况。

场景恢复:自定义函数RecoveryFunction

场景恢复自定义行数RecoveryFunction,该函数在帮助文档中未说明。

使用该函数的例子:

打开Recovery Scenario Manager,新建一个场景恢复文件;

选择Test run error,如下图,下一步后选择any error;


选择Function call自定义场景恢复函数;

选择一个空文件,如为Recovery.txt ,输入函数内容:

选择Stop the test run,并输入场景名称,完成该场景恢复的设置。

RecoveryFunction1函数有四个参数Object, Method, Arguments, retVal。

Object:自动映射当前错误的QTP封装测试对象,输入对象库中的LogicName;

Method:输入测试对象的方法;

Arguments:自动映射当前错误的所有参数,Arguments是一个数组,使用join连接数组;

retVal:自动映射当前错误的具体错误信息,retVal是Long类型,必须使用DescribeResult方法进行转化。

Function RecoveryFunction1(Object, Method, Arguments, retVal)

print Object.GetTOProperty("testobjName")

print Method

print join(Arguments,"")

print DescribeResult (Result)

End Function

自动化模型对象AOM

AOM:Automation Object Model。

     VB、C#和JavaScript语言都能调用AOM来自动调用QTP,QTP安装程序中已经注册了一个核心DLL文件的COM(二进制可执行程序),位于安装文件夹BIN目录下的QTObjectModel.dll。

以下为在VBSEdit工具中引用QTObjectModel.dll:

打开VBSEdit,Tools ——> References ——>Add;


引用完后,创建AOM对象,就会有相应的代码提示。

以下为启动到关闭QTP的脚本

'创建AOM对象

Setqtapp=CreateObject("Quicktest.Application")

'启动QTP

qtapp.Launch

'设置为可见

qtapp.Visible=True

'新建一个test脚本

qtapp.New

'为Action1设置执行脚本为msgbox 0

qtapp.Test.Actions("Action1").SetScript"msgbox 0"

'执行测试脚本

qtapp.Test.Run

'退出QTP,关闭

qtapp.Quit

'释放对象

Setqtapp=nothing

执行以上代码时,系统中会出现一个QTAutomationAgent.exe的进程,代码执行完后自动关闭。但挡在调试代码或做非法终止以上代码的行为而最终未能将代码执行到完毕的话,此进程不会自动关闭,这样会导致第二次创建AOM对象报错“远程过程调用失败”(我未遇到),需要手动关闭该进程。

注意:在QTP中直接创建AOM对象是会报错的,当开启一个QTP后不能再开启另一个,报错如下图:


可使用 Setqtapp=GetObject("","Quicktest.Application"),实际没必要这样操作。

保留对象Utility Objects

保留对象:就是QTP本身预留的一些可用对象,打开QTP这些对象就会实例化,即为对象开辟内存空间。

Crypt:加密模块保留对象

Crypt.Encrypt("需要加密的字符串")  相当于QTP的Password Encoder工具功能。

Desktop:桌面保留对象

桌面截屏desktop.CaptureBitmap “文件名”,true or False(默认为False,表示若文件存在不覆盖)

MercuryTimes:计时保留对象

PathFinder:路径保留对象

PathFinder.Locate("需要查找的文件名"),要在Tools ——> Options ——> GUI testing ——> Folders中设置查找的路径,获取到的是完整的绝对路径。

RandomNumber:随机数保留对象

RandomNumber.Value(开始数字,结束数字),开始数字<=结束数字,且包含了开始和结束数字,急闭区间。

隐藏保留对象:在帮助文档和Complete word中都找不到,隐藏在注册表中,HKEY_CURRENT_USER ——> Software ——> Mercury Interactive ——> QuickTest Professional ——> MicTest ——> ReservedObjects

环境变量 Environment Variables

QTP默认环境变量位置:File ——> Settings ——> Environment,变量类型为Bulit-in,即内置变量。

Valid only during the test run:表示只有在脚本运行的时候QTP才能知道的动态变量。

部分默认环境变量说明:

          ActionIteration:返回当前运行的Action跌倒的数据行号(指中当前Action的Datatable 数据表中的行号)。

          TestIteration:返回当前运行的测试迭代的数据行号(指Global Datatable中的行号)。

环境变量常见使用:

     截图命名可为:TestName+ActionName+Time+自定义ID

     截图放置的路径可为:TestDir,返回当前测试的绝对路径,不包括最后的“\”

动态获取环境变量使用Environment对象,该对象包含三个方法:ExternalFileName、LoadFromFile和Value。

Value

     一是获取环境变量的值:

如 environment.Value("ActionName")

     二是为环境变量赋新值:在自定义环境变量时使用。


    2.LoadFromFile:动态加载自定义环境变量, environment.LoadFromFile “文件路径”。

     手动加载自定义环境变量 的方法:File ——> Settings ——> Environment,选择User-defined。

3.ExternalFileName:返回加载外部环境变量文件的路径名称, environment.ExternalFileName 


函数资源库Library Files

资源池静态调用

1、首先创建了一个test.txt文件,写入函数;

2、在QTP中选择File ——> Settings ——> Resources项,将test.txt添加进资源池,弹出的对话框为选择绝对路径还是相对路径;

3、使用步骤生成器F7(Design ——>Step Generator)选择Functions,Library functions并选择函数即可;

4、或者使用complete word,快捷键ctrl+space;

5、以上是把函数写在txt文件中,也可以在QTP中File ——> New ——> Function Library中编写。

动态调用

1、语法: executefile "文件的路径(支持相对路径)"

加载多个库文件

假设test.vbs中存在多个动态调用的语句,在Resource中手动加载这个文件,就可以达到加载多个库文件的作用。

调用QC中的函数库操作类似,只是路径不同,若有两人及以上同时打开同一份函数资源文件,只有先打开的那位有修改的资格,后一位需要等前一位退出编辑并等待一个缓存时间后,才能进行修改。

QTP11.5破解

来源网址: http://www.cnblogs.com/juddhu/archive/2012/01/18/2325795.html

http://www.cnblogs.com/juddhu/archive/2012/01/18/2325795.html

1、删除C:\ProgramData\SafeNet Sentinel目录;

2、F:\Program Files\HP\Unified Functional Testing\bin 执行instdemo.exe。


封装对象在注册表中的位置

     下图中使用GetROProperty获取Class Name,输出结果为空,GetROProperty("micClass")输出结果为WebEdit,原因可查看QTP封装属性的注册表位置,运行regedit打开注册表,进入如下位置:

HKEY_CURRENT_USER —> Software —> Mercury Interactive —> QuickTest Professional —> MicTest —> Attributes

即可看到所有QTP封装的属性


比较日期方法

来源网址: http://www.cydtest.com/?p=1528

Date:输入日期格式为 2015-5-29

需要比较的日期为:2015年05月29日

方法一:

Dday=split(date,"-")

Iflen(Dday(1))=1Then      '或与10比较,如Dday(1)<10

       Dmonth="0"&Dday(1)

ElseDmonth=Dday(1)

EndIf

Iflen(Dday(2))=1Then

       Ddate="0"&Dday(2)

ElseDdate=Dday(2)

EndIf

myDate=Dday(0)&"年"&Dmonth&"月"&Ddate&"日"

方法二:

myDate=year(now)&"年"&string(2-len(month(now)),"0")&month(now)&"月"&string(2-len(day(now)),"0")&day(now)&"日"

string(number,character)返回number个character,返回N个字符,若character为字符串,则返回N个字符串的第一个字符。

方法三:

myDate =year(date) &right("0" &month(date),2) &right("0" &day(date),2)

VBS常用字符串函数

1. Date函数

    语法:Data,返回当前系统日期。

2. Now函数

     语法:Now,返回当前系统日期时间。

3. DateDiff函数

     语法:DateDiff(interval时间单位,date1,date2),返回两个日期之间的间隔。

4. Left函数

     语法:Left(string,length),从最左边返回指定数量的字符串,若length为0,则返回"",若length大于等等于string总长度,则返回整个字符串。

5. Right函数

     语法:Right(string,length),返回字符串最右边指定数量的字符串。

6. Len函数

     语法:Len(String),返回字符串的长度,即字符数量。

7. Mid函数

     语法:Mid(string,start[,length]),从字符串返回指定位置指定长度的字符串

8. Split函数

     语法:Split(expression[,delimiter[,count[,compare]]])

Split(要拆分的字符串[,拆分元素(拆分后被去掉)[,返回的拆分字符串数量(-1表示返回所有,若为2则返回2个子字符串)[,默认为0是二进制比较,1是文本比较]]])

在指定的分隔符参数出现的所有位置断开字符串,将其拆分为子字符串,然后以数组的形式返回子字符串。

     如:myarray=split("xunbodaxunshangx123asd","x",-1,0)

            结果:myarray(0)到myarray(3)分别为   空字符串“”,unboda,unshang 和 123asd

9. LTrim,Rtrim与Trim函数

     语法:LTrim(string),返回不带前导空格(LTrim),后续空改(Rtrim)或所有空格(Trim)的字符串副本。

10. Replace函数

     语法:Replace(expression,find,replacewith[,compare[,count[,start]]])

Replace(原始字符串,被搜索的子字符串,用于替换的字符串[,(默认为0二进制比较,1为文本比较)[,(执行替换的数量,默认为-1,进行所有替换)[,(开始搜索子字符串的位置,默认为1.再喝count关联时必须使用)]]])

如: mystring =replace("qweasdqw","q","11")   mystring为  11weasd11w

11. Instr函数

     语法:InStr([start, ]string1, string2[, compare]) 在字符串1中查找字符串2,并返回位置。

     InStr([开始查找的位置, ]字符串1, 要查找的字符串2[, compare]) ,找不到返回0。

     例子:

SearchString ="XXpXXpXXPXXP"' String to search in.

SearchChar ="P1"' Search for "P".

MyPos =Instr(4, SearchString, SearchChar,1)' A textual comparison starting at position 4. Returns 6.

MyPos =Instr(1, SearchString, SearchChar,0)' A binary comparison starting at position 1. Returns 9.  

12.String

     语法:string(number,character)返回number个character,返回N个字符,若character为字符串,则返回N个字符串的第一个字符。



Web控件

Browser & Page

Navigate方法:在浏览器中打开一个特定的网址;

Sync方法:等待浏览器完成当前的页面的工作;

CaptureBitmap:object.CaptureBitmap FullFileName, [OverrideExisting],图片格式只能是.png或.bmp,OverrideExisting默认为False,设置为True表示覆盖同路径下相同名称文件;

FullScreen:将浏览器全屏。

WebTable

ColumnCount(Row)取列数,必须要加行号;

RowCount取行数;

GetCellData获取指定单元格(行,列)的值;

ChildItem:虚拟一个对象,使它成为WebTable的一个子对象。语法:object.ChildItem (Row, Column, MicClass, Index)

object.ChildItem (表格的行号, 虚拟对象的列, 要虚拟的对象控件类名, 一般填0)

Data Table实用方法

1. 动态增加新列并赋值,脚本运行完则恢复原样

DataTable.GlobalSheet / LocalSheet .AddParameter"列名","值"

2. 动态增加新行并赋值,需要先设置列名

'设置Global sheet中新增为第几行

DataTable.GetSheet("Global/Action1").SetCurrentRow(5)

     '给“列名”列第5行赋值为Row5

DataTable("列名","Global/ Action1")="Row5"

或者

     只适用于Local Sheet,还是需要第一个语句,要不然不管设置第几行都会是给第一行赋值

     DataTable.GetSheet("Action1").SetCurrentRow(5)

'给第N列第5行赋值为Row5

DataTable.Value("第几列",5)="Row5"

3. 动态获取DataTable中指定列的值,获取的是Global Sheet中该列的所有值,Action1为该列第一行的值。

获取列值 = DataTable("列名","Global/Action1")

   或

获取列值 = DataTable(1(表示第一列),"Global/Action1")

4. 动态获取DataTable中指定行的值

获取某列某行值=DataTable.GetSheet("Global/Action1").GetParameter("列名").ValueByRow(行数)

5. 动态获取当前行好设置当前行

     GetCurrentRow  

     SetCurrentRow()

6. 获取Data Table总行数

DataTable.GetSheet("Global/Action1").GetRowCount

7. 将Excel中内容导入Sheet中,不能打开xlsx的文件,可不用修改列名,默认Excel中第一行为列名

   DataTable.Import(FileName) 

DataTable.ImportSheet(FileName, Excel中第一个Sheet(Sheet名或数字), "Global/Action1")

SendKeys命令

该命令的作用是模拟键盘操作,将一个或多个按键指令发送到指定的Windows窗口来控制应用程序,是WshShell对象的方法。

例子:SetWshShell =CreateObject("WScript.Shell")

WshShell.SendKeys"Happy Birthday!"

特殊功能键说明:

Shift:+

Ctrl : ^

Alt  :%

+号:{+}

回车:{ENTER}

向下:{DOWN}

Space:“ ”双引号内输入空格

F1:{F1}

发送多个相同的字符:{按键 数字},如{qwe 5}表示输入5个qwe

WScript.WshShell对象

     WScript对象

WScript对象是Windows脚本宿主对象模型层次结构的根对象。它不需要在调用其属性和方法之前进行实例化,并且始终可在任何脚本文件中使用。

     WScript对象允许:

     创建对象;

     连接对象;

     与对象断开连接;

     同步事件;

     一编程方式停止脚本执行;

     将信息输出到默认输出设备(Windows对话框或命令控制台)。

WScript.WshShell对象

     WshShell对象可以运行程序、操作注册表、创建快捷方式、访问系统文件夹、管理环境变量。

AppActivate 激活一个应用程序窗口。

CreateShortcut 创建并返回 WshShortcut 对象。

Exec 在子命令窗口中运行一个应用程序,提供访问StdIn/StdOut/StdErr流。

ExpandEnvironmentStrings 扩展 PROCESS 环境变量并返回结果字符串。

LogEvent 添加一个事件到日志文件。

Popup 显示包含指定消息的消息窗口。

RegDelete 从注册表中删除指定的键或值。

RegRead 从注册表中返回指定的键或值。

RegWrite 在注册表中设置指定的键或值。

Run 创建新的进程,该进程用指定的窗口样式执行指定的命令。

SendKeys 发送一个或多个按键到活动窗口。

具体见百度百科:

http://baike.baidu.com/link?url=YSylKSEg-DC3uSQ0D6qUOA9GMi8XOdIq-LAheE42D0CO1gorCZCQwoozX7PW6L2871RWkb-TUFxfeTCSc8pV5K

函数指针GetRef方法

GetRef:指向在指定事件发生时要执行的过程的地址。

例子:

Dimoutput

     Functionout(string)

msgboxstring

     EndFunction

     'output指针指向out函数地址

     Setoutput=GetRef("out")

     'output具有了out函数的功能

     Calloutput("Success!")

VBS错误处理(未完)

1)On Error Resume Next,在脚本开头添加该语句,告诉VBS在运行时跳过发生错误的语句。这样一旦发生错误,该语句将会把相关的错误号、错误描述和相关源代码压入错误堆栈。

2)VBS的err对象

VBS条件和循环语句

条件语句If......Then和Select Case

If条件Then

    处理语句

ElseIf条件Then

    处理语句

Else

EndIf

SelectCase变量

Case条件值

    处理语句

Caseelse

    处理语句

EndSelect

注意:在执行字符串比较时,需注意大小写,可使用lCase或uCase将字符串装换成小写或大写。

循环控制语句

For......Next循环 可使用Exit For来退出循环;

          Do......While 和 Do......Until循环 可使用Exit do来退出循环;

          While循环。

VBS基础知识

1. 定义变量 —— Dim

   VBS语法不会很严谨,可以不申明变量直接使用。变量、方法、函数和对象的引用是不区分大小写的,申明多个同类型变量,可用逗号分隔。不允许在申明变量时给变量赋值。允许在一行代码内同时对两个变量进行赋值,中间用冒号分隔。

2. 显示申明 —— Option Explicit  

     强制所有变量必须先申明才能使用。

3. 注释

     单引号后的内容都被解释为注释。

4. VBS在定义时只有一种变量类型,在实际使用中需要使用类型转换函数来转变成相应的变量类型。

     Cbool转布尔值;

     Cbyte转换为0~255的整数;

     Ccur、Cdbl、Csng都是转浮点型;

     Cdate转换为日期值;

     Cint和Clng转换为整数;

     Cstr转换为字符串。

5. 数组

   数组的定义只需要在变量后描述这个数组的个数和维数,定义时下标是从1开始,而在访问时下标是从0开始。

定义数组: Dim array(10), 可不知道个数和维数申明动态数组 Dim array(),可使用ReDim来改变数组,在改变数组的大小时,数组的数据会被破坏,使用关键字preserve来保护数据,如ReDimpreservearray(1个数,2维数)。

6.操作符

     乘方使用^,取模使用Mod,不等于使用<>

     逻辑运算符:和—>and,非—>not,或—>or

     &用来连接字符串;Is用来比较对象,同一类型结果为真,反之为假。

CheckProperty方法

语法:对象.CheckProperty("属性名",“预期属性值”,[“延时”])

用于检查真实对象的属性与期望的属性是否一致

Call Action的3种方式


Call to Existing Action调用现有操作


选择At the end of the test测试结束时,被调用的Action是当前Test的一个Action;若选择After the current step,被调用的Action属于当前Action的一个步骤,及成为当前Action的一个子Action,出现一行代码:RunAction"Action1 [DataTable参数化]", oneIteration(进行一次迭代)。

     在调用外部Action后,QTP会自动添加该Action的Sheet,只读。

     调用外部脚本的根本原因是便于维护,只要修改调用的脚本,其他调用改脚本的地方都会相应的修改掉。

Call to New Action调用新操作

     可新建1级Action或基于1级Action新建2级、3级的Action。

Call to Copy of Action调用操作副本

     复制Action,把外部Action的对象库和代码都复制过来。


Action的重用操作

     在下图Action Properties中需要勾选Reusable action可重用操作,脚本才能被共享和调用。


非重用型:只能被存储它的Test调用,且只能被调用一次;

重用型:咳哟多次被存储它的Test或别的Test调用;

外部型:一个存储在别的Test中的可重用型Action,只能在调用它的Test中只读。

Test Data Table 和 Run-time Data Table

Test Data Table —— 在Data Table中事先准备好的固定的测试数据,是一组静态数据,是人为事先填写进去的;

Run-time Data Table —— 在QTP执行过程中,将测试数据填写到Data Table中,运行结束,测试数据就消失,但可在测试报告中看到。如下代码将“test”传入Global Sheet的A列中:

               DataTable.Value("A","Global")="test"

同界面有多个相同控件

场景:界面上有很多相同类型的控件,需要做检查,如对多个button进行点击操作,全都添加进对象库也是工作量比较大的。

方法一:使用SetTOProperty,如下列子中(百度首页)添加“新闻”的链接按钮到对象库中,之后使用SetTOProperty 可对其他链接按钮进行click操作。

Browser("百度一下,你就知道_2").Page("百度一下,你就知道").Link("新闻").SetTOProperty"text","地图"

Browser("百度一下,你就知道_2").Page("百度一下,你就知道").Link("新闻").Click

Browser("百度一下,你就知道_2").Page("百度一下,你就知道").Link("新闻").SetTOProperty"text","视频"

Browser("百度一下,你就知道_2").Page("百度一下,你就知道").Link("新闻").Click

方法二:使用SetTOProperty,设置index方法

     获取同类型对象的数量

     SetTOProperty "index",i

关于index可参考 Object Indectification对象识别

方法三:使用描述性编程

     如父对象.Link("name:=XXX").Click

如有多个浏览器窗口可使用Browser("CreationTime:=[0,1]")

Browser("CreationTime:=1")表明当前有且仅有一个浏览器窗口。

方法四:描述性编程

     给注册百度账号界面上的所有文本框中输入数字“123”

'创建描述性编程对象

Setalledit=description.Create

'对象类型为WebEdit

alledit("micClass").value="WebEdit"

'获取父对象下所有的WebEdit子对象

SetallChild=Browser("注册百度帐号").Page("注册百度帐号").ChildObjects(alledit)

'allChild.count为WebEdit对象的数量

Fori =0ToallChild.count-1

'Item(i)中i为对象的index

Setedit=allChild.Item(i)

edit.set"123"

Next

'释放所有设置的对象

Setalledit=nothing

SetChildnum=nothing

Setedit=nothing

意思如下:

Browser("注册百度帐号").Page("注册百度帐号").webedit("index:=0").Set"123"

Browser("注册百度帐号").Page("注册百度帐号").webedit("index:=1").Set"123"

或者

Fori =0To1

Browser("注册百度帐号").Page("注册百度帐号").webedit("index:="&i).Set"234"

Next

对象库编程与描述性编程比较

对象库编程特点:

可通过Complete Word,步骤生成器等方式高效编程;

脚本中引用同一个对象多次,修改对象名字,只需要在对象库中对对象进行更名即可,脚本会自动更新;

有关于对象库的各种工具。

描述性编程特点:

不用维护对象库;

可完成一些特殊需求;

没有Complete Word,易打错字。

描述性编程的两种写法

若对象没有添加到对象库中,这个时候使用对象库编程已无法实现,可使用描述性编程的方法。描述性编程是通过代码中描述每个对象的属性和属性值来识别对象,描述性编程可描述的属性都是封装接口的属性。

形式一:对象名(“属性名:=属性值”)

如: Browser("micClass:=Browser").page("micClass:=Page").WebEdit("name:=wd").set "test"

描述多个属性使用逗号隔开

如: Browser("micClass:=Browser").page("micClass:=Page").WebEdit("name:=wd","html tag:=INPUT").set "test"

注意:若父对象描述了,子对象一定要描述。子对象描述,父对象不描述,前提是父对象在对象库中。

形式二:使用Description对象

     使用Description对象可返回包含一组Property对象的Properties集合对象,Property对象由属性名和值组成。其实就是将对象的属性和属性值的描述封装在一个特殊的Description对象中。

如:

SetObjBrowser=Description.Create()

ObjBrowser("micClass").value="Browser"

SetObjPage=Description.Create()

ObjPage("micClass").value="Page"

SetObjWebEdit=Description.Create()

ObjWebEdit("html tag").value="INPUT"

ObjWebEdit("name").value="wd"

Browser(ObjBrowser).Page(ObjPage).WebEdit(ObjWebEdit).Set"test"

'释放对象

SetObjBrowser=nothing

SetObjPage=nothing

SetObjWebEdit=nothing

QTP11.5的四种录制方式

正常录制模式Standard Windows recording :默认的录制模式。

模拟录制模式Analog Recording:此模式录制所有键盘和鼠标的精确操作,模拟录制模式录制下来的脚本文件比较大,且不可由QTP进行编辑,回放时改变了屏蔽分辨率或窗口/屏幕位置回放就会失败。前提是开启正常录制模式。有相对于指定窗口和相对于屏幕录制

低级录制模式Low Level Recording:录制鼠标和键盘的所有操作,对对象的位置要求非常严格,录制的对象都以Windows和WinObject形式存在,按照屏幕上的x坐标和y坐标录制对象。

洞察录制模式Insight recording:根据保存的截图来识别对象。

常见的对象无法识别的处理方法(未完)

解决方法:

     1)设置虚拟对象,不方便以后维护,工具—>虚拟对象;

     2)使用相对坐标配合WSH定位对象;

     3)使用DOM组件接口应用技术,只可用于Web项目

P132页,PDF是145


封装属性与自身接口属性

封装接口是对象的不完全属性,有些对象的属性值是封装接口无法获取到的;

运行时对象RO可看见自身接口的所有属性,而对象库中的测试对象TO只可看见被封装的接口;

封装属性是不能修改实际运行时的对象的,只能获取属性的值,而调用自身接口可以;

封装属性是支持TO和RO,自身接口只支持RO。

调用自身接口:

     1)对象.Object.自身属性:

如Browser("百度一下,你就知道").Page("百度一下,你就知道").WebButton("百度一下").Object.innerText="百度百度"  ,将WebButton("百度一下")的自身接口属性innerText设为“百度百度”。

     2)对象.Object.自身方法。

自身接口不但可以设置运行时属性的值,同样也可以获取运行时对象的自身接口的属性值。

使用封装接口进行赋值操作:

Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Set"test"

使用自身接口方式:

Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Object.value="test"


手写代码的方式及小技巧

一、步骤生成器

打开:设计—>Step Genertor步骤生成器或者使用快捷键F7


二、Complete Word方式

     查看:编辑—>格式—>Complete Word完成单词,快捷键为Ctrl+Space,因该快捷键优先认定为中/英文切换,需要先对语言栏进行设置,修改之后需要重启电脑。

三、对象拖动生成方法

     QTP11.5是直接从对象存储库中拖到专家视图中。

四、QTP编程过程的小技巧

1、垂直分割选取:在QTP11.5中是通过同时按下Ctrl+Alt,然后鼠标左键进行选择,选中垂直柱后,输入需要修改的内容即可。

2、代码换行符:_ 

如:Browser("百度一下,你就知道").Page("百度一下,你就知道")._

WebEdit("wd").Set"123"

3、显示参数提示:编辑—>格式—>参数信息:Ctrl+Shift+Space。

4、With...End With:用来提炼公共部分,如每句代码中前半段相同,可用With简化代码,可嵌套使用with。

     如:

withBrowser("百度一下,你就知道").Page("百度一下,你就知道")

.WebButton("百度一下").Click @@ hightlight id_;_Browser("百度一下,你就知道").Page("百度一下,你就知道")

.WebEdit("wd").Set"123"@@ hightlight id_;_Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd")

Endwith

5、冒号,用于连接不相干的两句或多句代码使其合成一句,位于同一行。

对属性操作的方法

GetTOProperty()

获取对象库中某个对象的某个属性值;

对象.GetTOProperty("封装属性名")。

GetTOProperties()

获取对象库中某个对象的所有属性值,获取的是一个数组;

对象.GetTOProperties();

例子:

SetProperties = Browser("百度一下,你就知道").Page("百度一下,你就知道").WebButton("百度一下").GetToProperties()

PropertiesCount = Properties.Count

print"对象总计存在"&PropertiesCount&"个封装属性"

Fori =1ToPropertiesCount-1

PropName = Properties(i).Name

PropValue = Properties(i).Value

print PropName&"="&PropValue

Next

SetProperties =Nothing      '释放对象

输出:


SetTOProperty

修改对象库中某个对象的某个属性的值,修改是临时性的,只在脚本运行时有效,一旦脚本运行结束,对象库中的值就会还原;

对象.SetTOProperty "封装属性名","封装属性值";

使用SetTOProperty方法,后面的参数不需要加括号,因为它没有返回值。

GetRoProperty()

获取实际在运行时的某个对象的某个属性值(不是从对象库中获取),一般用于动态获取实际运行时的属性和预期的测试数据进行比对;

对象.GetRoProperty("封装属性名")

注意:若需要比较如编辑框的value值,需要先获取对象库中的值,再获取运行时对象的值,做比对;Value值会获取获取目前编辑框中的值。

Test Object和Run-time Object

测试对象(TO)是被添加到对象库中的对象,即库中对象;运行时对象(RO)是被测试软件实际所运行的对象,即软件运行中的对象。

     TO和RO都是QTP封装的对象,使用QTP封装好的属性,但RO也可以调用自身接口的属性。

     TO测试对象是为了识别RO运行时对象而存在的。

对象侦测Object Spy

打开方式:

Tools—>Object Spy;

工具栏中的Object Spy图标;

对象库中也可打开。

1. Properties(属性)选项卡

Native Properties(即图中本地):对象控件自身接口的属性;

Identification Properties(标识):QTP为该对象控件封装的属性。

2. Operations(操作)

     对象自身和QTP封装的操作和方法。

3. 半操作模式:Ctrl键,支持点击。使用Spy点击白色手指后,鼠标光标为手指状,即捕获对象的状态。按住Ctrl键不放,可做鼠标点击动作,放开Ctrl回到捕获状态。

4. 全操作模式:Ctrl+Alt键,支持鼠标点击和键盘输入。先按住Ctrl不放,再按下Alt键,然后先松开Ctrl再松开Alt键,这样就切换到券操作模式。按下Ctrl并松开回到捕获状态。

QTP运行模式

打开Tool—>Options—>GUI测试—>测试运行:

以QC方式调用执行脚本,运行模式是Fast;

Normal方式运行时,脚本左侧有黄色箭头;

Normal方式可设置时间间隔,单位为毫秒。

对象存储库管理器Object Repository Manager

打开方式:Resources—>Object Repository Manager

即公共对象库,是一套管理对象库的模块。


打开外部对象文件后,是不能进行编辑的,需要点击Enable Editing按钮,如上图。


Object Repository Comparison Tool对象存储库比较工具,用于分析两个对象库文件之间的差异。

Object Repository Merge Tool对象存储库合并工具,

对象库Object Repository

打开方式Resources —>Object Repository或Ctrl+R:


     通过图中标记处,可进行Action的切换,来查看和添加不同Action下的对象。若脚本调用了外部Action,也可以切换到外部Action,对外部Action只有查看对象的权限。

如果剪切/复制的是父对象,那么粘贴后,其子对象会被一起剪切/复制过去,删除操作也一样;

复制子对象,粘贴后,只是子对象被复制。

1) Ctrl+F或编辑—>查找和替换:可进行查找对象,并将对象的属性值替换掉。

2) 加号按钮Add Object to Local:添加对象,当子对象被添加时,其父对象会一起被添加到对象库中。添加父对象子对象不会被添加。

3) 对象更新:见图中标识图标或对象—>从应用程序更新。同类型的空间可随意更新,但不同种类的对象空间无法更新。

4) Highlight in Application见图中标识,选中对象后,点击该按钮,可高亮对象。能高亮说明对象本身能被识别。

5) 对于从外部加载的对象库(关联存储库中),可选择对象Copy to local,复制到本地。Copy to local,copy父对象,祖父对象会跟过去,子对象不会。

6)下图中导出并替换本地对象,实际效果是导出对象并自动替换成副对象(自动将导出的对象添加到关联存储库中)来使用。


修改对象库中对象的名称,QTP会自动更新代码。

关联存储库Associate Repositories

打开方式:Resourse—>Associate Repositories

从外部导入的对象库,只读。

动态对象库加载:

RepositoriesCollection.Add"E:\zlp\QTP\123.tsr"

一旦执行到这句代码会触发加载外部对象库文件,效果和手动添加一致,但是动态加载生命周期很短,脚本执行介绍它也就结束了。


智能识别Smart Identification

     智能识别:从Object Identification对话框中可看到对于所有的Web对象模型都是默认勾选智能识别的,这里的智能识别针对的是某一个具体对象。

     对智能识别属性进行设置,左侧的基本筛选属性是即时生效的,即智能识别会首先判断这些属性,而右侧的可选属性只有当左侧属性列表中的属性全部使用后仍没有识别到的情况下才会生效,QTP会根据可选属性列表中的属性按照设定好的属性顺序来一个个进行只能识别,直到匹配到一个为止,若所有备用的属性都不能识别到则QTP会报错。

     智能识别是按照顺序对一个个属性进行判断,直到匹配到其中的一个属性。

Tools—>Object Identification:


File—>Settings—>Run:


     Run中的智能识别是总开关,一旦勾选,则不会进行智能识别。开启Run中的智能识别,开启Object Identification中某个对象的智能识别,则在运行中对该对象可进行智能识别。

QTP两种视图

关键字视图:Keyword View

          是图形化的视图。

          Item(项):记录所有对象;  

          Operation(操作):该对象的操作;

          Value(值):对象操作所用到的值;

          Documentation:对象操作所用到的值;

          注释:添加的注释语句。

        1、导出测试步骤:在关键字视图中,右击“Documentation”或其他标题都可,选择“Copy Documentation to Clipboard”可以到处测试步骤文档,生成测试用例,用于指导手工测试的进行;

          2、添加注释:在关键字视图中,列名为Comment的列,可在该列中为每个测试步骤添加注释;

          3、插入检查点、插入新的测试步骤等等。

专家视图:Expert View

         脚本开发的视图。

切换方法:查看—>关键字视图/编辑器


QTP两种回放模式

QTP的两种回放模式是:

Event模式事件跟踪

Mouse模式鼠标跟踪

     Event模式就是平时默认使用的模式,触发对象的相应事件,而不是通过鼠标光标来进行点击等操作。Mouse模式回放时能看到鼠标光标是跟着对象走的。

切换回放模式:

Tools—>Options—>Web—>Advanced中Run settings下的Replay type:


用代码控制回放模式:

Setting.WebPackage(“ReplayType”) = 1或2

1代表Event事件跟踪模式,2代表Mouse鼠标跟踪模式。

QTP回放机制

     回放机制原理:QTP从脚本中读取到该对象,并根据对象的层次和名称到对象库中寻找相同名称的测试对象,在对象库中找到相应地测试对象并获得该测试对象的属性,然后根据这个测试对象的属性,在运行的网页或应用程序中进行匹配,寻找运行时的对象。如果成功匹配上,再根据脚本中记录的该对象的方法、动作和参数值进行应用,如未能匹配上,则在超过等待时间后报错,脚本即宣布运行失败。

对回放设置的菜单:

File—>Settings—>Run:


     2. File—>Settings—>Web:等待网页加载的最大值,默认为60s,超过60s就会执行下一步,找不到对象报错。


录制相关功能


1、Record and Run Settings:录制与运行设置。在QTP11.5中的位置Record---->Record and Run Settings。


上图中程序参数(Program arguments):打开应用时设置特定的参数,我的理解是如在windows命令行中打开应用后台添加的参数。

Include descendant processes:包括子进程。

2、Web Event Recording Configuration:Web事件录制设置。在QTP11.5中的位置:Record---->Web Event Recording Configuration,只能应用于B/S架构系统,如设置级别为高,则能录制鼠标悬停事件。


QTP插件 Add-in

Add-in Manager(插件管理器),默认自带三个插件,如下图所示:


     Add-in是用来识别对象控件,所以插件的选择和被测对象控件有关。对于Web测试而言,与项目具体使用的语言没有多大关系。但是对于Windows桌面应用程序而言,插件的选择和开发语言是有关系的,QTP有相应的Add-in对应不同语言的桌面应用程序。

说明:使用QTP测试网页,先打开QTP,再打开测试网页,以免QTP无法识别对象。因为每次打开浏览器都会加载BHOManager,QTP识别对象是依靠BHOManager Class动态链接库来完成,若先打开浏览器再打开QTP,QTP不能成功读到BHOManager Class动态链接库,从而导致对象识别的失败。

关于BHO的解释,见文章“BHO 浏览器辅助对象”

BHO 浏览器辅助对象

     BHO:Browser Helper Object,浏览器辅助对象,是微软推出的作为浏览器对第三方程序员开放交互接口的业界标准,通过代码可进入浏览器领域的“交互接口(INTERACTIVED Interface)。通过这个接口,程序员可以编写代码获取浏览器的行为。

     BHO对象依托于浏览器主窗口。这意味着一旦一个浏览器窗口产生,一个新的BHO对象实例就要生成。任何BHO对象与浏览器实例的生命周期是一致的。其次, BHO仅存在于Internet Explorer 4.0及以后版本中。

QTP三种录制模式 需要再补充

QTP的三种录制模式分别是:正常录制、模拟录制和低级录制。

正常录制

开启方法:

即默认的录制模式,通过识别对象属性来录制。

模拟录制

开启方法:

可录制键盘和鼠标的精确操作,鼠标的运动轨迹。录制下来的文件比较大,而且不可以由QTP进行编辑。若回放时,改变了屏幕的分辨率或窗口/屏幕位置,回放就会失败。

低级录制

开启方法:

记录坐标的位置,在回放时对象的坐标有一点改变就会回放失败,将所有父类对象录制未Windows测试对象,将所有的其他对象录制为WinObject测试对象。

模拟录制与低级录制区别 P42

你可能感兴趣的:(《精通QTP—自动化测试技术领航》)