QTP者,QuickTest Professional也,是当前应用得比较广泛的功能测试自动化工具。这两个礼拜断断续续地用QTP 10.0录制了一些脚本,的确是能提高一些工作效率,在用VB Script编写脚本的过程中,也享受了一些乐趣。So,这里对遇到的问题做个总结。
由于目前的项目是基于Web的,故以下提及的控件,均是指Web控件。当然,我们界面大部分都是jQuery的东东。
1.控件对象找不到
不要以为点击QTP中的Record就可以把整个操作过程都录制下来。有很多控件,都需要你手动添加到对象库中。在运行的过程中,如果想查看哪个控件的属性和方法,Object Spy可以帮你的忙
2.同名的控件
在界面操作的过程中,可能会弹出两次消息框,消息内容不同,但同样会点击OK按钮。这时你会发现,明明是两个不同的Button对象,对象库中只存在一个。
因为默认的Button对象的Description properties只有Type、name、html tag三个属性,值分别是button、OK、Button,很显然如果根据这三个属性来定义对象,那么两个OK按钮,QTP自然认为是同一个。解决方法有两个:
1.再为"OK"添加一个properties,以便识别;
2.为另一个“OK”按钮添加虚拟对象。
当然,这里推荐第一种解决方法,因为虚拟对象的真正用途并不是这个。
3.双击动作录制不了
原因是没有添加Web Event方法。
点击Tools->Web Event Recording Configuration->Custom setting,再在弹出窗口点击Event->Add->ondblclick。
当然,在添加之后,你也可以直接修改脚本代码,如:
Browser("Browser").Page("ITSM").WebElement("Contact_CName").FireEvent "ondblclick"
4.Debug功能使用不了
再安装一个dbg10chs.exe就Ok了。额,没错,这个玩意儿是微软脚本调试器..由此看来,HP和Microsoft还真是亲如一家啊:)
5.键盘动作
页面上的jqGrid控件有检索功能,即在Grid上方的文本框内输入字符,会在列表中自动过滤出匹配的内容。但是在跑测试脚本的时候,哪怕已经给文本框附上值了,但列表中的数据仍没有丝毫反应。看来,是要加一个键盘的Enter操作了。脚本如下:
Browser("Browser").Page("ITSM").WebEdit("CName").Object.focus
set WshShell =CreateObject("Wscript.Shell")
WshShell.SendKeys "{ENTER}"
6.获得页面动态生成的对象的属性
什么叫动态生成的对象?额,我不知道这种描述是否准确,即每次单击按钮后新建一个标签页对象,这个标签页的Id、Name等信息都是动态生成的。如果只是通过简单的录制得到标签页对象,那么在Run脚本的的时候,肯定是要失败的,因为属性是会变的,在Run的时候会找不到这个标签页对象。为了解决这个问题,我想了好几种方法:
1.通过坐标进行定位。但是abs_x、abs_y坐标值还是会变,此法无效。
2.通过对象的Ordinal identifier的Index值进行定位。这个Index值,是QTP附加给对象的,是对象在网页加载时出现的顺序,第一个为0。然而,对于网页对象太多的情况下(Index>10)加载时发生变化的可能性很大,造成对象不能识别。此法也被我Pass了。
3.描述性编程。呵呵,终于找到最佳方案了。脚本如下:
Dim ticketNo,strticketNo'得到动态生成的TicketNo.
ticketNo="IM2010.*"'利用正则表达式进行匹配
strticketNo=Browser("Browser").Page("ITSM").Link("name:="&ticketNo).GetRoProperty("name")
7.部分脚本多次运行
比如我要测试检索功能,检索条件可以是UPI/EName/CName/FullName/Firstname/Lastname。这些情况肯定都要测试到的,所以需要重复“给检索框赋值,点击Search按钮”这一系列的动作。(详见:http://blog.csai.cn/user1/37578/archives/2009/36484.html巧用datatable实现脚本部分循环)脚本如下:
Dim rowsum
rowsum=DataTable.GetSheet("VIP").GetRowCount
For i=1 to rowsum
DataTable.SetCurrentRow (i)
Browser("Browser").Page("ITSM").WebEdit("txt_seachContactParm").Set DataTable("txt_seachContactParm", dtLocalSheet)
Browser("Browser").Page("ITSM").WebElement("Search").Click
Next