QTP进阶使用1

目录

一、飞行订票系统问题

二、录制多个action

三、action的拆分

四、局部参数化订票系统

五、正则表达式验证

六、剪切复制成多个action


上午实习任务:

  • 在之前录制好的登录、订票、退出的脚本上补录发传真的脚本(要求有签名动作)
  • 回放脚本观察、分析,尝试解决问题
  • 依据qtp的工作原理来解决以上问题
  • 对画图软件的画图或写字的过程用模拟录制,确保脚本回放正确
  • 用模拟录制解决发传真签名的问题
  • 尝试用正则表达式解决传真出错的问题

下午实习任务:

  • 录制或拆分飞行订票系统到登录、订票、退出3个Action
  • 局部参数化使脚本能够登录、退出各一次而反复执行订票多次
  • 观察、分析并解决出现的问题
  • 编写一个html文件用qtp结合参数化、检查点和正则表达式来验证哪些数据满足正则表达式a[0-9A-Z]\.k*\W的表达范围
  • 尝试采用剪切复制的方法将代码放入到多个Action中,让飞行订票脚本变成多个Action

一、飞行订票系统问题

我们先录制一个打开订票系统订票然后关闭的test,运行一遍保证无误

QTP进阶使用1

然后在第12-13行之间补录一个发传真的过程

QTP进阶使用1

运行一遍,发现画面停留在传单发送页面,并报如下错误

QTP进阶使用1

仔细观察代码,可以发现录制中录制了第59个订单,但是我们下一次执行时,订单编号是不会是59(这里因为中间多尝试了几次所以已经到66了)

QTP进阶使用1

解决办法有两种:

(1)打开对象仓库,把下列属性删除

QTP进阶使用1

原理是,可以观察的到,除了[text]属性外,还有[nativeclass]属性是独一的可区分的,删除掉[text]后仍然不会影响识别

(2)使用正则表达式

. 表示除换行之外的任意单字符  
* 匹配前面的字符0次或多次

如:a*  -->   a  aa  aaa …

abc*  --> ab  abc  abccc …

+ 匹配前面的字符1次或多次  
匹配前面的字符0次或1一次  
^ 匹配字符串的开始位置 如: ^a  -->  表示以a开头的字符串 abc adsfd …
$ 匹配字符串的结束位置 如: a$  -->  表示以a结尾的字符串 dsfsda dfa …
\w 匹配0-9,a-z,A-Z,_  
\W 匹配余下的字符  

打开对象仓库,添加属性

QTP进阶使用1

编辑

QTP进阶使用1

勾选“正则表达式”,弹出对话框选“否”

QTP进阶使用1

把“59”改成“[0-9+]”,表示匹配[0-9]的数字一次或多次

QTP进阶使用1

 

解决完后运行一下,发现虽然发送成功了,但是签名却和之前录制的不一样

QTP进阶使用1

这是因为QTP只能录制鼠标点击的动作,不能录制鼠标滑动的路径,所以只录制到了开始签名和结束签名时的位置。

 

我们先用“画图”软件测试一下。

开始录制,打开“画图”

QTP进阶使用1

点击上图所示的“模拟录制”

选择第二个,并点击一下图示按钮

QTP进阶使用1

可以看到鼠标的光标变成了一个小手,点击画图软件的窗口,并选择[Start Analog Record]

QTP进阶使用1

画好图后再点击一下上图所示的按钮,即可保存画图

QTP进阶使用1

可以看到代码里形成了路径的这一段。

回放一下,画图路径被完美保存。

 

现在回到QTP,把签名的那一段删掉,并按以上方法补录

QTP进阶使用1

QTP进阶使用1

回放一遍,报错

QTP进阶使用1

这是因为我们刚刚录制签名时是在订单号68上录制的,而现在是69号,和上面的问题一样

找到相应的位置,把该行删除

QTP进阶使用1

回放成功,问题解决


二、录制多个action

考虑:对于两位数加数器这个程序来说,如果我们想让它打开一次,然后计算3次,再关闭一次,该怎么做呢?

如果我们直接一次性录制,那就相当于是只有一个main函数,所有的代码都在里面,只能对“计算”这一段步骤加一个循环。

如果为了程序简明,可以分别写3个方法,打开、计算和关闭,然后在main中直接调用。

 

我们打开QTP,新建一个录制,观察页面左边,现在只有一个action1

QTP进阶使用1

点击菜单栏上的图标,新建action

QTP进阶使用1

第一栏可以定义该action的名字,[Reusable Action]表示复用action,[Location]中,第一个表示添加兄弟action,第2个表示添加子action,这里我们选择第一个

QTP进阶使用1

一共添加2个action

QTP进阶使用1

现在我们先选择action1,录制程序的打开

QTP进阶使用1

QTP进阶使用1

然后切换到action2,录制计算过程,中途不用停止录制

QTP进阶使用1

最后切到action3,录制关闭

QTP进阶使用1

运行一下验证可行

我们到action2中,设置好参数,并在数据表中列出3条数据

QTP进阶使用1

这里要注意选择局部变量

QTP进阶使用1

可以看到数据表中只有action2的表添加了数据

直接运行,发现还是只计算了1次

我们打开action2的设置

QTP进阶使用1

选择运行所有行

QTP进阶使用1

再次运行,功能实现

 

同时,我们也可以边录制边新建action

先开始录制,打开网页

QTP进阶使用1

点击“新建”,继续录制

QTP进阶使用1

直到录制完毕

QTP进阶使用1


三、action的拆分

我们打开早上录制好的飞行订票脚本

QTP进阶使用1

上图中红线上部分为登录,下部分为订票

点击切割按钮

QTP进阶使用1

选择“是”

QTP进阶使用1

可以看到左侧有两种切割方法

QTP进阶使用1

切割为兄弟action

QTP进阶使用1

切割为父子action

这里我们选第一种,把整个Action分成4部分,登录、登记、发传真、退出

点击下图按钮可更改action名字

QTP进阶使用1  QTP进阶使用1

 

 

打开对象仓库看一下

QTP进阶使用1

每一个action都包含了所有对象,这使得仓库中冗余。因此,一般来说,在录制时就应该分开录制,而不是等到之后再拆分。


四、局部参数化订票系统

对[register]部分进行参数化,设置为运行数据表所有行,并运行

QTP进阶使用1

发现登记到第二栏数据时出错

QTP进阶使用1

这是因为我们没有新增订票,使得第二个订票被识别成了修改,[insert order]按钮没有**

QTP进阶使用1

这时我们可以选择补录一下,但是事实上只需要录一个步骤,因此有另一种思路:

1、在代码区新增一行代码

QTP进阶使用1

在快照区加入[新增]按钮的对象为[Button]

QTP进阶使用1

在代码区第一行加入该点击代码(模仿下句代码加入)

QTP进阶使用1

2、直接在快照区加入动作

选择[step generator]

QTP进阶使用1

可以看到这里已经生产了该代码

QTP进阶使用1


五、正则表达式验证

录制一个打开网页,输入数据,关闭的3个action的test

QTP进阶使用1

对action2进行参数化

QTP进阶使用1

其中,第5个最后有空格,第6个没有

对input设置检查点

QTP进阶使用1

选择[value]

QTP进阶使用1

点击更改

QTP进阶使用1

设置成正则表达式 a[0-9A-Z]\.k*\W

该表达式的意思为a开头,后接[0-9]的数字或[A-Z]的单字母,再接一个“.”,后接0个或多个k,再接一个除[0-9a-zA-Z_]的字符

QTP进阶使用1

运行一下

QTP进阶使用1

显示为第1、2、6错误,3、4、5正确


六、剪切复制成多个action

打开录制好的飞机订票器,创建多个action

QTP进阶使用1

用复制粘贴的方式把相应代码移进新加的Action

QTP进阶使用1

切换到关键字视图

QTP进阶使用1

QTP进阶使用1

QTP进阶使用1

发现除了action1外,其他的对象都是空

运行一下

QTP进阶使用1

报错,对象不存在

在对象仓库中,点击图示按钮

QTP进阶使用1

选择需要添加的对象,全部抓取

QTP进阶使用1

其中,捕捉“关闭”按钮时,选择“只选择该对象”

QTP进阶使用1

结束后可以看到图标变回正常样式

QTP进阶使用1

运行一下,可以成功。

显然,这样使得操作很繁琐,最简便的方式还是边录制边分action。

如果不想一个一个添加对象,这里还有一个批量添加的方法

打开action1的对象仓库,选择[file] --> [export local objects]

QTP进阶使用1

保存后,在对象仓库中,点击下图所示按钮

QTP进阶使用1

点击添加

QTP进阶使用1

选择刚刚导出的tsr文件

QTP进阶使用1

由于action1中已有对象,缺的是action2和action3,把2和3添加到右边,如图所示

QTP进阶使用1

点击[OK]

切换到action3的对象仓库,可以发现里面存在对象

QTP进阶使用1

对象颜色是灰的,因为它实际上借用的是action1的对象

当然除了test内部批量借用对象,也可以外部借用

但是这会存在一个问题,因为是借用,如果原件的对象产生了变化,导入后的对象也会相应的变化