51Testing软件测试论坛

标题: 【扼杀QTP检查点 2】 [打印本页]

作者: 假装不在    时间: 2009-4-29 00:05
标题: 【扼杀QTP检查点 2】
【扼杀QTP检查点 2】

出自 《51测试天地》第十三期 作者:卢晨之


    在做自动化脚本录制与回放过程中,只有当用户针对某个功能做的检查点,QTP才会把这个对象的预期结果做判断,给着人一种“各扫门庭雪”的感觉。或者有些地方会出现类似Http 错误之类的提示,或者页面出现某些错误但QTP却无动于衷,因为你没有对这些做监测点的设置。但这么多的对象做监测点设置是件很麻烦的事情,而你不做,却又会对项目在做验收时候看不到多大的效果。为此我们结合了上节我们的方法,就是自己编写简单的函数对这个页面做判断。
     哪么,一个web页面出现错误的情况大概都有那些?读者可以自己在脑海中想想在自己的测试工作过程中,都发现了那些类型的页面错误?结合到这点简单的提到一下几点:
1,标题提示错误。这个应该是给用户最直观的。“找不到页面”、“HTTP 错误”、“找不到服务器”等等;如图-01:
[attach]51434[/attach]


图(01)


2,URL错误。它涉及到的,可以是当前页面的URL错误,或者是Frame内部的URL错误。错误的标准可以是公司内部自己提供的错误后跳转的URL,只要出现这个URL跳转出来的页面,哪么它也是错误的;如图-02
[attach]51435[/attach]


图(02)


3,页面输出错误。这点是比较泛的,区别于第2点就是某些错误的页面它是不会跳转到我们指定的URL,导致了显示出错。如图-03
[attach]51436[/attach]


图 (03)


4,WinStatusBar 的错误提示。这一点在测试的过程中,很多的测试人员或者开发人员对这个很不敏感,有些错误不易见的错误我们是可以在这个WinStatusBar中看出来的。如图-04
[attach]51437[/attach]


图 (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").Exist  Then
            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").Exist  Then
                                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内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。
作者: 假装不在    时间: 2009-4-29 01:04
晚上逛了jifeng的博客发现了createTextRange 这个方法,在速度上比第三步中运行速度要快很多。
大家可以学习学习。所以第三个方法可以做下简单的修改,然速度提高。同时第3个方法修改时候,需要注意2点
1、不过这个方法的使用在对按钮的VALUE没有做捕获功能,同样需要再写。
2、createTextRange的方法同样在使用过程中需要对frame做个遍历,如果只设置当前的page.object.body会抓不到frame内部的东西(可以玩玩163)

学习永无止尽...::yiwusuoyou:::
低调发帖,华丽路过。
作者: 假装不在    时间: 2009-4-29 01:05
季风的博客是:
http://www.51testing.com/?92935
大家去踩踩有用的东西。::yiwusuoyou:::

低调发帖,华丽路过。
作者: zte_boy    时间: 2009-4-29 11:23
打广告呢?哈哈
作者: 假装不在    时间: 2009-4-29 14:46
原帖由 zte_boy 于 2009-4-29 11:23 发表
打广告呢?哈哈


::yxiao:::
不是,这叫友情链接。




欢迎光临 51Testing软件测试论坛 (http://bbs.51testing.com/) Powered by Discuz! X3.2