etao搜索

QTP对象识别(二)

上一篇 / 下一篇  2009-02-02 10:43:27 / 个人分类:QTP

定制对象事件

      大部分情况下,我们使用QTP封装后的事件就可以了。但是在某些情况下,我们需要在QTP对象上执行一些特殊的操作,这时我们希望能够有某种手段能够定制对象事件,QTPRegisterUserFunc为我们提供了这种功能。

1.注册新方法

Function SetDefaultValue(test_object, ByVal val)

  If StrComp(val, "") = 0 Then

        test_object.Set "default"

  Else

     test_object.Set val

  End If

End Function

RegisterUserFunc "WebEdit", "SetDefaultValue", "SetDefaultValue", TRUE

 

Browser("Google").Page("Google").WebEdit("q").SetDefaultValue ""

Browser("Google").Page("Google").WebEdit("q").Submit

 

上面这段代码在WebEdit对象注册了一个新的方法SetDefaultValue

 

2. 修改老方法

Function SetDefaultValue(test_object, ByVal val)

  If StrComp(val, "") = 0 Then

        test_object.Set "default"

  Else

     test_object.Set val

  End If

End Function

RegisterUserFunc "WebEdit", "Set", "SetDefaultValue", TRUE

 

Browser("Google").Page("Google").WebEdit("q").Set ""

Browser("Google").Page("Google").WebEdit("q").Submit

这段代码定义了SetDefaultValue方法并替换了以前的Set方法。

 

如何访问DOM对象和方法(描述性编程)

 

前文提到描述性编程时有QTP ObjectDom Object之说,这两个到底有什么区别呢?所谓QTP Object包括TORO都是被QTP封装后的对象,而DOM ObjectQTP没有什么关系。我们知道Html是一种结构化的语言,而Html Dom定义了访问和操作HTML文档的标准方法,DOM Object指的通过DOM接口访问的HTML文档对象。那QTP如何获取DOM Object?很简单,只要通过Object属性就可以使用DOM接口访问这些对象。例如下面这段话就是通过DOM接口访问Input对象,并直接将输入框的value值赋值为abc,相当于QTP WebEdit对象的Set方法:

      Browser("Google").Page("Google").WebEdit("q").Object.value = "abc"

 

       那什么时候会用到DOM Object?怎么用呢?

     QTP时,大家会发现有不少的对象QTP经常抓取不下来。例如某个Html代码中DIV中套用了DIV

      <div id=”parentDIV” class=”class1”>

             <div id=”childDIV” class=”class2”>

                    <input id="inputid" class="textfield" type="text" value=””/>

             </div>

</div>

大家可以试试,如果用QTP本身的对象抓取功能,如果想把两个DIV层都抓取下来非常困难,如果对象都抓取不了,就更不要提后续的操作了。但如果用DOM接口去操作就会灵活的多,DOMHTML结构视为一棵树,每个HTML文档元素及其属性是树上一个节点,可以用getElementById直接访问它们,也可以通过childNodes属性一层一层的访问。下面是一段范例代码:

'获取childDIV对象

Set ōbj = Browser("Browser").Object.Document.getElementById("childDIV")

'获取childDIV的子节点
    Set co = obj.childNodes

'childDIV的子节点为input对象
    Set inputObj = co(0)

'设置input文本框的内容为aa
    co(0).value = "aa"


 

当然这些通过QTP Object的描述性编程也是可以做到的。关于Html Dom的详细介绍可以到这个网址看看:http://www.w3school.com.cn/htmldom/index.asp

 

 

More About 描述性编程

Object属性通过DOM提供了一种直接访问Web元素属性的途径。除此之外QTP还支持一种直接访问Web元素属性的方式,就是attribute/[属性]的方式。

例如有一段源代码如下:

<A href="http://www.google.cn" lid="l1" id="link1">link1</A>
    <A href="http://www.baidu.com" lid="l2" id="link2">link2</A>

 

QTP脚本可以这样写

'点击link1的链接

Browser("Browser").Page("Page").Link("attribute/lid:=l1").Click的方式点击link1的链接。

'打印link1的lid的属性值

Msgbox Browser("Browser").Page("Page").GetRoProperty("attribute/lid:=l1")

 

 

好,现在我们知道了一种更加灵活的方式操作Web对象。但毕竟很多HTML元素页面上是看不出效果的,那我们怎么知道Web对象的结构,以便获取他们并进行操作呢?最土的办法就是查看源代码,但是源代码往往夹杂着大量的动态代码和注释,看起来挺累。这时可以借助一些工具。这里我推荐ie developer toolbar,这个是微软出的ie插件,可以查看每个html文档元素的结构及属性,包括css样式,操作简洁,功能完全可以弥补QTP对象识别的不足。如下图:

 

 

  不过有点遗憾的是,QTP对于Object属性有这样一个说明“TheObjectproperty for Web objects is supported only when running steps on Internet Explorer.  It is not supported when working with Netscape Browser or Mozilla Firefox”,看来QTP只支持IE对于DOM Object的访问。

(待续。。。)


TAG: QTP DOM Attribute 对象识别

引用 删除 kelly33   /   2009-03-27 15:09:43
希望有更进一步的讲解,谢谢 
季风的测试生活 引用 删除 jifeng   /   2009-02-12 12:19:42
堪称经典的一片文章,期待后续文章发表。
 

评分:0

我来说两句

日历

« 2024-04-25  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 16584
  • 日志数: 11
  • 建立时间: 2008-12-10
  • 更新时间: 2010-06-10

RSS订阅

Open Toolbar