51Testing软件测试论坛

标题: QTP中使用描述性编程难道不能采用DOM的方式靠ID来唯一定位对象么? [打印本页]

作者: nbkhic    时间: 2009-7-3 08:37
标题: QTP中使用描述性编程难道不能采用DOM的方式靠ID来唯一定位对象么?
昨天在做QTP培训PPT的时候,忽然心血来潮用描述性编程写了一点东西,具体情况是这样的。如下图所示的登录页面中有两个textbox,其对应的HTML代码如下
<TD><input name="txtID" id="txtID" type="text" maxlength="32" size="17" /></TD>
<TD><input name="txtPwd" id="txtPwd" type="password" style="WIDTH: 100%" maxlength="32" size="17" /></TD>

可以看到,这两个文本框均有唯一对应的ID,如果是在DOM编程中,我们完全可以通过document.getElementById("textID")来获得第一个文本框的引用。

由于ID是唯一的,所以我当时考虑到可以用描述性编程来获取这两个文本框,代码如下:
Browser("GPSPortalLogin").Page("GPSPortalLogin").WebEdit("id := txtID").Set DataTable("LogName", dtGlobalSheet)
在执行的时候,我们却发现系统提示匹配了不止1个的webEdit。
由于id是唯一的,所以从道理上说应该不会匹配到其他的webEdit上去才对。是不是描述性编程不能像DOM编程那样直接通过ID来确定元素呢?
作者: shanxi    时间: 2009-7-3 09:00
描述性编程  如果不是封装DOM  还能是封装什么?
你可以试试把视野扩展到browser之类匹配上去,这种原因分析应该不难。

封装另外一种的话,支持的程度会受局限。

[ 本帖最后由 shanxi 于 2009-7-3 09:04 编辑 ]
作者: nbkhic    时间: 2009-7-3 09:15
很奇怪,我把id 封装到1个description中以后奇怪就解决了,只需要一个id属性便能匹配第一个文本框;
但是第二个文本框又出问题了,我在description中封装了id 和 type,但是打死都匹配不上...我把spy中能看到的一些基本属性,例如name html tag 也封装了进去,但是第二个密码框就是匹配不上...
作者: dreamever    时间: 2009-7-3 10:12
我以前的描述性编程序代码是这样写的。也是通过IE对象的属性来获取对象
Set staticObj = description.Create
staticObj("micclass").value = "Static"
staticObj("text").value = "当前支付范围划分待确认,不能上报!"
text = browser("ie").Dialog("Microsoft Internet Explorer").static(staticObj).GetROProperty("regexpwndtitle")
在这段代码中,我用了micclass,同样也可以写staticObj("name").value = "txtID"

[ 本帖最后由 dreamever 于 2009-7-3 10:15 编辑 ]
作者: lvguobin    时间: 2009-7-3 11:26
micClass("")里面不只可以放一个可以识别该对象的属性,多放一个。虽然ID是唯一的,但也有其它属性可以描述对象,用name,type, nativeclass。

WebEdit("nativeclass:=Edit","id := txtID")
WebEdit("name:=txtID","nativeclass:=Edit")
WebEdit("name:=txtID","id := txtID")
作者: nbkhic    时间: 2009-7-3 11:52
刚才又试了一下,感觉用描述性编程最大的问题就是不知道使用哪种(些)属性去唯一标示这个对象。
于是我刚才用了DOM编程的方法去直接访问对象
Browser("GPSPortalLogin").Page("GPSPortalLogin").object.getElementById("txtPwd").value = "XXXX"
看来在元素有ID得情况下,用DOM 去直接访问对象才是最合适的方法。用描述性编程的话,感觉还是不够直接。
当然了,在元素没有ID 的情况下,还是用description + childobjects访问吧,暂时没想到什么好的方法,毕竟没有ID 用DOM的话也不是很方便,不过若是批量选择对象,那么DOM还是很不错的!
作者: shanxi    时间: 2009-7-3 12:09
系统提示匹配了不止1个的webEdit。


你调试过有原因吗?或者简单一点,规律吧
作者: nbkhic    时间: 2009-7-3 12:14
原帖由 shanxi 于 2009-7-3 12:09 发表
系统提示匹配了不止1个的webEdit。


你调试过有原因吗?或者简单一点,规律吧



不知道是什么原因,页面上一共就2个 textbox 而且它们的ID 不一样,按道理来说用id描述就足够了。不知道为什么调试的是很总是说不止匹配1个。
作者: shanxi    时间: 2009-7-3 12:50
标题: 回复 8# 的帖子
装了一下QTP 10,应该知道原因了

看下图,访问的页面是books.google.com
[attach]53691[/attach]
作者: nbkhic    时间: 2009-7-3 16:34
标题: 回复 9# 的帖子
了解,原来有缺省的情况,看来还是不要让QTP来封装对象的好,直接用DOM,DOM的结点和遍历基本上够用了。
作者: peterz    时间: 2009-7-3 18:07
原帖由 nbkhic 于 2009-7-3 11:52 发表
刚才又试了一下,感觉用描述性编程最大的问题就是不知道使用哪种(些)属性去唯一标示这个对象。
于是我刚才用了DOM编程的方法去直接访问对象
Browser("GPSPortalLogin").Page("GPSPortalLogin").object.getElemen ...

深有同感。。




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