51Testing软件测试论坛

标题: 代码中使用SPY得出的OBJECT属性,报错 [打印本页]

作者: hollyecho    时间: 2009-2-27 10:00
标题: 代码中使用SPY得出的OBJECT属性,报错
见下图,SPY获取列表的表头“时间段编号”的属性,然后加入脚本,执行时说“OBJECT WAS NOT FOUND”
为什么会这样呢?
作者: dreamever    时间: 2009-2-27 10:19
你用的不是描述性编程,所以那段脚本运行的时候要求在测试对象地图中必须有这个测试对象存在。你的描述里只说用SPY识别然后加入脚本,不知道你是不是在测试对象库中添加了测试对象了呢?
作者: 风雪夜归人    时间: 2009-2-27 10:21
没错,你是察看到了属性,但是你应该是没有录制,直接使用的,如果你想这样使用的话,要录制下,将其加入对象库。。或者描述性编程。
msgbox Browser("系统登陆入口").Page("顺丰速运客户核心业务系统").Frame("rtmfrm").WebTable("html tag:=DIV","innerhtml:=时间段编号").exist

如果你转换到关键字视图的话,你会发现webtable 是个问号,意思就是在对象库中不存在这样的对象,你点击那个问号,选择"object from ..."这个选项,然后再用弹出界面里面的手型spy选择,就将你想要得对象加入对象库了,这个时候,可以直接用
作者: hollyecho    时间: 2009-2-27 11:23
使用SPY插入对象库,查看脚本,也是显示以下的内容:

Browser("系统登录入口").Page("顺丰速运客户核心业务系统").Frame("rtmfrm").WebElement("时间段编号").Click

还是没有WebTable的,,,,

用这个描述性编程:
msgbox Browser("系统登陆入口").Page("顺丰速运客户核心业务系统").Frame("rtmfrm").WebTable("html tag:=DIV","innerhtml:=时间段编号").exist

打印出false

还是不知道怎么解决才好
作者: dreamever    时间: 2009-2-27 11:41
我就晕死,你脚本中的顺序和对象库中的顺序完全不一样,你脚本中第一个父对象是"Browser("系统登录入口"),但是在你的测试对象库中根本没有这样的一个对象。你不妨改成这样试一下:
msgbox Browser("顺丰速运客户核心业务系统").Page("顺丰速运客户核心业务系统").Frame("rtmfrm").WebTable("html tag:=DIV","innerhtml:=时间段编号").exist
作者: hollyecho    时间: 2009-2-27 11:49
注意一下我上面说的哦:


用这个描述性编程:
msgbox Browser("系统登陆入口").Page("顺丰速运客户核心业务系统").Frame("rtmfrm").WebTable("html tag:=DIV","innerhtml:=时间段编号").exist

打印出false
作者: hollyecho    时间: 2009-2-27 11:52
脚本中的顺序和对象库中的顺序完全不一样??

从哪里看出来的呢?

没这个对象啊 : Browser("顺丰速运客户核心业务系统")

N多个问号。。。。???????
作者: dreamever    时间: 2009-2-27 11:56
测试对象库中有Browser("系统登陆入口")这个对象吗?
我记得QTP里就算用描述性编程,也要保证脚本中对象的层次结构和测试对象库中的结构必须一致吧?
作者: danmy    时间: 2009-2-27 11:59
楼主你先录制一遍,把录制的这个操作的脚本贴上来
作者: danmy    时间: 2009-2-27 11:59
原帖由 dreamever 于 2009-2-27 11:56 发表
测试对象库中有Browser("系统登陆入口")这个对象吗?
我记得QTP里就算用描述性编程,也要保证脚本中对象的层次结构和测试对象库中的结构必须一致吧?

每层都是描述性,就无所谓了
作者: dreamever    时间: 2009-2-27 12:02
原帖由 danmy 于 2009-2-27 11:59 发表

每层都是描述性,就无所谓了

楼主的脚本中只有子对象是描述性编程,父对象不是,所以我才觉得问题可能出在父对象上。
作者: 风雪夜归人    时间: 2009-2-27 12:18
楼主,你看下你spy取对象时候的截图嘛,Browser("顺丰速运客户核心业务系统")是这个对象,而不是Browser("系统登陆入口")这个,要不就是全部用描述性编程,要不就是你用spy加将那个webtable 加进对象库
Browser("title:=xxx","hwnd:=xxx").Page(描述).webtable(xxxx).exist
注意,如果父对象是用描述性编程的话,子对象都要用描述性编程。
作者: hollyecho    时间: 2009-2-27 13:29
Browser("系统登录入口").Page("系统登录入口").WebEdit("username").Set "guangzhouqubu"
Browser("系统登录入口").Page("系统登录入口").WebEdit("password").SetSecure "49a8589c18dbddff"
Browser("系统登录入口").Page("系统登录入口").WebEdit("password").Submit
Browser("系统登录入口").Page("顺丰速运客户核心业务系统").Frame("topFrame2").WebElement("space").Click
Browser("系统登录入口").Page("顺丰速运客户核心业务系统").Frame("ltbfrm").WebElement("ltb_list_i").Click
Browser("系统登录入口").Page("顺丰速运客户核心业务系统").Frame("rtmfrm").Image("ft_txt").FireEvent "onmouseover"
Browser("系统登录入口").Page("顺丰速运客户核心业务系统").Frame("rtmfrm").Image("ft_txt").Click
Browser("查看时间段及分段").Page("查看时间段及分段").Link("关闭").Click
Browser("系统登录入口").Page("顺丰速运客户核心业务系统").Frame("topFrame").Link("注销").Click
作者: hollyecho    时间: 2009-2-27 13:34
keyword view的截图
作者: hollyecho    时间: 2009-2-27 13:37
系统界面,呃,,,鉴于所谓的商业保密,屏蔽了多余的菜单功能,汗~~~~
作者: hollyecho    时间: 2009-2-27 13:40
1)keyword view中选择ftmfrm,下拉框选择object from repository,
得出的界面
作者: hollyecho    时间: 2009-2-27 13:42
使用SPY工具捕获对象
作者: hollyecho    时间: 2009-2-27 13:43
捕获对象后的keyword view界面
作者: hollyecho    时间: 2009-2-27 13:44
这个是插入对象后,脚本显示的语句

Browser("顺丰速运客户核心业务系统").Page("顺丰速运客户核心业务系统").Frame("rtmfrm").WebElement("时间段编号").Click
作者: hollyecho    时间: 2009-2-27 13:46
疑问:
1)为什么插入对象后,browser("")改变了?
2)为什么SPY明明捕获到有webtable,但脚本中写
Browser("顺丰速运客户核心业务系统").Page("顺丰速运客户核心业务系统").Frame("rtmfrm").WebTable("时间段编号").WebElement("时间段编号").exist
却报找不到对象?
作者: hollyecho    时间: 2009-2-27 13:47
先谢谢dreamever和风雪夜归人的热心帮助了!
作者: hollyecho    时间: 2009-2-27 13:51
用这个描述性编程:
msgbox Browser("系统登陆入口").Page("顺丰速运客户核心业务系统").Frame("rtmfrm").WebTable("html tag:=DIV","innerhtml:=时间段编号").exist

打印出false
作者: hollyecho    时间: 2009-2-27 14:17
browser("")之所以变化了,是不是因为界面上有两个FRAME的原因呢?SPY工具把RTMFRM的页面识别成另外一个了。我猜测的~
作者: 风雪夜归人    时间: 2009-2-27 15:26

我也是刚学qtp的,不知道多少,谈下我的看法

qtp识别对象是根据对象库里面的对象去识别的,这个就需要你把对象加入对象库,一般来说,录制就是为了达到这个目的,如果对象库里面没有这个对象,而你又不想录制或者加入的话,可以采用描述性编程,就是根据一些属性去唯一定位一个对象,要注意的一点就是如果父对象用的是描述性编程,则子对象都要用到描述性编程。要不不能识别的。( 我曾经尝试过直接使用描述性编程去写一个https的登陆流程,好麻烦。。)

至于为什么不能识别webtable,这个我也不知道,我自己写了一个table也识别不了, 崩溃了,不过用录制的可以,我也不知道为什么~求答案。。
作者: hollyecho    时间: 2009-2-27 17:28
有FRAME的页面,添加检查点,无法获取到webtable
不知道我验证出来的结果正确不正确?
作者: hollyecho    时间: 2009-2-27 17:32
我这里说详细点,按照那个frame的截图,列表中选择一栏,添加STANDARD CHECKPOINT,是无法获得WEBTABLE对象的,不知道为什么?

而列表那个FRAME的页面,单独运行,是可以获取WEBTABLE对象的

那么有FRAME的列表数据该如何去验证。

用了虚拟对象,但又说虚拟TABLE没属性,无法获取指定行列的数值,真是郁闷死了!


作者: blueeagle9999    时间: 2009-3-2 09:39
我碰到过一种情况,有时侯spy出来的属性却不是对象实际运行时的属性,你可以尝试一下以下的方法。

1.录制一遍你的操作
2.然后在录制的脚本的基础上改成描述性编程(很多时候spy出来的对象的层次结构很多是可以省略的)
3.回放,看是否会出错,如果出错,用**.exist()判断是哪里不能识别了,是否还是最后那个“时间段编号‘找不到
4.如果出现”时间段编号“找不到的错误,则用childobjects方法把webelement的对象都找出来,把它们的实际运行属性打出来看看(getroproperty)。
作者: hollyecho    时间: 2009-3-3 15:07
用了个笨办法,各位高手请看看是否有什么好建议?

先用QTP帮助文档中的例子,获取数据列表的对象属性

'获取frame=rtmfrm的对象的子对象
Set oDesc = Description.Create()
oDesc("micclass").Value = "WebTable"
Set Lists = Browser("系统登录入口").Page("顺丰速运客户核心业务系统").Frame("rtmfrm").ChildObjects(oDesc)
NumberOfLists = Lists.Count()

For i = 0 To NumberOfLists - 1
  msgbox i
  msgbox Lists(i).GetROProperty("name")
  msgbox Lists(i).GetROProperty("innertext")
Next

此时可得到对象的INDEX=4,CLASS=WebTable

然后就可以用 Lists(4).getCellData(m,n) 方法,与数据库中获取的数据一一对比了。

各位认为这样处理如何呢?
作者: topor    时间: 2009-3-11 12:09
看过一个类似的帖子:
http://bbs.51testing.com/viewthr ... hlight=%B6%D4%CF%F3
应该可以帮到你。

[ 本帖最后由 topor 于 2009-3-11 12:12 编辑 ]




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