51Testing软件测试论坛

标题: 如何让QTP在大量列表中勾选出需要的数据? [打印本页]

作者: kangaroo    时间: 2007-8-29 19:08
标题: 如何让QTP在大量列表中勾选出需要的数据?
要在一列姓名列表中找出所需要的人,并在其前面勾选上。录制的脚本直接按row来数行数

Browser("AA").Window("AB-Web").Page("AB").WebCheckBox("all_2").Set "ON"
Browser("AA").Window("AB-Web").Page("AB").WebCheckBox("all_3").Set "ON"

这也能解决问题,但存在一个潜在隐患:如果姓名列表发生变动,脚本就不正确了。

我想一劳永逸。如何能够让QTP自动寻找到目标姓名行,并在其前面完成钩选动作?

参见附图:
作者: 风过无息    时间: 2007-8-29 19:24
在我测试的项目里.WebCheckBox有个属性就是value,就是楼主要的名称,你参数化了就可以了.
作者: kangaroo    时间: 2007-8-29 19:34
用spy看每行的 class 为  web element
各行的区别在 innertext,分别为每行的内容——人名

复选框的 class 为 web check box
各复选框之间的区别好像是 outerhtml 的 values各不一样,其中也包含有对应的人名

我的思路是:
1. 按照innertext属性来找到对应的行,再在对应的复选框里勾上
2. 或者直接按复选框的outerhtml属性来查找、选择。 但spy可以看到outerhtml属性,选到对象库里就看不到这项属性了,不知能否办到

目前只有思路,但不知道怎么实现。请各位高手指教!
作者: kangaroo    时间: 2007-8-29 19:40
原帖由 风过无息 于 2007-8-29 19:24 发表
在我测试的项目里.WebCheckBox有个属性就是value,就是楼主要的名称,你参数化了就可以了.


没明白。你是指如图所式的value?这个值为ON,好像不能按你所言……

[ 本帖最后由 kangaroo 于 2007-8-30 11:08 编辑 ]
作者: kangaroo    时间: 2007-8-30 11:08
或者是指WebCheckBox的value属性?我查过了,这个属性是数字,目前还不知道这些数字的含义,但要靠它来查可能性不大
作者: kangaroo    时间: 2007-8-30 14:21
any help?
作者: jackymail    时间: 2007-8-30 15:23
你自己不是说了吗,innertext不一样,那就用innertext来做对象识别主要属性就可以了。
录制其中一个对象,然后动态修改对象的innertext属性。Object(description).SetTOProperty Property, Value

原帖由 kangaroo 于 2007-8-29 19:34 发表
用spy看每行的 class 为  web element
各行的区别在 innertext,分别为每行的内容——人名

复选框的 class 为 web check box
各复选框之间的区别好像是 outerhtml 的 values各不一样,其中也包含有对应的人 ...

作者: jackymail    时间: 2007-8-30 15:24
还有建议下次不要使用英文
"录制的脚本直接按row来数行数" 这句话很酷
我翻译过来就是
录制的脚本直接按行来数行数
作者: kangaroo    时间: 2007-8-30 16:40
标题: 回复 #7 jackymail 的帖子
我猜可以这么办,但……我不知道怎么实现。才自学一个月,只会录脚本,看脚本,用脚本生成器写简单脚本,但这种按思路写程序----我真的不会sdlkfj1

估计要用到GetTOProperty之类的命令吧.
作者: jackymail    时间: 2007-8-30 16:41
再学一段时间就行了,先把这个问题放一下。
作者: kangaroo    时间: 2007-8-30 16:52
标题: 回复 #10 jackymail 的帖子
sdlkfj9
可是这个问题现在就要解决,这是头儿的命令
作者: 木卫十二    时间: 2007-8-30 17:22
我也碰到相同的问题。

感觉不好实现,因为WebCheckBox和用户名的WebElement两个对象是独立的,没有相关联的关系。所以根据UserName选CheckBox不知道通过哪里关联。。。期待高手回复。。

另,WebCheckBox的value属性是和它的排序有关的吧。我的环境是从零加一递增的。。。
作者: kangaroo    时间: 2007-8-30 17:40
标题: 回复 #12 木卫十二 的帖子
是这样的,WebCheckBox的value属性是按排序从0递增的

另: 在我的环境里用Highlight in Application查看,WebCheckBox是在WebElement里面的.这两个对象的outerhtml属性有一段是相同的,
WebChekBox的outerhtml属性:
<INPUT type=checkbox value=11 name=all is_used="1" user_name="aaron.gao">
WebElement的outerhtml属性:
<TD><INPUT type=checkbox value=11 name=all is_used="1" user_name="aaron.gao"> aaron.gao </TD>
而且这段里包含有我需要的user_name
不晓得能否利用到这一点
作者: 木卫十二    时间: 2007-8-30 18:12
我比较不幸,outerhtml也没有关联!幸好上头没要求必须要这样实现。sdlkfj5

即然这样,是否可以将outerhtml取出,用正则表达式判断用户名是否在里面,是则选中。

正则表达式我还没得空研究,不过猜想应该能实现这个功能吧。。。

供你参考sdlkfj2
作者: kangaroo    时间: 2007-8-30 18:34
我又有一个思路,名单就是个只有一列的表,把这个表的内容取出来查,这样比较好实现.

还有,把 WebCheckBox 做为 WebElement 的 ChildItem去操作,似乎可以解决两者关联问题.

不过,这里要设计到VB Script循环语句, ChildItem, 循环次数的设定……

待我研究下----真给逼上梁山了
作者: kangaroo    时间: 2007-8-30 20:02
吼吼!!!问题解决了!!!

row = Browser("AA").Window("AA-Web").Page("AB").WebTable("ALL").RowCount
For i=1 to row -1
    If  Browser("AA").Window("AA-Web").Page("AB").WebTable("ALL").GetCellData(i, 1) = " sheila.shi "    Then
  Browser("AA").Window("AA-Web").Page("AB").WebTable("ALL").ChildItem(i,1,"WebCheckBox",0).Set "ON"
(
上句也可换为:
Set obj = Browser("AA").Window("AA-Web").Page("AB").WebTable("ALL").ChildItem(i,1,"WebCheckBox",0)
obj.Set "ON"
)
    Exit for
    End If
Next

下面就是对" sheila.shi "参数化了.

注意:
1. WebTable("ALL")必须是包含且只包含所有WebElement的表格, 注意和其他WebTable的区分.
2. If语句里=后的 " sheila.shi " 要注意引号里的空格, 是否该有空格可以通过table checkpoint里的configure value来确定.如果和checkpoint里的不一致会找不到目标对象.

这是最后一个思路的解决办法. 前面的思路似乎也是可行的. 谁能给出前面思路的解法?

[ 本帖最后由 kangaroo 于 2007-8-30 20:16 编辑 ]
作者: 木卫十二    时间: 2007-8-31 09:47
恭喜恭喜,也借来用用sdlkfj6
作者: kangaroo    时间: 2007-8-31 11:07
如何对" sheila.shi "参数化?我又搞不定了。原来都是在keyword view里操作,现在不行了

help!!!!
作者: kangaroo    时间: 2007-8-31 11:57
问题又解决一项!!参数化就用这句:
If  Browser("AA").Window("AA-Web").Page("AB").WebTable("ALL").GetCellData(i, 1) = DataTable("ConfCall_All", dtLocalSheet)    Then
踏破铁鞋无觅处,得来全不费工夫。原来就这么简单地替换以下就搞定!!嘻嘻嘻嘻
作者: yabest    时间: 2007-8-31 15:29
其实不用那么麻烦的找关联关系,不用钻牛角尖,想一个通用直观有效的方法,就是根据坐标来定位某个对象相应的WebCheckbox

吐血大奉献,写了一个通用函数,可以一劳永逸的解决类似问题,适合各种情况
  1. '================================================================
  2. ' FUNCTION NAME:
  3. '        FindCheckBox
  4. ' FUNCTION DESCRIPTION:
  5. '        Find the corresponding webcheckbox of title object in parent object, and output the webcheck
  6. ' FUNCTION USAGE:
  7. '        Set parentObject = Browser("ATS Login").Page("ATS Login").Frame("mainRight")
  8. '        Set titleObject = Browser("ATS Login").Page("ATS Login").Frame("mainRight").Link("test")
  9. '        ret = FindCheckBox(parentObject, titleObject, checkBoxObject)
  10. '        checkBoxObject.Set "ON"
  11. ' FUNCTION PARAMETER
  12. '        ParentObject: The parent object of title object and webcheckbox object
  13. '        TitleObject:        The title object
  14. '        CheckBoxObject: [Output Param] Output the corresponding webcheckbox object of title object
  15. ' FUNCTION RETURN:
  16. '        0:        Success to find and output the corresponding webcheckbox object of title object
  17. '        -1:        Fail to find the corresponding webcheckbox object of title object
  18. ' FUNCTION ORIGINAL CREATOR:
  19. '        yabest
  20. ' FUNCTION CREATION DATE:
  21. '        2007-08-30
  22. ' FUNCTION UPDATE HISTORY:
  23. '===============================================================
  24. Function FindCheckBox(ByVal ParentObject, ByVal TitleObject, ByRef CheckBoxObject)

  25.         Dim titleObjectY1, titleObjectY2, curChildObjectMidY
  26.         Dim checkBoxDesc, childObjects
  27.         Dim childNum, childIndex, findIndex

  28.         'Get the title object's top/bottom y position
  29.         titleObjectY1 = CInt(TitleObject.GetROProperty("abs_y"))
  30.         titleObjectY2 = CInt(TitleObject.GetROProperty("abs_y")) +  CInt(TitleObject.GetROProperty("height"))

  31.         'get all webcheckbox objects
  32.         Set checkBoxDesc = Description.Create()
  33.         checkBoxDesc("micclass").Value = "WebCheckBox"
  34.         Set childObjects = ParentObject.ChildObjects(checkBoxDesc)

  35.         'search the webcheckbox according y position.
  36.         childNum = childObjects.Count
  37.         findIndex = -1
  38.         For childIndex = 0 to childNum-1
  39.                 Set curChildObject = childObjects(childIndex)
  40.                 curChildObjectMidY = CInt(curChildObject.GetROProperty("abs_y")) + CInt(curChildObject.GetROProperty("height"))/2
  41.                 'the webcheckbox should be:   (y+height/2) in [titleObjectY1, titleObjectY2] area
  42.                 If curChildObjectMidY>=titleObjectY1 and  curChildObjectMidY<= titleObjectY2 Then
  43.                         findIndex = childIndex
  44.                         Exit For
  45.                 End If
  46.         Next

  47.         'if not found, return fail
  48.         If findIndex = -1 Then
  49.                 FindCheckBox = -1
  50.                 Exit Function
  51.         End If

  52.         'if found, return success
  53.         Set CheckBoxObject = curChildObject
  54.         FindCheckBox = 0
  55.         
  56. End Function
复制代码

[ 本帖最后由 yabest 于 2007-8-31 15:35 编辑 ]
作者: kangaroo    时间: 2007-8-31 18:00
天呐!这么长的代码!!我有心理阴影!!!
谢谢yabest如此慷慨。
今晚啥也不用吃了,直接啃代码了
作者: yabest    时间: 2007-8-31 23:42
原帖由 kangaroo 于 2007-8-31 18:00 发表
天呐!这么长的代码!!我有心理阴影!!!
谢谢yabest如此慷慨。
今晚啥也不用吃了,直接啃代码了


晕,你没看大部分是注释和使用说明啊,代码其实没多少!
而且是通用函数,只写一次的。所以要写的完善一点,使用起来就很爽啦!偷懒写的不好的话,使用起来就痛苦!
作者: 51mobile    时间: 2007-9-1 15:15
标题: 回复 #22 yabest 的帖子
yabest,真的是高手
作者: kangaroo    时间: 2007-9-3 14:16
标题: 回复 #22 yabest 的帖子
对我这种才自学一个月,只会写三行代码的人来说…………
偶像!!我要向你学习!
作者: C060706    时间: 2007-9-6 15:40
佩服佩服。。。
请教请教。。。
作者: black.sam    时间: 2007-9-6 17:06
dim obj_desc
set obj_desc = Description.Create
Obj_desc("html tag").value = "INPUT"
Obj_desc("type").value = "checkbox"
dim allcheckbox,onecheckbox
set allcheckbox = Browser("Browser").Page("Page").ChildObjects(obj_desc)
for each onecheckbox in allcheckbox
  onecheckbox.set "ON"
next

我在http://blog.csdn.net/black_sam/archive/2007/09/05/1772656.aspx里写了一篇关于descriptive programming的

[ 本帖最后由 black.sam 于 2007-9-6 17:07 编辑 ]
作者: kangaroo    时间: 2007-9-10 12:22
原帖由 black.sam 于 2007-9-6 17:06 发表
dim obj_desc
set obj_desc = Description.Create
Obj_desc("html tag").value = "INPUT"
Obj_desc("type").value = "checkbox"
dim allcheckbox,onecheckbox
set allcheckbox = Browser("Browser").Page( ...


谢谢black.sam的分享。
对你的脚本我有些地方看不明白。我先解释一下我对你脚本的理解,看我说的对不对吧
第一二行是定义了一个object:obj_desc即我们要用的check box(第一次看到Description.Create理解可能有偏差);
第三四行是为obj_desc的两个属性heml tag和type分别赋值;
第五六行定义变量allcheckbox为obj_desc的所有子对象集;
第七八九行为一个for each-next循环,在allcheckbox定义之内的onecheckbox都会执行第八行set "ON"的命令,即在对应check box里打勾,不断循环、打勾,直到循环结束,所有目标项都被选择了。程序结束

不知是不是你程序没写完全,我没明白
1.为什么没有对onecheckbox赋值?难道它只是充当一个指针的作用?(偶没编程经验)
2.从哪个变量来控制/输入我要选出的对象?莫非是对html tag这个属性进行参数化?那循环时Obj_desc("html tag").value = "INPUT"只运行过一遍,如何保证所有预定目标项都被选择了?
作者: wlcking    时间: 2007-9-11 11:37
onecheckbox是你要选择的checkbox,通过for each next,从allcheckbox中查找,如果存在你要选择的onecheckbox就set "ON"
作者: liujihui226    时间: 2007-9-11 12:16
sdlkfj6
作者: liujihui226    时间: 2007-9-11 12:16
原来这么麻烦啊
作者: kangaroo    时间: 2007-9-11 13:36
原帖由 wlcking 于 2007-9-11 11:37 发表
onecheckbox是你要选择的checkbox,通过for each next,从allcheckbox中查找,如果存在你要选择的onecheckbox就set "ON"


如果要勾选出多个,如何对上述脚本参数化?如果onecheckbox就是要选择的checkbox,那是否只要再加一个对onecheckbox的参数化赋值,然后在循环内加一句 DataTable.SetCurrentRow(tb_i+1)就可以把所有数据都运行一遍?还是onecheckbox本身就是个datatable,for each-next循环会自动运行下一行数据?  迷惑中
作者: wlcking    时间: 2007-9-11 14:37
要勾选多个就多用几次for each next,对onecheckbox参数话就行了,for each next就是在一个集合里查找值,查找到了就执行for each next下的语句
作者: 看雪时节    时间: 2007-9-11 15:01
1:首先在OR里添加Table。
2:利用childItem(,“WebCheckBox”,0).set “On”
   其中还要用到webTable的RowCount、GetCellData方法
作者: cswxp_11    时间: 2007-9-11 15:16
真是受益匪浅,仔细看看
作者: linnawang    时间: 2007-9-21 10:15
好好研究下,好东西
作者: three116    时间: 2007-9-21 12:53
不错  好方法 ,  我是直接查看 checkbox的命名方式,然后寻找checkbox,再进行设置,不过方法不通用
作者: qicyt1812    时间: 2007-10-9 16:05
哈哈,看来得好好学学VB的语法了
作者: Jimmyshao    时间: 2007-10-9 16:29
GetRowWithCellText这个函数能根据你后面的文字内容返回当前在table中的Row的值
然后根据row的值用WebCheckBox("index:=&Row&").Set "ON"
作者: nanice    时间: 2008-8-30 17:54
sdlkfj6
作者: 5555    时间: 2008-11-4 17:17
标题: 回复 20# 的帖子
好脚本,收藏了~
作者: meizi1984330    时间: 2010-9-13 18:06
我也遇到过这个问题,当时测试的时候变化值是帐号ID,这个帐号ID是从数据库根据帐号名称获取的,然后把获取的帐号ID参数化
作者: lyscser    时间: 2010-9-14 01:25
建议QTP也分个新手区和入门区




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