lilinuo_2011 发表于 2011-2-14 10:05:29

GetCellData(I,J)函数的问题

本帖最后由 lilinuo_2011 于 2011-2-14 14:45 编辑

最近一直有一个问题困扰着我,以下是用qtp进行自动化测试时碰到的一个问题:

Browser("TCC Control").Page("TCC Control").WebList("userName").Select "ADMIN"
Browser("TCC Control").Page("TCC Control").WebEdit("password").SetSecure "4d54dd6a5e4979de98068a8fee420eb0936a"
Browser("TCC Control").Page("TCC Control").WebButton("登录").Click
Browser("TCC Control_2").Dialog("Windows Internet Explorer").WinButton("是(Y)").Click
Browser("TCC Control").Page("TccBus SystemEsb").Frame("menuFrame").Link("方法访问日志管理").Click
Browser("TCC Control").Page("TccBus SystemEsb").Frame("bodyFrame").WebEdit("startTime").Set "2011-01-04 00:00:00"
Browser("TCC Control").Page("TccBus SystemEsb").Frame("bodyFrame").WebEdit("endTime").Set "2011-01-26 00:00:00"
Browser("TCC Control").Page("TccBus SystemEsb").Frame("bodyFrame").WebButton("查询").Click

Set obj = Browser("TCC Control").Page("TccBus SystemEsb").Frame("query_frame").WebTable("WebTable")
'获取表格的行数
RowCount =obj.RowCount

For I = 2 To RowCount
For J = 1 To obj.ColumnCount(I)
    Dim ExampleName
    '获取表格中的某个单元格的数据
    ExampleName = obj.GetCellData(I,J)
    Msgbox ExampleName
Next
Next

Browser("TCC Control").Page("TccBus SystemEsb").Sync
Browser("TCC Control").Close
Browser("TCC Control").Dialog("Windows Internet Explorer").WinButton("确定").Click

但是问题是:“方法访问日志管理”界面的表格,qtp的函数GetCellData(I,J)
会报出“未指定的错误”,代码本身应该并没有问题并没有问题…
但不清楚怎么解决,前提是GetCellData(I,J)的I和J都是没有问题的,obj.RowCount和obj.ColumnCount(I)取得也都没有问题......我都开始怀疑是否是QTP本身的一个BUG,目前使用的QTP版本是9.2,操作系统使用的是Microsoft Windows XP Professional 版本 2002 Service Pack 3 ,ie版本:7.0.5730.13......



这个问题初步判断是和开发写得界面有关,想问一下碰到如此复杂的界面如何使用脚本进行自动化测试,遍历表格中的所有数据,因为用目前的方式看来读取是有困难的...

superliming 发表于 2011-2-14 14:55:17

我觉的没问题

ls_721521 发表于 2011-2-14 16:52:48

不只是一层webtable吧
GetCellData的参数能不能输入4个坐标来定位?我忘了。。

或者用其他方法获取吧,spy找到这些值的公共属性后用 index来定位

sunnyswu 发表于 2011-2-14 21:05:32

dim 干嘛在循环里边呢? 移到外边,还有 出错是 i j 值是多少?
是不是 在取第一个值的时候 就报错了?

lilinuo_2011 发表于 2011-2-15 10:52:21

确实是在取第一个值时报错的...

这个问题初步判断是由于网页中存在多个table,而且每个table标签的属性相仿,qtp在识别的时候识别到第一个table后找不到我所要的cell单元的原因造成的...
问题现在就变成了在不更改开发代码的情况下如何在多层table存在的界面中使用getcelldata()获得我所想要的数据?因为用描述性编程貌似也是会找到多个对象的...

本来想通过
set webtable= Description.Create()
webtable("html tag").Value = "TABLE",但是一碰到
webtable("html tag").Value = "TABLE"
就一直报出:General run error的错误
然后想用
NUM = Browser("TCC Control").Page("TccBus SystemEsb").Frame("query_frame").ChildObjects().Count()
for i = 1 to num
   .....
next

来定位我想要的那个table,但是到
NUM = Browser("TCC Control").Page("TccBus SystemEsb").Frame("query_frame").ChildObjects().Count()
就报错了...

lilinuo_2011 发表于 2011-2-15 11:07:34

但是,有一点,我仍然比较困惑的是既然
RowCount和obj.ColumnCount(I)都能取正确,说明这个obj是识别正常的,但是为什么到它要用到getcelldata()函数的时候却发生了问题??

lilinuo_2011 发表于 2011-2-15 11:20:36

具体失败的代码如下:
Dim oWebTableDesc
Set oWebTableDesc = Description.Create()
oWebTableDesc("html tag").value = "TABLE"
Set oTableList = Browser("TCC Control").Page("TccBus SystemEsb").Frame("query_frame").ChildObjects(oWebTableDesc)
for i=0 to oTableList.Count()-1
   print oTRAndTDList (i).GetROProperty("html tag")
Next

lilinuo_2011 发表于 2011-2-15 11:42:01

Set obj = Browser("TCC Control").Page("TccBus SystemEsb").Frame("query_frame").WebTable("WebTable")
index = obj.GetROProperty("source_index")
msgbox index

.....

Dim ExampleName
Set objReal = Browser("TCC Control").Page("TccBus SystemEsb").Frame("query_frame").WebTable("source_index:=" & index)
For I = 2 To RowCount
    For J = 1 To obj.ColumnCount(I)
      '获取表格中的某个单元格的数据
   ExampleName = objReal.GetCellData(I,J)
      Msgbox ExampleName
    Next
Next

也会在ExampleName = objReal.GetCellData(I,J)
处报出“未指定的错误”,msgbox index
输出的是5~~

lilinuo_2011 发表于 2011-2-15 11:58:20

本帖最后由 lilinuo_2011 于 2011-2-15 13:31 编辑

还有一点,大家都知道,我们平时需要查看对象的封装属性可以打开qtp的spy,然后选择我们需要查看的对象,SPY中即会显示出此对象的属性。

但是我要getcelldata的这个表格,我用spy去获取时properties和methods都是空,是不是这个也会造成qtp在识别对象时的问题?????

BesTesTer 发表于 2011-2-15 12:40:43

Object Spy定位到你要的那张表,properties和methods都是空?截个图看看.

lyscser 发表于 2011-2-15 13:20:29

你为啥非要用html tag这个属性?micclass加上text不能定位么?
webtable("html tag").Value = "TABLE",但是一碰到
webtable("html tag").Value = "TABLE"

shingo0109 发表于 2011-2-15 13:56:22

我找了个我这边的环境试了下, 这么写可以输出表格上的value的, 代码如下:
Set obj1= Browser("CreationTime:=0").Page(":=").Frame("name:=businessfrm").WebTable("html tag:=TABLE", "Index:=1")
For i=2 to obj1.RowCount
        For j=1 to obj1.ColumnCount(i)
                aaa=obj1.GetCellData(i,j)
                msgbox "aaa="&aaa
        Next
Next
不过spy看的时候property和methods都有的, 不知LZ的情况为啥看到的是空的

lilinuo_2011 发表于 2011-2-15 14:15:39

Set obj = Browser("TCC Control").Page("TccBus SystemEsb").Frame("query_frame").WebTable("WebTable")
micclass = obj.GetROProperty("micclass")
text = obj.GetROProperty("text")
....
Dim ExampleName
Set objReal = Browser("TCC Control").Page("TccBus SystemEsb").Frame("query_frame").WebTable("micclass:="&micclass,"text:="&text)
For I = 2 To objReal.RowCount
        For J = 1 To objReal.ColumnCount(I)
    '获取表格中的某个单元格的数据
    ExampleName = objReal.GetCellData(I,J)

        Msgbox ExampleName
NEXT
NEXT

结果在For I = 2 To objReal.RowCount
报出如下的错误:
Cannot identify the object "[ WebTable ]" (of class WebTable). Verify that this object's properties match an object currently displayed in your application.
Line (59): "For I = 2 To objReal.RowCount".

shingo0109 发表于 2011-2-15 14:33:02

LZ还是需添加index来识别吧

lilinuo_2011 发表于 2011-2-15 15:20:29

Set obj = Browser("TCC Control").Page("TccBus SystemEsb").Frame("query_frame").WebTable("WebTable")
index = obj.GetROProperty("index")
msgbox index

.....

Dim ExampleName
Set objReal = Browser("TCC Control").Page("TccBus SystemEsb").Frame("query_frame").WebTable("index:=" & index)
For I = 2 To RowCount
    For J = 1 To obj.ColumnCount(I)
      '获取表格中的某个单元格的数据
   ExampleName = objReal.GetCellData(I,J)
      Msgbox ExampleName
    Next
Next

是无效的,msgbox index
输出的是空...我怀疑用index是否有效...我连x/y都尝试过了,也无效,x=0,y=0

shingo0109 发表于 2011-2-15 15:32:59

回复 15# lilinuo_2011


index属性是不能用GetROProperty来输出的
LZ要么用for循环把webtable("html tag:=TABLE","index:="&i)一个个输出试试

BesTesTer 发表于 2011-2-15 15:38:11

index是不能用GetROProperty("index") 来获取的。
另外,你那边为什么表的properties和methods都是空这才是问题所在。properties为空,就导致了用描述性编程来识别的那张表时的失败。

lilinuo_2011 发表于 2011-2-15 16:03:17

我让开发发生类似问题的另一个界面中在table标签中加入id属性后,因为该界面改动更为简单,然后仍然没有解决类似问题...
Browser("TCC Control").Page("TCC Control").WebList("userName").Select "ADMIN"
Browser("TCC Control").Page("TCC Control").WebEdit("password").SetSecure "4d5a2ba03734c17e19ff325597acb45621e6"
Browser("TCC Control").Page("TCC Control").WebButton("登录").Click
Browser("TCC Control_2").Dialog("Windows Internet Explorer").WinButton("是(Y)").Click
Browser("TCC Control").Page("TccBus SystemEsb").Frame("menuFrame").Image("展开/折叠").Click
Browser("TCC Control").Page("TccBus SystemEsb").Frame("menuFrame").Link("运行情况").Click
Browser("TCC Control").Page("TccBus SystemEsb").Frame("bodyFrame").Link("更多......").Click

Set obj = Browser("TCC Control").Page("TccBus SystemEsb").Frame("bodyFrame_2").WebTable("html id:=_table3")
'获取表格的行数
RowCount =obj.RowCount
For I = 2 To RowCount
        For J = 1 To obj.ColumnCount(I)
    '获取表格中的某个单元格的数据
    ExampleName = obj.GetCellData(5,5)
        msgboxExampleName
        Next
Next

Browser("TCC Control").Page("TccBus SystemEsb").Frame("bodyFrame_2").Link("下页").Click
Browser("TCC Control").Page("TccBus SystemEsb").Sync
Browser("TCC Control").Close
Browser("TCC Control").Dialog("Windows Internet Explorer").WinButton("确定").Click

在“ExampleName = obj.GetCellData(5,5)”还是碰到了类似的报错问题:未指定的错误

真不知道怎么去解决这个问题...

sunnyswu 发表于 2011-2-15 19:48:56

1楼主真是的,干嘛纠结于webtable,
spy下,单元格,看看对象层次结构是什么?
2再有,就是新建个对象库,将webtalbe加入,然后看属性是什么? 都有那些属性。
有的时候,spy的时候,属性不全,这样可以看都有那些属性,
3假如,没有属性,那么 看看单元格的层次结构,然后描述编程,找到该对象,取值,不久ok了?
继续交流!

sunnyswu 发表于 2011-2-15 19:55:56

楼主,最好是,将页面,放上来,这样大家可以帮你看看源代码。
一张图片说明不了什么问题,
页: [1] 2
查看完整版本: GetCellData(I,J)函数的问题