kangaroo 发表于 2007-8-29 19:08:07

如何让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:05

在我测试的项目里.WebCheckBox有个属性就是value,就是楼主要的名称,你参数化了就可以了.

kangaroo 发表于 2007-8-29 19:34:01

用spy看每行的 class 为web element
各行的区别在 innertext,分别为每行的内容——人名

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

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

目前只有思路,但不知道怎么实现。请各位高手指教!

kangaroo 发表于 2007-8-29 19:40:55

原帖由 风过无息 于 2007-8-29 19:24 发表 http://bbs.51testing.com/images/common/back.gif
在我测试的项目里.WebCheckBox有个属性就是value,就是楼主要的名称,你参数化了就可以了.

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

[ 本帖最后由 kangaroo 于 2007-8-30 11:08 编辑 ]

kangaroo 发表于 2007-8-30 11:08:53

或者是指WebCheckBox的value属性?我查过了,这个属性是数字,目前还不知道这些数字的含义,但要靠它来查可能性不大

kangaroo 发表于 2007-8-30 14:21:52

any help?

jackymail 发表于 2007-8-30 15:23:08

你自己不是说了吗,innertext不一样,那就用innertext来做对象识别主要属性就可以了。
录制其中一个对象,然后动态修改对象的innertext属性。Object(description).SetTOProperty Property, Value

原帖由 kangaroo 于 2007-8-29 19:34 发表 http://bbs.51testing.com/images/common/back.gif
用spy看每行的 class 为web element
各行的区别在 innertext,分别为每行的内容——人名

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

jackymail 发表于 2007-8-30 15:24:23

还有建议下次不要使用英文
"录制的脚本直接按row来数行数" 这句话很酷
我翻译过来就是
录制的脚本直接按行来数行数

kangaroo 发表于 2007-8-30 16:40:16

回复 #7 jackymail 的帖子

我猜可以这么办,但……我不知道怎么实现。才自学一个月,只会录脚本,看脚本,用脚本生成器写简单脚本,但这种按思路写程序----我真的不会sdlkfj1

估计要用到GetTOProperty之类的命令吧.

jackymail 发表于 2007-8-30 16:41:49

再学一段时间就行了,先把这个问题放一下。

kangaroo 发表于 2007-8-30 16:52:14

回复 #10 jackymail 的帖子

sdlkfj9
可是这个问题现在就要解决,这是头儿的命令

木卫十二 发表于 2007-8-30 17:22:08

我也碰到相同的问题。

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

另,WebCheckBox的value属性是和它的排序有关的吧。我的环境是从零加一递增的。。。

kangaroo 发表于 2007-8-30 17:40:17

回复 #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:52

我比较不幸,outerhtml也没有关联!幸好上头没要求必须要这样实现。sdlkfj5

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

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

供你参考sdlkfj2

kangaroo 发表于 2007-8-30 18:34:42

我又有一个思路,名单就是个只有一列的表,把这个表的内容取出来查,这样比较好实现.

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

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

待我研究下----真给逼上梁山了

kangaroo 发表于 2007-8-30 20:02:32

吼吼!!!问题解决了!!!

row = Browser("AA").Window("AA-Web").Page("AB").WebTable("ALL").RowCount
For i=1 to row -1
    IfBrowser("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:33

恭喜恭喜,也借来用用sdlkfj6

kangaroo 发表于 2007-8-31 11:07:49

如何对" sheila.shi "参数化?我又搞不定了。原来都是在keyword view里操作,现在不行了

help!!!!

kangaroo 发表于 2007-8-31 11:57:01

问题又解决一项!!参数化就用这句:
IfBrowser("AA").Window("AA-Web").Page("AB").WebTable("ALL").GetCellData(i, 1) = DataTable("ConfCall_All", dtLocalSheet)    Then
踏破铁鞋无觅处,得来全不费工夫。原来就这么简单地替换以下就搞定!!嘻嘻嘻嘻

yabest 发表于 2007-8-31 15:29:54

其实不用那么麻烦的找关联关系,不用钻牛角尖,想一个通用直观有效的方法,就是根据坐标来定位某个对象相应的WebCheckbox

吐血大奉献,写了一个通用函数,可以一劳永逸的解决类似问题,适合各种情况'================================================================
' FUNCTION NAME:
'      FindCheckBox
' FUNCTION DESCRIPTION:
'      Find the corresponding webcheckbox of title object in parent object, and output the webcheck
' FUNCTION USAGE:
'      Set parentObject = Browser("ATS Login").Page("ATS Login").Frame("mainRight")
'      Set titleObject = Browser("ATS Login").Page("ATS Login").Frame("mainRight").Link("test")
'      ret = FindCheckBox(parentObject, titleObject, checkBoxObject)
'      checkBoxObject.Set "ON"
' FUNCTION PARAMETER
'      ParentObject: The parent object of title object and webcheckbox object
'      TitleObject:      The title object
'      CheckBoxObject: Output the corresponding webcheckbox object of title object
' FUNCTION RETURN:
'      0:      Success to find and output the corresponding webcheckbox object of title object
'      -1:      Fail to find the corresponding webcheckbox object of title object
' FUNCTION ORIGINAL CREATOR:
'      yabest
' FUNCTION CREATION DATE:
'      2007-08-30
' FUNCTION UPDATE HISTORY:
'===============================================================
Function FindCheckBox(ByVal ParentObject, ByVal TitleObject, ByRef CheckBoxObject)

      Dim titleObjectY1, titleObjectY2, curChildObjectMidY
      Dim checkBoxDesc, childObjects
      Dim childNum, childIndex, findIndex

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

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

      'search the webcheckbox according y position.
      childNum = childObjects.Count
      findIndex = -1
      For childIndex = 0 to childNum-1
                Set curChildObject = childObjects(childIndex)
                curChildObjectMidY = CInt(curChildObject.GetROProperty("abs_y")) + CInt(curChildObject.GetROProperty("height"))/2
                'the webcheckbox should be:   (y+height/2) in area
                If curChildObjectMidY>=titleObjectY1 andcurChildObjectMidY<= titleObjectY2 Then
                        findIndex = childIndex
                        Exit For
                End If
      Next

      'if not found, return fail
      If findIndex = -1 Then
                FindCheckBox = -1
                Exit Function
      End If

      'if found, return success
      Set CheckBoxObject = curChildObject
      FindCheckBox = 0
      
End Function

[ 本帖最后由 yabest 于 2007-8-31 15:35 编辑 ]
页: [1] 2 3
查看完整版本: 如何让QTP在大量列表中勾选出需要的数据?