原创日志转载请标明出处与连接! 大家的支持是我的动力!_______卢晨之 (luchenzhi@21cn.com/@hotmail.com)

【扼杀QTP检查点 2】

上一篇 / 下一篇  2009-04-29 00:14:57 / 个人分类:QTP

查看( 547 ) / 评论( 4 )

【扼杀QTP检查点 2】

L"O?:_It0jiW051Testing软件测试网 uV7e8wy

出自 《51测试天地》第十三期 作者:卢晨之51Testing软件测试网NM l-W+O1_&|E"y


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

51Testing软件测试网?_]4Y(~T y+P}2~B

DK C?wb+a?"B#S01.JPG
51Testing软件测试网 e&B hD!WV)`#[6Z


F@W W"PNT^051Testing软件测试网@1P.u.Jm Ru-G)i

图(01)

6iA$m2R,[B3~0
Ew d,t Y:w`051Testing软件测试网2v/cLd)th4u!t(C
2,URL错误。它涉及到的,可以是当前页面的URL错误,或者是Frame内部的URL错误。错误的标准可以是公司内部自己提供的错误后跳转的URL,只要出现这个URL跳转出来的页面,哪么它也是错误的;如图-02
fF/viBs9? |0


,{Y/oZ1D0EG B0
:QWN@b02.JPG

+s0Y J`7tq051Testing软件测试网*F iuy5g@6Z

xRD6|6s?j q#D0

图(02)51Testing软件测试网X)E N c,M7Hu i0J


u,ca*M:Z+g~4u051Testing软件测试网N8t%T,vS%c3Hq D
3,页面输出错误。这点是比较泛的,区别于第2点就是某些错误的页面它是不会跳转到我们指定的URL,导致了显示出错。如图-03
B;o;m}7K7G%I T?0


N/y#S3JB5JJQ){ Ff1e051Testing软件测试网 u%nY_d;AP,D
3.JPG
51Testing软件测试网!s9er8W"uFg

51Testing软件测试网*un[!Ep4fbC.v

8i6i(L7id RJDa0

图 (03)

s { Gy[} g|051Testing软件测试网(] E)v?e v/tc7Z{a

)? W6F1`u*~8h!p3s;p&z04,WinStatusBar 的错误提示。这一点在测试的过程中,很多的测试人员或者开发人员对这个很不敏感,有些错误不易见的错误我们是可以在这个WinStatusBar中看出来的。如图-04
']9n*oY8m4Vj8S(We0

51Testing软件测试网3EV0RL'd,B

g1E/?;lI04.JPG
51Testing软件测试网5t'q!G$UBnp

51Testing软件测试网 Z,I1_B#L
51Testing软件测试网bNj5[uo9]s$V

图 (04)51Testing软件测试网0mjH0I5^T7y5H


#j,Lh}iXI r1v0
/u'dthA*m1t0就先说这4点,在看到这4点后,读者可以先试试如何把这4点写成函数。51Testing软件测试网 H7|7XC1D4fh,E
首先,针对这个错误的比较,我们的前提是错误类型字眼的出现,为此我们先编写一个判断正则表达式的函数。51Testing软件测试网^jqX%q3x*a
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
|5n b-bb0F0' RegExpbld 正则表达式的判断
0[:A k yX_0'
_m&N:K$L$w\Q0'参数51Testing软件测试网RP%r4T}K8pXb
' patrn               正则表达式51Testing软件测试网E+~]QbHw
' strng               字符串51Testing软件测试网`+GfgG
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''51Testing软件测试网;S5C5f2|R:[s

,L(bg"zL4M0Public Function RegExpbld(patrn, strng)51Testing软件测试网 W G[WP2~A*Z
Dim regEx, retVal                      ' 建立变量。51Testing软件测试网'Xh'W1__'P
Set regEx = New RegExp         ' 建立正则表达式。51Testing软件测试网|SzT.y$[*x G
regEx.Pattern = patrn             ' 设置模式。51Testing软件测试网"A6US5Uc1q
          regEx.IgnoreCase = true          ' 设置是否区分大小写。51Testing软件测试网$D @b8C4sOZE
          retVal = regEx.Test(strng)         ' 执行搜索测试。
8AT Xl8P,WF0        RegExpbld=retVal51Testing软件测试网T.O$Q r,A"p0W&f
End Function
2M+g+T9~p|6y051Testing软件测试网;OB j;d-A1v K$N5[ PP
其次,第1,2,4点的函数编写实现难度不高。好比第1点中,我们只需要取出 Browser的标题,并使用上面的表达式函数便可以51Testing软件测试网P2mW%j{C5M,[
-1 RegExp = "错误|error|无法"    ‘这个是我们简单编写的正则表达式
a~N-?P9s`0-2 title=browser("Google").getroproperty(“title”)51Testing软件测试网$R'w:g1lG
-3 if RegExpbld(RegExp, title) then51Testing软件测试网:_](?(Z8eV2y6m
-4   '如果出现这些错误的字样则报错51Testing软件测试网RF\~ [&WSV l
-5 end if
9Xa!Q})_0但在第2点中,需要提醒大家的是,捕获这个错误的URL,不仅仅是当前页面的URL,我们还需要取出在页面中所有frame的URL做对比。
&\:q K@ n$PmZ9K9@0'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
_7Q@b6?dI0' 参数51Testing软件测试网3|4KU4|rT8s
'error_url        公司内部自定义的错误页面跳转URL,可以写成数组之类去进行比较51Testing软件测试网4x4d4}zgx
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''51Testing软件测试网`a|%o,d9r
51Testing软件测试网{mB]&nY9W1n8w
-1        Dim FramesObj
3W"H*T%r{0-2        Set FramesObj =browser("Google").Page("Google").Object.frames   51Testing软件测试网 _f#m ~RHN7QKi
-3        For i=0 to FramesObj.length-1
v kJ ]wx+Q0-4            If FramesObj (i).getroproperty("url")= error_url        Then
vfe)]WLbx8uRS0-5                         '如果为true就是某个frame已经跳转到指定的URL
?1d5Wj4]$dPG0-6                End If51Testing软件测试网khWi:[Q
-7        Next
1L1lJ ?"fR0XS ?2@0
ti2c,j&g4_{*J:J0再次,我们针对第三点,我们查错的标准是当前页面中是否出现了类似第1点中的错误字样:"错误|error|无法"。但是如何实现呢,在这里简单介绍3个方法。51Testing软件测试网 TxPW&X#}xL/`%s-b
第一:通过QTP自带的TextUtil对象去做页面字体捕获。51Testing软件测试网Bp:n@*gtI F&N
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''51Testing软件测试网 h*]%p)\9YD.V@
' QTP_DocIsLive 通过TextUtil 对象判断页面是否存在某个特定错误字样
G f h.L$[P,{0'
4GK `&iq!Q)@MX'u0'参数
R {:JX+nQ,sG3u0'无
_;k B.h |6i'j M0''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''51Testing软件测试网:^z"qp:u9bZ7@D

N%U Qgo5O/r]&B0Public Function QTP_DocIsLive()
jW RJ\x4Gi0Dim Src_text,patrn51Testing软件测试网+S:Qw3t$O,|r|x
Src_text=TextUtil.GetText(0, 20, 20, 2000, 2000)   '窗口的大小需要根据实际去定义51Testing软件测试网 _3i)H%eo%m^ D
patrn="错误|error|无法"   
0K.Yk]~7yu-z \0If RegExpbld(patrn,Src_text) Then
.j Zz$q#D$R)t2Ap%j0QTP_DocIsLive=true
M;M%B$u3d LJ0        Exit Function
9QnL7?R7k,j+Y^'X0End If
~ j;V U'kc^1w0QTP_DocIsLive=false         51Testing软件测试网%uYK*t@4w'@
End Function51Testing软件测试网;d(u(D,Vi8I
  
m!w|m$G%A5e7J/T*l%e0  优势:原理简单,甚至能查找到不可预知的msgbox中的内容。51Testing软件测试网*o'p(vc5y/Y1a0T3z
  弊端:QTP本身对这个TextUtil的支持并不是做得很完善,导致了方法是使用过程中,偶尔会与Window Explorer 冲突,导致了使用函数完后,Window会出现某些异常情况。
MP`0x+ew0
$D"C `'f eo0   第二:通过浏览器自带的查找功能。
5m+XP0kA.m3FQ0
e\lCMhE7E5Ye#Bk0'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''51Testing软件测试网 @ N;HD&x)J
' New_Page_Docfind 通过IE 自带查找功能判断页面是否存在某个特定错误字样
~$]2LyLXEt0'51Testing软件测试网%vH$T)[ VM-_8J5KC
'参数
2{#Q/GIp)v0' New_Page_Doc    用户自己输入的查找字样,不支持正则表达式,需要自己编写循环查找
o5_;{!|!rk,e0''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
rq]tR0n+b2] nKE051Testing软件测试网3L"C/AEO(^q
Public function New_Page_Docfind(New_Page_Doc)
B%mE/GK]e4`0        Dim oShell
T-p ~0VD)c4` p0        Set Shell=CreateObject("WSCript.shell")
m@h P$CIbQ'b+Y0        oShell.sendkeys  "^f"        '发送”Ctrl+F”调出查找功能
TmT@X LQ0        browser("browser").Window("查找").Page("查找").WebEdit("WebEdit").Set New_Page_Doc        '设置搜索文本的内容,用户需要自己添加对象或者修改成描述语言
%vr*P,N [e"i|0        browser("browser").Window("查找").Page("查找").WebButton("查找下一个(F)").Click51Testing软件测试网4[G#E-v/c$NWB
'点击查找按钮
kT:x^l&@H0        If browser("browser").Window("查找").Dialog("Microsoft Internet Explorer").Exist  Then
7C/yy!lE;TL[#b| H4C0            browser("browser").Window("查找").Dialog("Microsoft Internet Explorer").Close51Testing软件测试网_/\;T6[?0jR
                        wait(0.1)
S#D&\eOR6S] B0                        oShell.sendkeys  "%u"
1Cl4lf m ~U8z0                        browser("browser").Window("查找").Page("查找").WebButton("查找下一个(F)").Click51Testing软件测试网ah%z{/}w g+A
                        If browser("browser").Window("查找").Dialog("Microsoft Internet Explorer").Exist  Then51Testing软件测试网0MH.Wj9I PZ F*O
                                browser("browser").Window("查找").Dialog("Microsoft Internet Explorer").Close51Testing软件测试网2\YMu-~o2eU
                                New_Page_Docfind=false51Testing软件测试网7asc(Y0i0OO
                                browser("browser").Window("查找").Close51Testing软件测试网-@(L@1] |
                                else51Testing软件测试网$R+Yc"Q5Y4c5CUx
                                New_Page_Docfind=true
9Y^\!@V(b/n(}9X0                                browser("browser").Window("查找").Close
0j-^ fe0q sfa0                        end if51Testing软件测试网+X)O"k%p:Q8D
     else
2f ]6m3awC.SP|&{c0                        New_Page_Docfind=true
3q'O~ oQ~)f0                        browser("browser").Window("查找").Close
BA1m/B(`?!K0        End If
~2c8_,J^W0        Set Shell=Nothing51Testing软件测试网)bG9ro3GC\1Ya+u8@
End Function51Testing软件测试网Ir$r:jOR

*auc_-~0优势:针对某个特定字眼查找速度快,准
Wk)x*J5r"_0      51Testing软件测试网,p GE+H0H$s]s
弊端:如果特定字眼多,会导致速度下降,界面闪动较为厉害
!yX)r*@]j;C0      函数中的某些对象是建立在对象库的基础上的,移植效果差强人意。51Testing软件测试网 XZ%O t1W1|R9~O _
      不能同时对多个Frames做查找,需要点击触发
sQ R8ch Za G051Testing软件测试网%wR'j!`*?F:q5D
第三:使用DocumentElement 对象。
!ElTa5e*m,Y(N+x051Testing软件测试网 Hi!^.G"u xp.Z
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Ryo*?c0' New_Page_DocExist 使用DocumentElement 对象判断页面是否存在某个特定错误字样51Testing软件测试网5W:yn deM7{
'
j9a7K}_ _ V d0'参数
O]3I7[d$Oq&`x+D{0' reg    正则表达式
0j9b Z Ad2Z Q0''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
r5v!Cm~u%pB0Public Function New_Page_DocExist(reg)51Testing软件测试网Ab&fzc)Vc
Dim Page_doc_a,Page_doc_b,Page_doc_c,str,oDesc,frame_obj,logie,child_a51Testing软件测试网6V:@H7F5e4g?g({'l
          str=browser("browser").GetROProperty("title")51Testing软件测试网"yK%q9z/n[[b
          If browser("browser").page("index:=0").Exist Then
gFm6g k%e;R bZdq0                          Set Page_doc_a=browser("browser").page("index:=0").Object.documentElement.all.tags("body")51Testing软件测试网)g Y7H7Fd |/qF6AEK
                        For each Element in Page_doc_a51Testing软件测试网)W#R| G^
                                str=str+"  "+Element.outertext51Testing软件测试网.[!Qi _w*\ dw
                        Next51Testing软件测试网g'_s0_`
                        Set Page_doc_b=browser("browser").page("index:=0").Object.documentElement.all.tags("input")
Dl;T]c#Y:g6|N*j1SO0                        For each Element in Page_doc_b51Testing软件测试网0i uZa#L
                                str=str+"  "+Element.value51Testing软件测试网y d;a5e6Ri
                        Next
*` f4z_~@0                        Set Page_doc_c=browser("browser").Page("index:=0").Object.documentElement.all.tags("SPAN")51Testing软件测试网H4z,rDm!R@'tNX
                        For each Element in Page_doc_c51Testing软件测试网4Z_%Uj$B"s.~ {x
                                str=str+"  "+Element.outertext
dC4appI(\0                        Next51Testing软件测试网V'\ z!d'c
                        Set Page_doc_a=nothing51Testing软件测试网 Y8q,V0d;}-IP(S
                        Set Page_doc_b=Nothing
@wJ T:ASB e0                        Set Page_doc_c=nothing51Testing软件测试网@V[jo%B o"D
          End if51Testing软件测试网-L^Ha^ Z
          
K]#_hugf0^0        frame_count=browser("browser").page("index:=0").object.frames.length
2T P4i;l.N0        If frame_count<>0 Then51Testing软件测试网E!q;l[+f-p
            Set Desc = Description.Create()51Testing软件测试网I.N'p!k"D2V7a*M
                        oDesc("html tag").Value = "iframe"
#a FCJ/m g r2w0                        set frame_obj = browser("browser").page("index:=0").ChildObjects(oDesc)  
a!xAzErE0                        For i=0 to frame_count-1
kQ_*zG&L,k9j0                                        set Page_doc_a=frame_obj(i).Object.documentElement.all.tags("body")51Testing软件测试网| eNk QvW gF
                                        For each Element in Page_doc_a
$Ol M S5U%HC3S0                                                        str=str+"  "+Element.outertext51Testing软件测试网rJ{_ o!c2R
                                        next51Testing软件测试网:y!}(c!c:z_L{d8y
                                        set Page_doc_b=frame_obj(i).Object.documentElement.all.tags("input")
p E.\XC7D4GV0                                        For each Element in Page_doc_b51Testing软件测试网5uM^\ISI
                                                        str=str+"  "+Element.value51Testing软件测试网rc+{,r9wR,G1VB
                                        Next51Testing软件测试网 UULF4oQ
                                        set Page_doc_c=frame_obj(i).Object.documentElement.all.tags("SPAN")51Testing软件测试网 bt1T W%F Y'RX`H
                                        For each Element in Page_doc_c51Testing软件测试网 G"~_-J"V+K%H;K{
                                                        str=str+"  "+Element.outertext51Testing软件测试网8uX.iL#P`h
                                        next51Testing软件测试网Vt/J:UH/ud{8m|
                                        set Page_doc_a=nothing51Testing软件测试网/PE`*D\1LQ
                                        set Page_doc_b=Nothing51Testing软件测试网~CvLN
                                        set Page_doc_c=nothing
)aI9g qY Y_X9P0                        Next
)Q}K(Rxdr l0        End If
OCyLnt*l6m:g0        str=str+"  "+browser("browser").WinStatusBar("msctls_statusbar32").getroproperty("text") ' WinStatusBar的对象需要自己添加进对象库
#|o'J'm)x.J0        New_Page_DocExist=RegExpbld (reg,str)
-X:a*zI2sP0End Function
uh q4HPS atvV051Testing软件测试网A:T3x8T&s g%t
优势: 方法编写能把标题捕获,状态栏捕获也加进去
U!JU)RE/]i0       捕获的字样比较全面,较为准确
0fn8Ajcr\2GFF0       可移植强
o4\y;{5pMHO051Testing软件测试网u Dy_H)f kpA&I6z
弊端: 使用正则表达式做判断时候时间较长。
u8B2]/[^0
4^7E^;`l,k8e X0    看完这3个方法后,可能有人会有疑问,那究竟这样真的能够抓到错误吗?在这里,我们只需要再编写多一个截图的功能,并且在跑动脚本过程中只要出现我们定义的“错误”就截图,为的是宁杀错,不放过的精神。值得一提的是,这查找“错误”的方法也适合测试人员在做翻译查找中。因为许多的多语言版本的软件,在翻译方面或者会有漏网之鱼。51Testing软件测试网oEI V6J$GO ~?7w#e|

LA3K,_,k*jGS/Z0[本帖最后由 假装不在 于 2009-4-29 00:13 编辑]51Testing软件测试网5Bf!NHv
51Testing软件测试网vXA+yMna2\7W
51Testing软件测试网'h&uT'aqR

本文收录于《51测试天地》电子杂志第十三期。51Testing软件测试网)bQ+k+MUk4hN

51Testing软件测试网2~-mJ%@2m N\'Yt2\

版权声明:本文出自51Testing软件测试网电子杂志——《51测试天地》第十三期。51Testing软件测试网及相关内容提供者拥有51testing.com内容的全部版权,未经明确的书面许可,任何人或单位不得对本网站内容复制、转载或进行镜像,否则将追究法律责任。

zIrOQp m/hr051Testing软件测试网Rc|!H'E%y-P Y

TAG:

假装不在 假装不在 发布于2009-04-29 01:04:02
晚上逛了jifeng的博客发现了createTextRange 这个方法,在速度上比第三步中运行速度要快很多。
8}z(d)K6m0aMTB*|n,~软件测试,软件测试论坛,软件测试方法,软件测试工具,软件测试流程,软件测试培训,软件测试外包,软件质量管理 ,软件缺陷跟踪,软件配置工具大家可以学习学习。所以第三个方法可以做下简单的修改,然速度提高。同时第3个方法修改时候,需要注意2点51Testing软件测试网Q1`,X        IU,GR
1、不过这个方法的使用在对按钮的VALUE没有做捕获功能,同样需要再写。51Testing软件测试网v4ys!T
R
~%X$c5G

2、createTextRange的方法同样在使用过程中需要对frame做个遍历,如果只设置当前的page.object.body会抓不到frame内部的东西(可以玩玩163)
zW(ZWy"Xl|O软件测试,软件测试论坛,软件测试方法,软件测试工具,软件测试流程,软件测试培训,软件测试外包,软件质量管理 ,软件缺陷跟踪,软件配置工具@1r~P~
AYL

学习永无止尽... 中国软件测试人的精神家园,介绍先进的软件测试工具、 软件测试流程和软件测试思想,定期举办软件测试沙龙,软件测试精品 资料下载,提供专业的软件测试培训服务8LOw;QkkHV%V
低调发帖,华丽路过。
假装不在 假装不在 发布于2009-04-29 01:05:31
季风的博客是:
&WZ5CP/shttp://www.51testing.com/?92935
+V I!Mu \N'WS]~`YH中国软件测试人的精神家园,介绍先进的软件测试工具、 软件测试流程和软件测试思想,定期举办软件测试沙龙,软件测试精品 资料下载,提供专业的软件测试培训服务大家去踩踩有用的东西。 E#R_4`{|u1I)_&cV
www.51testing.com:q8l9p9G8g+HpL_
低调发帖,华丽路过。
刘沛的测试空间 zte_boy 发布于2009-04-29 11:23:09
打广告呢?哈哈
假装不在 假装不在 发布于2009-04-29 14:46:03

QUOTE:

原帖由 zte_boy 于 2009-4-29 11:23 发表 软件测试 - 软件测试论坛 - 软件缺陷跟踪 - 软件配置工具 - 测试用例设计 - Web测试 -  自动化测试工具xd;T?
打广告呢?哈哈
中国软件测试人的精神家园,介绍先进的软件测试工具、 软件测试流程和软件测试思想,定期举办软件测试沙龙,软件测试精品 资料下载,提供专业的软件测试培训服务/`!Yq)j(t)`P
软件测试 - 软件测试论坛 - 软件缺陷跟踪 - 软件配置工具 - 测试用例设计 - Web测试 -  自动化测试工具r2wqNg
51Testing软件测试网-f9Nu        ?){y6w(^g)u
不是,这叫友情链接。
我来说两句

(可选)

Open Toolbar