【扼杀QTP检查点 2】
【扼杀QTP检查点 2】出自 《51测试天地》第十三期 作者:卢晨之
在做自动化脚本录制与回放过程中,只有当用户针对某个功能做的检查点,QTP才会把这个对象的预期结果做判断,给着人一种“各扫门庭雪”的感觉。或者有些地方会出现类似Http 错误之类的提示,或者页面出现某些错误但QTP却无动于衷,因为你没有对这些做监测点的设置。但这么多的对象做监测点设置是件很麻烦的事情,而你不做,却又会对项目在做验收时候看不到多大的效果。为此我们结合了上节我们的方法,就是自己编写简单的函数对这个页面做判断。
哪么,一个web页面出现错误的情况大概都有那些?读者可以自己在脑海中想想在自己的测试工作过程中,都发现了那些类型的页面错误?结合到这点简单的提到一下几点:
1,标题提示错误。这个应该是给用户最直观的。“找不到页面”、“HTTP 错误”、“找不到服务器”等等;如图-01:
图(01)
2,URL错误。它涉及到的,可以是当前页面的URL错误,或者是Frame内部的URL错误。错误的标准可以是公司内部自己提供的错误后跳转的URL,只要出现这个URL跳转出来的页面,哪么它也是错误的;如图-02
图(02)
3,页面输出错误。这点是比较泛的,区别于第2点就是某些错误的页面它是不会跳转到我们指定的URL,导致了显示出错。如图-03
图 (03)
4,WinStatusBar 的错误提示。这一点在测试的过程中,很多的测试人员或者开发人员对这个很不敏感,有些错误不易见的错误我们是可以在这个WinStatusBar中看出来的。如图-04
图 (04)
就先说这4点,在看到这4点后,读者可以先试试如何把这4点写成函数。
首先,针对这个错误的比较,我们的前提是错误类型字眼的出现,为此我们先编写一个判断正则表达式的函数。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' RegExpbld 正则表达式的判断
'
'参数
' patrn 正则表达式
' strng 字符串
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function RegExpbld(patrn, strng)
Dim regEx, retVal ' 建立变量。
Set regEx = New RegExp ' 建立正则表达式。
regEx.Pattern = patrn ' 设置模式。
regEx.IgnoreCase = true ' 设置是否区分大小写。
retVal = regEx.Test(strng) ' 执行搜索测试。
RegExpbld=retVal
End Function
其次,第1,2,4点的函数编写实现难度不高。好比第1点中,我们只需要取出 Browser的标题,并使用上面的表达式函数便可以
-1 RegExp = "错误|error|无法" ‘这个是我们简单编写的正则表达式
-2 title=browser("Google").getroproperty(“title”)
-3 if RegExpbld(RegExp, title) then
-4 '如果出现这些错误的字样则报错
-5 end if
但在第2点中,需要提醒大家的是,捕获这个错误的URL,不仅仅是当前页面的URL,我们还需要取出在页面中所有frame的URL做对比。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' 参数
'error_url 公司内部自定义的错误页面跳转URL,可以写成数组之类去进行比较
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
-1 Dim FramesObj
-2 Set FramesObj =browser("Google").Page("Google").Object.frames
-3 For i=0 to FramesObj.length-1
-4 If FramesObj (i).getroproperty("url")= error_url Then
-5 '如果为true就是某个frame已经跳转到指定的URL
-6 End If
-7 Next
再次,我们针对第三点,我们查错的标准是当前页面中是否出现了类似第1点中的错误字样:"错误|error|无法"。但是如何实现呢,在这里简单介绍3个方法。
第一:通过QTP自带的TextUtil对象去做页面字体捕获。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' QTP_DocIsLive 通过TextUtil 对象判断页面是否存在某个特定错误字样
'
'参数
'无
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function QTP_DocIsLive()
Dim Src_text,patrn
Src_text=TextUtil.GetText(0, 20, 20, 2000, 2000) '窗口的大小需要根据实际去定义
patrn="错误|error|无法"
If RegExpbld(patrn,Src_text) Then
QTP_DocIsLive=true
Exit Function
End If
QTP_DocIsLive=false
End Function
优势:原理简单,甚至能查找到不可预知的msgbox中的内容。
弊端:QTP本身对这个TextUtil的支持并不是做得很完善,导致了方法是使用过程中,偶尔会与Window Explorer 冲突,导致了使用函数完后,Window会出现某些异常情况。
第二:通过浏览器自带的查找功能。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' New_Page_Docfind 通过IE 自带查找功能判断页面是否存在某个特定错误字样
'
'参数
' New_Page_Doc 用户自己输入的查找字样,不支持正则表达式,需要自己编写循环查找
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public function New_Page_Docfind(New_Page_Doc)
Dim oShell
Set oShell=CreateObject("WSCript.shell")
oShell.sendkeys"^f" '发送”Ctrl+F”调出查找功能
browser("browser").Window("查找").Page("查找").WebEdit("WebEdit").Set New_Page_Doc '设置搜索文本的内容,用户需要自己添加对象或者修改成描述语言
browser("browser").Window("查找").Page("查找").WebButton("查找下一个(F)").Click
'点击查找按钮
If browser("browser").Window("查找").Dialog("Microsoft Internet Explorer").ExistThen
browser("browser").Window("查找").Dialog("Microsoft Internet Explorer").Close
wait(0.1)
oShell.sendkeys"%u"
browser("browser").Window("查找").Page("查找").WebButton("查找下一个(F)").Click
If browser("browser").Window("查找").Dialog("Microsoft Internet Explorer").ExistThen
browser("browser").Window("查找").Dialog("Microsoft Internet Explorer").Close
New_Page_Docfind=false
browser("browser").Window("查找").Close
else
New_Page_Docfind=true
browser("browser").Window("查找").Close
end if
else
New_Page_Docfind=true
browser("browser").Window("查找").Close
End If
Set oShell=Nothing
End Function
优势:针对某个特定字眼查找速度快,准
弊端:如果特定字眼多,会导致速度下降,界面闪动较为厉害
函数中的某些对象是建立在对象库的基础上的,移植效果差强人意。
不能同时对多个Frames做查找,需要点击触发
第三:使用DocumentElement 对象。
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' New_Page_DocExist 使用DocumentElement 对象判断页面是否存在某个特定错误字样
'
'参数
' reg 正则表达式
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Public Function New_Page_DocExist(reg)
Dim Page_doc_a,Page_doc_b,Page_doc_c,str,oDesc,frame_obj,logie,child_a
str=browser("browser").GetROProperty("title")
If browser("browser").page("index:=0").Exist Then
Set Page_doc_a=browser("browser").page("index:=0").Object.documentElement.all.tags("body")
For each Element in Page_doc_a
str=str+""+Element.outertext
Next
Set Page_doc_b=browser("browser").page("index:=0").Object.documentElement.all.tags("input")
For each Element in Page_doc_b
str=str+""+Element.value
Next
Set Page_doc_c=browser("browser").Page("index:=0").Object.documentElement.all.tags("SPAN")
For each Element in Page_doc_c
str=str+""+Element.outertext
Next
Set Page_doc_a=nothing
Set Page_doc_b=Nothing
Set Page_doc_c=nothing
End if
frame_count=browser("browser").page("index:=0").object.frames.length
If frame_count<>0 Then
Set oDesc = Description.Create()
oDesc("html tag").Value = "iframe"
set frame_obj = browser("browser").page("index:=0").ChildObjects(oDesc)
For i=0 to frame_count-1
set Page_doc_a=frame_obj(i).Object.documentElement.all.tags("body")
For each Element in Page_doc_a
str=str+""+Element.outertext
next
set Page_doc_b=frame_obj(i).Object.documentElement.all.tags("input")
For each Element in Page_doc_b
str=str+""+Element.value
Next
set Page_doc_c=frame_obj(i).Object.documentElement.all.tags("SPAN")
For each Element in Page_doc_c
str=str+""+Element.outertext
next
set Page_doc_a=nothing
set Page_doc_b=Nothing
set Page_doc_c=nothing
Next
End If
str=str+""+browser("browser").WinStatusBar("msctls_statusbar32").getroproperty("text") ' WinStatusBar的对象需要自己添加进对象库
New_Page_DocExist=RegExpbld (reg,str)
End Function
优势: 方法编写能把标题捕获,状态栏捕获也加进去
捕获的字样比较全面,较为准确
可移植强
弊端: 使用正则表达式做判断时候时间较长。
看完这3个方法后,可能有人会有疑问,那究竟这样真的能够抓到错误吗?在这里,我们只需要再编写多一个截图的功能,并且在跑动脚本过程中只要出现我们定义的“错误”就截图,为的是宁杀错,不放过的精神。值得一提的是,这查找“错误”的方法也适合测试人员在做翻译查找中。因为许多的多语言版本的软件,在翻译方面或者会有漏网之鱼。
本文收录于《51测试天地》电子杂志第十三期。
版权声明:本文出自51Testing软件测试网电子杂志——《51测试天地》第十三期。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。 晚上逛了jifeng的博客发现了createTextRange 这个方法,在速度上比第三步中运行速度要快很多。
大家可以学习学习。所以第三个方法可以做下简单的修改,然速度提高。同时第3个方法修改时候,需要注意2点
1、不过这个方法的使用在对按钮的VALUE没有做捕获功能,同样需要再写。
2、createTextRange的方法同样在使用过程中需要对frame做个遍历,如果只设置当前的page.object.body会抓不到frame内部的东西(可以玩玩163)
学习永无止尽...::yiwusuoyou:::
低调发帖,华丽路过。 季风的博客是:
http://www.51testing.com/?92935
大家去踩踩有用的东西。::yiwusuoyou:::
低调发帖,华丽路过。 打广告呢?哈哈 原帖由 zte_boy 于 2009-4-29 11:23 发表 http://bbs.51testing.com/images/common/back.gif
打广告呢?哈哈
::yxiao:::
不是,这叫友情链接。
页:
[1]