QTP进阶使用1
目录
上午实习任务:
- 在之前录制好的登录、订票、退出的脚本上补录发传真的脚本(要求有签名动作)
- 回放脚本观察、分析,尝试解决问题
- 依据qtp的工作原理来解决以上问题
- 对画图软件的画图或写字的过程用模拟录制,确保脚本回放正确
- 用模拟录制解决发传真签名的问题
- 尝试用正则表达式解决传真出错的问题
下午实习任务:
- 录制或拆分飞行订票系统到登录、订票、退出3个Action
- 局部参数化使脚本能够登录、退出各一次而反复执行订票多次
- 观察、分析并解决出现的问题
- 编写一个html文件用qtp结合参数化、检查点和正则表达式来验证哪些数据满足正则表达式a[0-9A-Z]\.k*\W的表达范围
- 尝试采用剪切复制的方法将代码放入到多个Action中,让飞行订票脚本变成多个Action
一、飞行订票系统问题
我们先录制一个打开订票系统订票然后关闭的test,运行一遍保证无误
然后在第12-13行之间补录一个发传真的过程
运行一遍,发现画面停留在传单发送页面,并报如下错误
仔细观察代码,可以发现录制中录制了第59个订单,但是我们下一次执行时,订单编号是不会是59(这里因为中间多尝试了几次所以已经到66了)
解决办法有两种:
(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 | 匹配余下的字符 |
打开对象仓库,添加属性
编辑
勾选“正则表达式”,弹出对话框选“否”
把“59”改成“[0-9+]”,表示匹配[0-9]的数字一次或多次
解决完后运行一下,发现虽然发送成功了,但是签名却和之前录制的不一样
这是因为QTP只能录制鼠标点击的动作,不能录制鼠标滑动的路径,所以只录制到了开始签名和结束签名时的位置。
我们先用“画图”软件测试一下。
开始录制,打开“画图”
点击上图所示的“模拟录制”
选择第二个,并点击一下图示按钮
可以看到鼠标的光标变成了一个小手,点击画图软件的窗口,并选择[Start Analog Record]
画好图后再点击一下上图所示的按钮,即可保存画图
可以看到代码里形成了路径的这一段。
回放一下,画图路径被完美保存。
现在回到QTP,把签名的那一段删掉,并按以上方法补录
回放一遍,报错
这是因为我们刚刚录制签名时是在订单号68上录制的,而现在是69号,和上面的问题一样
找到相应的位置,把该行删除
回放成功,问题解决
二、录制多个action
考虑:对于两位数加数器这个程序来说,如果我们想让它打开一次,然后计算3次,再关闭一次,该怎么做呢?
如果我们直接一次性录制,那就相当于是只有一个main函数,所有的代码都在里面,只能对“计算”这一段步骤加一个循环。
如果为了程序简明,可以分别写3个方法,打开、计算和关闭,然后在main中直接调用。
我们打开QTP,新建一个录制,观察页面左边,现在只有一个action1
点击菜单栏上的图标,新建action
第一栏可以定义该action的名字,[Reusable Action]表示复用action,[Location]中,第一个表示添加兄弟action,第2个表示添加子action,这里我们选择第一个
一共添加2个action
现在我们先选择action1,录制程序的打开
然后切换到action2,录制计算过程,中途不用停止录制
最后切到action3,录制关闭
运行一下验证可行
我们到action2中,设置好参数,并在数据表中列出3条数据
这里要注意选择局部变量
可以看到数据表中只有action2的表添加了数据
直接运行,发现还是只计算了1次
我们打开action2的设置
选择运行所有行
再次运行,功能实现
同时,我们也可以边录制边新建action
先开始录制,打开网页
点击“新建”,继续录制
直到录制完毕
三、action的拆分
我们打开早上录制好的飞行订票脚本
上图中红线上部分为登录,下部分为订票
点击切割按钮
选择“是”
可以看到左侧有两种切割方法
切割为兄弟action
切割为父子action
这里我们选第一种,把整个Action分成4部分,登录、登记、发传真、退出
点击下图按钮可更改action名字
打开对象仓库看一下
每一个action都包含了所有对象,这使得仓库中冗余。因此,一般来说,在录制时就应该分开录制,而不是等到之后再拆分。
四、局部参数化订票系统
对[register]部分进行参数化,设置为运行数据表所有行,并运行
发现登记到第二栏数据时出错
这是因为我们没有新增订票,使得第二个订票被识别成了修改,[insert order]按钮没有**
这时我们可以选择补录一下,但是事实上只需要录一个步骤,因此有另一种思路:
1、在代码区新增一行代码
在快照区加入[新增]按钮的对象为[Button]
在代码区第一行加入该点击代码(模仿下句代码加入)
2、直接在快照区加入动作
选择[step generator]
可以看到这里已经生产了该代码
五、正则表达式验证
录制一个打开网页,输入数据,关闭的3个action的test
对action2进行参数化
其中,第5个最后有空格,第6个没有
对input设置检查点
选择[value]
点击更改
设置成正则表达式 a[0-9A-Z]\.k*\W
该表达式的意思为a开头,后接[0-9]的数字或[A-Z]的单字母,再接一个“.”,后接0个或多个k,再接一个除[0-9a-zA-Z_]的字符
运行一下
显示为第1、2、6错误,3、4、5正确
六、剪切复制成多个action
打开录制好的飞机订票器,创建多个action
用复制粘贴的方式把相应代码移进新加的Action
切换到关键字视图
发现除了action1外,其他的对象都是空
运行一下
报错,对象不存在
在对象仓库中,点击图示按钮
选择需要添加的对象,全部抓取
其中,捕捉“关闭”按钮时,选择“只选择该对象”
结束后可以看到图标变回正常样式
运行一下,可以成功。
显然,这样使得操作很繁琐,最简便的方式还是边录制边分action。
如果不想一个一个添加对象,这里还有一个批量添加的方法
打开action1的对象仓库,选择[file] --> [export local objects]
保存后,在对象仓库中,点击下图所示按钮
点击添加
选择刚刚导出的tsr文件
由于action1中已有对象,缺的是action2和action3,把2和3添加到右边,如图所示
点击[OK]
切换到action3的对象仓库,可以发现里面存在对象
对象颜色是灰的,因为它实际上借用的是action1的对象
当然除了test内部批量借用对象,也可以外部借用
但是这会存在一个问题,因为是借用,如果原件的对象产生了变化,导入后的对象也会相应的变化