(转)如何让QTP在名单列表中勾选出需要的人?

上一篇 / 下一篇  2008-12-19 16:16:53 / 个人分类:QTP

要在一列姓名列表中找出所需要的人,并在其前面勾选上。录制的脚本直接按row来数行数
'~X$K I,[2D\Dgz138711
(padb&I+BCl2a/|138711Browser("AA").Window("AB-Web").Page("AB").WebCheckBox("all_2").Set "ON"
'}p+f0dKq138711Browser("AA").Window("AB-Web").Page("AB").WebCheckBox("all_3").Set "ON"
ha FlRA)Z:{138711
Kuq%H$J3|/e138711这也能解决问题,但存在一个潜在隐患:如果姓名列表发生变动,脚本就不正确了。
2V ]%gk mQ13871151Testing软件测试网"n7~'O7F spWht
我想一劳永逸。如何能够让QTP自动寻找到目标姓名行,并在其前面完成勾选动作?
5a~_^o2F138711
yZ g Z+z138711参见附图:

我的思路是:
DifIWu |1387111. 按照innertext属性来找到对应的行,再在对应的复选框里勾上
?1s4}UchDe X d1387112. 或者直接按复选框的outerhtml属性来查找、选择。 但spy可以看到outerhtml属性,选到对象库里就看不到这项属性了,不知能否办到51Testing软件测试网)w,]#\}4\.t;Z't

9Hc/wF)wQ!A138711***********************************************************51Testing软件测试网4gH$M-q$I
补充1:
z#~7LTnCfR138711***********************************************************51Testing软件测试网r^H#fe-~%p
WebCheckBox的value属性是按排序从0递增的
_!{*CY"r TJ13871151Testing软件测试网I.p/znIn
另: 在我的环境里用Highlight in Application查看,WebCheckBox是在WebElement里面的.这两个对象的outerhtml属性有一段是相同的,51Testing软件测试网.^;r^,P!}$~.RF2w
WebChekBox的outerhtml属性:51Testing软件测试网#Xd&Ul G[
<INPUT type=checkbox value=11 name=all is_used="1" user_name="aaron.gao">51Testing软件测试网4Oy&AD6I.bW
WebElement的outerhtml属性:
!o*t_ r,tEP8@A138711<TD><INPUT type=checkbox value=11 name=all is_used="1" user_name="aaron.gao"> aaron.gao </TD>
+l nwR2R j,g4z*O1r138711而且这段里包含有我需要的user_name51Testing软件测试网s9Ka!yfp
不晓得能否利用到这一点51Testing软件测试网4C,_K3[!c?

GI"t&v^JCkCx138711是否可以将outerhtml取出,用正则表达式判断用户名是否在里面,是则选中??51Testing软件测试网8C;^~(?$?(n4_8iy$K:t

!fxIB*{:DN13871151Testing软件测试网.{a$U pZ:w }
***********************************************************
v];f;JBH7seUi|p138711补充2:
N X0t5w@N-]3xVG138711***********************************************************51Testing软件测试网xw)F!}(N{i1M+w

,q p:G"a H`&^H138711又有一个思路,名单就是个只有一列的表,把这个表的内容取出来查,这样比较好实现.
u4f^\ h138711
_I&s Z)l&Q;\+Y4X138711还有,把 WebCheckBox 做为 WebElement 的 ChildItem去操作,似乎可以解决两者关联问题.
pf k"?%C Gc\13871151Testing软件测试网4gD6p5f`sbl
不过,这里要设计到VB scrīpt循环语句, ChildItem, 循环次数的设定……51Testing软件测试网w8DCP/]"V
51Testing软件测试网\1{9y!G,I;_E`
待我研究下----真给逼上梁山了
?C+`Z9q,Dy9]3R:]138711
*Tf$zs _o4k(K"]138711***********************************************************
k#rp#i:` L~i138711解答1:
i%_"a }#r0d&D138711***********************************************************51Testing软件测试网/HOJ2h c"xZ
51Testing软件测试网v _5U1Z*ws{%_
吼吼!!!问题解决了!!!
Iv [ZMm K8[P13871151Testing软件测试网+MsV];h,ON;|"M^
row = Browser("AA").Window("AA-Web").Page("AB").WebTable("ALL").RowCount51Testing软件测试网(z.\&C0q'f8jR#|
For i=1 to row -151Testing软件测试网 L `}a:Y
    If  Browser("AA").Window("AA-Web").Page("AB").WebTable("ALL").GetCellData(i, 1) = " sheila.shi "    Then51Testing软件测试网 iGXtP_(ND
  Browser("AA").Window("AA-Web").Page("AB").WebTable("ALL").ChildItem(i,1,"WebCheckBox",0).Set "ON"
7E_Kx4S#y138711(
F:OXte138711上句也可换为:
@7M^QK+y'Y/p138711Set ōbj = Browser("AA").Window("AA-Web").Page("AB").WebTable("ALL").ChildItem(i,1,"WebCheckBox",0)
$nK@0Ru138711obj.Set "ON"
yXFB}9A6?@138711)
ZP.P!z Mm138711    Exit for
]@'YL/l5p+h138711    End If
+l'TEB0Wc138711Next51Testing软件测试网-Op/P6D m _,I7SQ
51Testing软件测试网J _x-?7U;wvAd3?
下面就是对" sheila.shi "参数化了.51Testing软件测试网 k$Dr Y*a$zq$o
参数化就用这句:51Testing软件测试网#z:^+u9W.^*B$J2z4{'~4Z

cS9VhC138711If  Browser("AA").Window("AA-Web").Page("AB").WebTable("ALL").GetCellData(i, 1) = DataTable("ConfCall_All", dtLocalSheet)    Then51Testing软件测试网8Av'RHjZ7?:W

b5An'U,H9P#HL138711注意:
*Rt+M UrZ!T#I1387111. WebTable("ALL")必须是包含且只包含所有WebElement的表格, 注意和其他WebTable的区分.
!Du2[2U S%l5Oh1N }1387112. If语句里=后的 " sheila.shi " 要注意引号里的空格, 是否该有空格可以通过table checkpoint里的configure value来确定.如果和checkpoint里的不一致会找不到目标对象.本环境中引号与姓名之间各有一个空格,参数化后EXCEL表里姓名前后也要各留一个空格。8晓得怎么会这样。
LvC8PS!w a6]1K13871151Testing软件测试网W|h9B/i#}
51Testing软件测试网%WGAh)dT;bJ/Pp x

4?*?ho~%}5d'a138711这是最后一个思路的解决办法. 前面的思路似乎也是可行的.
*Lcl9{0Sm/`W P138711
0?9cI4}4X}&? M_138711哪位高手能给出前面思路的解法?

 
yabest给出了一个根据坐标来定位某个对象相应的WebCheckbox的通用函数,可以一劳永逸的解决类似问题,适合各种情况。(强啊,我的汗呐!)
8bS2e(aX138711
'================================================================
oUjs e7wq\!T`138711' FUNCTION NAME:51Testing软件测试网2P6G{8N;oq
'        FindCheckBox51Testing软件测试网 g3_sx1Jv
' FUNCTION DEscrīptION:
~Qd,p~138711'        Find the corresponding webcheckbox of title object in parent object, and output the webcheck
Nj e.G:_Z-BA/P138711' FUNCTION USAGE:51Testing软件测试网 ]"AAx(Lg
'        Set parentObject = Browser("ATS Login").Page("ATS Login").Frame("mainRight")
t+w0\nP g?(J:b138711'        Set titleObject = Browser("ATS Login").Page("ATS Login").Frame("mainRight").Link("test\")
!odS8a F I2adX9|138711'        ret = FindCheckBox(parentObject, titleObject, checkBoxObject)
joe#AqzF138711'        checkBoxObject.Set "ON"51Testing软件测试网 J;@*U4W2u V
' FUNCTION PARAMETER51Testing软件测试网g n:|Sz M
'        ParentObject: The parent object of title object and webcheckbox object
,Mr @p eq#j5xw^nF138711'        TitleObject:        The title object51Testing软件测试网6@Mcf _F
'        CheckBoxObject: [Output Param] Output the corresponding webcheckbox object of title object51Testing软件测试网]._Hr] KYR
' FUNCTION RETURN:
`b{8n)ms]Z W{138711'        0:        Success to find and output the corresponding webcheckbox object of title object51Testing软件测试网3O5V.Wa)PQ
'        -1:        Fail to find the corresponding webcheckbox object of title object
,q8K$j4kB L8v"?I138711' FUNCTION ORIGINAL CREATOR:51Testing软件测试网1J Y.vG w][ Ub*~
'        yabest
5t:Rt@&ot138711' FUNCTION CREATION DATE:51Testing软件测试网2L:q!y2d?
'        2007-08-30
w\BR-ke138711' FUNCTION UPDATE HISTORY:
:b4^X:z Sa0CQ8T/@138711'===============================================================51Testing软件测试网6iq k gV-H*L
Function FindCheckBox(ByVal ParentObject, ByVal TitleObject, ByRef CheckBoxObject)51Testing软件测试网NU^,o ^+v/d

$Zz Q4\(u*AS(z138711        Dim titleObjectY1, titleObjectY2, curChildObjectMidY51Testing软件测试网7B"?Z?m9Ew
        Dim checkBoxDesc, childObjects51Testing软件测试网'K i _ X `Ow!a{4pZ
        Dim childNum, childIndex, findIndex
W-j#aXF!ak~e13871151Testing软件测试网A]5D.s/H
        'Get the title object's top/bottom y position
o)S_C/R138711        titleObjectY1 = CInt(TitleObject.GetROProperty("abs_y"))51Testing软件测试网4IX[T]
        titleObjectY2 = CInt(TitleObject.GetROProperty("abs_y")) +  CInt(TitleObject.GetROProperty("height"))51Testing软件测试网.n2i8q0?J4R:c1_[
51Testing软件测试网@ Xy oB$[
        'get all webcheckbox objects
*p%P#mef f1b_'[V138711        Set checkBoxDesc = Descrīption.Create()51Testing软件测试网 e'|;Se-Ei"J-K5s
        checkBoxDesc("micclass").Value = "WebCheckBox"51Testing软件测试网;u$w;pQf9MIR3[
        Set childObjects = ParentObject.ChildObjects(checkBoxDesc)
5IP6v*z B13871151Testing软件测试网wv7@y1T;\(f
        'search the webcheckbox according y position.51Testing软件测试网9L*}K0QW2Wv
        childNum = childObjects.Count51Testing软件测试网VM5q:UZ~u8_p:B
        findIndex = -1
mwdvmav138711        For childIndex = 0 to childNum-151Testing软件测试网3DS,F9K:[ pO:h
                Set curChildObject = childObjects(childIndex)51Testing软件测试网#D$O dM1C"Gt
                curChildObjectMidY = CInt(curChildObject.GetROProperty("abs_y")) + CInt(curChildObject.GetROProperty("height"))/251Testing软件测试网 E'a3bx+r
                'the webcheckbox should be:   (y+height/2) in [titleObjectY1, titleObjectY2] area
R a3~)xdy UU3z138711                If curChildObjectMidY>=titleObjectY1 and  curChildObjectMidY<= titleObjectY2 Then51Testing软件测试网4H4s*IHB/X:G
                        findIndex = childIndex
r6u*y`,Xc*Y+q4\138711                        Exit For
b$g(s#GB-Br138711                End If
8W[s"P~ y2? G138711        Next
)E-}.gqW&x xb13871151Testing软件测试网 h*s*D-Q.}
        'if not found, return fail
6?\Hu9J v,{138711        If findIndex = -1 Then
vJR4b+m+i138711                FindCheckBox = -151Testing软件测试网hN'yB"ur
                Exit Function51Testing软件测试网m%?2aOr3d!zg)w(aE+_u
        End If
+mFL;_;?:V13871151Testing软件测试网1D6h.Mlc| ]E
        'if found, return success51Testing软件测试网,J3Et A'l)]
        Set CheckBoxObject = curChildObject51Testing软件测试网2V8K_*F8b:Z `
        FindCheckBox = 0
kAD-kyE g meY$A138711        51Testing软件测试网u9X^,\6G0O
End Function
 
 
black.sam又给出了个答案,的一眼没看明白,似乎是描述性编程,先拷贝过来。
dim obj_desc
#\!n3HBQp b138711set obj_desc = Descrīption.Create
6?X9X E g138711Obj_desc("html tag").value = "INPUT"
1e$Z5B2K1WI%A;hGD138711Obj_desc("type").value = "checkbox"
Oq1X r|gzt e138711dim allcheckbox,onecheckbox51Testing软件测试网q0RQ ~'X3i
set allcheckbox = Browser("Browser").Page("Page").ChildObjects(obj_desc)
"] Pe-emW a-xX)c138711for each onecheckbox in allcheckbox51Testing软件测试网.}R/\'h}b)d%m+s
  onecheckbox.set "ON"51Testing软件测试网u6~t Gici3J$|U
next51Testing软件测试网-T j @I#a)Gcx

k*}m @7l [E|138711black.sam在http://blog.csdn.net/black_sam/archive/2007/09/05/1772656.aspx里写了一篇关于descrīptive programming的
4dL#hFp S138711解释一下我对black脚本的理解:51Testing软件测试网f7EcxWzC
第一二行是定义了一个object:obj_desc即我们要用的check box(第一次看到Descrīption.Create理解可能有偏差);
mX)` l#tbU G138711第三四行是为obj_desc的两个属性heml tag和type分别赋值;51Testing软件测试网-TEd/V k/{(Q
第五六行定义变量allcheckbox为obj_desc的所有子对象集;51Testing软件测试网 i1| v7K-B
第七八九行为一个for each-next循环,在allcheckbox定义之内的onecheckbox都会执行第八行set "ON"的命令,即在对应check box里打勾,不断循环、打勾,直到循环结束,所有目标项都被选择了。程序结束51Testing软件测试网 mXU\t
51Testing软件测试网#e"|`)z/``7cd$D2{ a
不知是不是程序没写完全,我没明白51Testing软件测试网-Cv#o} oN4]
1.为什么没有对onecheckbox赋值?难道它只是充当一个指针的作用?(偶没编程经验)
-H%_s i0x1387112.从哪个变量来控制/输入我要选出的对象?莫非是对html tag这个属性进行参数化?那循环时Obj_desc("html tag").value = "INPUT"只运行过一遍,如何保证所有预定目标项都被选择了?
 
wlcking:
要勾选多个就多用几次for each next,对onecheckbox参数话就行了,for each next就是在一个集合里查找值,查找到了就执行for each next下的语句51Testing软件测试网:yQ)],p)B6m \7fu
看雪时节:
1:首先在OR里添加Table。
M$|^ ^5gT-l-?M1387112:利用childItem(,“WebCheckBox”,0).set “On”51Testing软件测试网~]\i|R%S9rh
   其中还要用到webTable的RowCount、GetCellData方法
51Testing软件测试网_"y-{\y8E

TAG:

 

评分:0

我来说两句

Open Toolbar