51Testing软件测试论坛

标题: 这段脚本为什么会报 类型不匹配 错误? [打印本页]

作者: testman    时间: 2008-7-9 14:36
标题: 这段脚本为什么会报 类型不匹配 错误?
Set  firstobj = Description.Create()
Set  twoobj =  Description.Create()
twoobj("test").value = "in"      
Msgbox twoobj("test")                                          '可以正常运行
firstobj("test").value = twoobj("test")
Msgbox firstobj("test")                                              '类型不匹配
作者: 陈能技    时间: 2008-7-9 15:18
把firstobj("test").value = twoobj("test")这句改成下面的试试:
firstobj("test").value = twoobj("test").value


推荐新书《QTP自动化测试实践》。
作者: testman    时间: 2008-7-9 17:26
谢谢 陈老师的答疑。
firstobj("test").value = twoobj("test").value肯定能够通过,我自己也试过。

或者把Msgbox firstobj("test")  改成:Msgbox firstobj("test").value也是可以的。

我的问题具体一点:为什么会报这个错误?

Msgbox twoobj("test")  可以显示twoobj("test").value 的值;为什么firstobj("test")不可以显示firstobj("test").value 的值?
作者: testman    时间: 2008-7-9 17:39
我现在的想法是:firstobj("test").value = twoobj("test")这句并不是把twoobj("test").value的值"in"赋值给了firstobj("test").value。但是,如果是这样的化,为什么Msgbox twoobj("test")  可以提示twoobj("test").value的值"in"?

Msgbox twoobj("test") 和firstobj("test").value = twoobj("test")这两句中是不是twoobj("test")是不是有不同的意义?
作者: 假装不在    时间: 2008-7-9 17:41

你可以设置断点在
Msgbox firstobj("test")    这一步。走到这一步停止后,你可以在QTP的Dbug View中分别输入:
twoobj("test")                                 <Object>
twoobj("test").value                      in
firstobj("test")                                <Object>
firstobj("test").value                      <Object>
然后分别看看他们这三个,在走完“firstobj("test").value = twoobj("test")”这步后,他们的对象类型分别是什么.这样可以帮助我们去了解它里面的传递过程。

到这里,我们就可以清楚看到了一个问题:
firstobj("test").value  被赋予的值是一个对象,所以,msgbox 一个对象自然会抛错了。
作者: 假装不在    时间: 2008-7-9 17:43
firstobj("test").value = twoobj("test")
你这一步,其实是把twoobj("test")这个OBJ赋给了firstobj("test").value
作者: 陈能技    时间: 2008-7-9 17:46
嗯,解释得很清楚!
作者: testman    时间: 2008-7-9 18:21
谢谢 假装不在!

不仅解答了问题,更重要的是提供了一种思路,和方法。很受益~~

Msgbox twoobj("test")
twoobj("test") 传给 Msgbox 的值为twoobj("test").value的值"in"
firstobj("test").value = twoobj("test")
twoobj("test") 传给 firstobj("test").value 的值为自身对象的引用

那么,twoobj("test")的值为什么有时是twoobj("test").value的值,有时是自身对象的引用?
作者: 假装不在    时间: 2008-7-9 19:59
DataTable.Value(ParameterID [, SheetID])
DataTable(ParameterID [, SheetID])
这2个语句是相等的。
这个就和上边的两个语句一样的,有它自己的默认值。如果你没写下去的话。
哪么,在你这个firstobj("test").value = twoobj("test"),为什么传递的不是它的默认value呢?其实在这里我个人觉得,它默认的值变成了twoobj("test").object
作者: testman    时间: 2008-7-10 10:35
谢谢 假装不在 和 陈能技 的关注和解答!!

经过分析,现在将总结和大家分享一下:

1,twoobj("test")本身为一个对象。twoobj("test")可以表示其值,也可以表示其自身引用,它和twoobj("test").value就像C语言中的指针和值的关系。对于twoobj("test")这样的对象,系统会自动根据上下文判断是取其值,还是取其自身引用。例如:MsgBox twoobj("test") ,或者twoobj("test")&"out"时,系统自动取其值,而不是自身引用。
2,对firstobj("test").value进行赋值时,其赋值对象可以是简单数据类型,如:字符串,整数等,也可以是对象引用。如果赋值对象为twoobj("test"),系统会自动将twoobj("test")的引用赋值给对firstobj("test").value。




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