mstiunicon 发表于 2008-7-8 17:33:43

无聊,发个根据字段名称找到其对应的Web控件的小方法

Function webEditObj(pageObj, fieldName)
'功    能:根据指定的页面文字,找到其所对应的WebEdit输入框,默认查找页面上符合条件的第一个输入框
'传入参数: pageObj页面对象
'         fieldName 要查找的字段信息,注意不要添加冒号,本方法会自动添加中文或英文的冒号                       
'实现步骤:1 根据传入的字段名称,找到包含该字段的WebTable对象
'                                       2 根据WebTable对象,找到包含指定字段信息的单元格,记录其行数和列数
'                                       3 列数+1 就是要找的输入框所在的单元格          
'使用方法:       
'                                        Set curPage = Browser("creationTime:=1").Page("index:=0")
'                                        webEditObj(curPage,"客户名称").Set "01-0003"             

   Set descObj = description.Create()
   descObj("html tag").value = "table"
   descObj("innertext").value =".*"& fieldName&"(:|:).*"
   Set allDescObjs = pageObj.childObjects(descObj)
   objsCount = allDescObjs.count()
   For i= 0 to objsCount-1
          Set webTableObj = allDescObjs(i)
          webTableObj.highLight
                rows = webTableObj.rowCount
                For rowNO =1 to rows
                        cols = webTableObj.columnCount(rowNO)
                        For colNO = 1 to cols
                                temp = webTableObj.getCellData(rowNO,colNO)
                                reporter.ReportEvent micDone,rowNO&","&colNO,temp
                                If (trim(temp) =fieldName&":") or (trim(temp) = fieldName&":") Then
                                                Set webEditObj = webTableObj.childItem(rowNO,colNO+1,"WebEdit",0)
                                                Exit Function
                                End If
                        Next
                Next
   Next
       
End Function

Function webObj(pageObj,objClass, fieldName,indexNO)
'功    能:根据指定的页面文字,找到其后一个单元格的指定的Web控件。如果页面上有多个相同名字的页面文字,则根据indexNO来查找
'传入参数:pageObj页面对象
'          objClass   目标控件的类别。如,webEdit,webList....
'          fieldName   要查找的字段信息,注意不要添加冒号,本方法会自动添加中文或英文的冒号
'                                       indexNO                 如果页面上有多个相同文字的字段,默认取第一个,如果指定了indexNO,那么取指定的第indexNO个字段                       
'实现步骤:1 根据传入的字段名称,找到包含该字段的WebTable对象
'                                       2 根据WebTable对象,找到包含指定字段信息的单元格,记录其行数和列数
'                                       3 列数+1 就是要找的输入框所在的单元格          
'使用方法:       
'                                                Set curPage = Browser("creationTime:=1").Page("index:=0")
'                                                webObj(curPage,"WebList","担保品类别",0).select 1          

   Set descObj = description.Create()
   descObj("html tag").value = "table"
   descObj("innertext").value =".*"& fieldName&"(:|:).*"
   Set allDescObjs = pageObj.childObjects(descObj)
   objsCount = allDescObjs.count()
   For i= 0 to objsCount-1
           Set webTableObj = allDescObjs(i)
                rows = webTableObj.rowCount
                For rowNO =1 to rows
                        cols = webTableObj.columnCount(rowNO)
                        For colNO = 1 to cols
                                temp = webTableObj.getCellData(rowNO,colNO)
                                If (trim(temp) =fieldName&":") or (trim(temp) = fieldName&":") Then
                                        If label = indexNO Then
                                                Set webEditObj = webTableObj.childItem(rowNO,colNO+1,objClass,0)
                                                Exit Function
                                        else
                                                label = label+1
                                        End If
                                End If
                        Next
                Next
   Next
End Function

假装不在 发表于 2008-7-8 23:44:22

谢谢楼主的奉献精神,学习学习。
:handshake
楼主,
1,好像写少了个frame中的对象,你这个只是针对了page页面的obj:hug:
2,好像写少了对象的可否输入的判断,如果对象为不可输入,在你那句set 的时候,就会抛错了。:hug:
3,descObj("innertext").value =".*"& fieldName&"(:|:).*"
这句后边好像是多余的,你把它的值设置为支持正则表达式就可以了。
4,感觉....好像....,是不是可以这么写呢?
Browser("creationTime:=1").Page("index:=0").WebList("index:=0").select 1
为什么不这么写呢?考虑到中文和英文的不同页面的切换,通用性更好,以及既然你都去查它后台的innertext,那怎么不查下index直接确认就好呢?

大家一起讨论讨论,进步进步

mstiunicon 发表于 2008-7-9 11:10:15

1 如果页面中有frame的话,传入的pageObj就可以包含Frame对象,如:
set curPage = Browser("creationTime:=0").Page("inde:=0").Frame("name:=XXX")
WebEditObj(curPage,"客户编号").set "xxxx"

2 WebEditObj()这个方法的返回值,是一个WebEdit对象,其使用方法和browser().Page().WebEdit()的使用是一样的,所以判断是否为只读,需要自己来判断

3 descObj("innertext").value =".*"& fieldName&"(:|:).*"
WebEditObj()这个方法,是为了去查找指定字段后面一个单元格中的WebEdit对象。现在的被测系统中,字段名称后面是要求加上中文的冒号的,但是在实际的页面中,经常会有一些前导空格或者后面的空格,所以在前面加了".*"。fieldName是字段名称,传入参数,根据这个关键字来定位WebEdit对象的。

4 index不是Web对象的属性,它只是一个辅助识别的坐标信息,好像不能通过程序来找到index的值。

这次写的两个方法,都不需要去指定Web对象的name属性,而是根据页面上的文字信息来查找,这样可以根据Demo来编写脚本,虽然这样做意义不太大。

假装不在 发表于 2008-7-9 11:53:53

:handshake
我问题可能比较多。
如果是多个table的情况,也就是table下再包括了一个table好像就没办法用了....

很多情况都是table下再有一个table的,这样的情况不可避免的。

假装不在 发表于 2008-7-9 17:50:38

:hug:
讨论才会进步,大家怎么好像都只看不顶呢,一起讨论讨论对自己也不错的。

mstiunicon 发表于 2008-7-9 17:55:10

呵呵,代码会遍历所有的Table,如果是Table嵌套table的话,只有最里面的Table才是真正要找的,代码中实际上也做了一些无用功,把那些外围的Table也遍历了。经过测试,这段代码经过几个遍历后,是可以找到目标单元格的。

假装不在 发表于 2008-7-9 18:02:50

我早上4了下,好像多table 的情况是会出错的。不知道是不是我操作有误呢,所以才问了这个问题。

海海豚 发表于 2019-1-22 10:56:48

谢谢分享,先码后看

qqq911 发表于 2019-1-22 11:29:53

感谢分析

jingzizx 发表于 2019-1-22 12:06:12

:lol
页: [1]
查看完整版本: 无聊,发个根据字段名称找到其对应的Web控件的小方法