描述性编程 Descriptive Programming

上一篇 / 下一篇  2012-09-20 10:53:17 / 个人分类:QTP

假设这些对象没有添加到对象库里怎么办?QTP还能工作吗?完全可以!QTP提供了描述性编程(Descriptive Programming)这个解决方案。 

'代码1 Browser("micClass:=Browser").Page("micClass:=Page")._ WebEdit("name:=wd").Set "QTP自动化测试技术领航" 
'代码2 Browser("micClass:=Browser").Page("micClass:=Page")._ WebButton("name:=百度一下").Click

格式:对象名("属性名:?=?属性值")

'代码1 Browser("micClass:=Browser").Page("micClass:=Page")._ WebEdit("html tag:= INPUT","name:=wd").Set "QTP自动化测试技术领航" '代码2 Browser("micClass:=Browser").Page("micClass:=Page")._ WebButton("html tag:= INPUT","name:=百度一下","type:= submit").Click现在要介绍第二种描述性编程方式,那就是使用Description对象。

现在要介绍第二种描述性编程方式,那就是使用Description对象
使用该对象可以返回包含一组Property对象的Properties集合对象。Property对象由属性名和值组成。然后,可以在语句中指定用返回的Properties集合代替对象名(每个Property对象都包含一个属性名和值)。

要创建Properties集合,需要先创建Properties对象,使用以下语法进行:
Set bjDescription = Description.Create()

Set ObjBrowser = Description.Create()

ObjBrowser("micClass").Value = "Browser"

Set ObjPage = Description.Create()

ObjPage("micClass").Value = "Page"

Set ObjWebEdit = Description.Create()

ObjWebEdit("html tag").Value = "INPUT"

ObjWebEdit("name").Value = "wd"

Browser( ObjBrowser ).Page( ObjPage ).WebEdit( ObjWebEdit )._ 

Set "注意此时描述对象的括号内是不需要加引号的,加了引号反而就错了"

'最后需要记住释放对象,可以从最里面一层开始释放直到最外面一层

Set ObjWebEdit = Nothing

Set ObjPage = Nothing

Set ObjBrowser = Nothing


一些项目中需要使用到描述性编程的案例:
一个首页就有接近?20?个相同类别的控件(Link),虽然不多,但是一个个添加也够烦锁的,既然它们是完全相同类型的控件,那么使用描述性编程是一个上佳之选,下面来看这段脚本,看看是如何实现的:

Set baidu = Browser("micClass:=Browser").Page("micClass:=Page")

Print Baidu.Link("name:=新闻").Exist

With baidu

        Print .Link("name:=贴吧").Exist 

        Print .Link("name:=知道").Exist 

        Print .Link("name:=MP3").Exist 

        Print .Link("name:=图片").Exist 

        Print .Link("name:=百度设为主页").Exist 

        Print .Link("name:=搜索风云榜").Exist 

        Print .Link("name:=About Baidu").Exist 

End With

Set baidu = Nothing
这也是描述性编程常用情况之一的最基本的一个情况:同一个界面中出现很多个相同类别的控件元素

2)如果要同时操作浏览器的多个窗口时,怎么做?你想过吗?

SystemUtil.Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE" 

SystemUtil.Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE" 

Browser("CreationTime:=0").Navigate "http://www.51testing.com"

Browser("CreationTime:=1").Navigate http://www.baidu.com

当然,也可以使用IndexLocation属性

另外,当使用Browser ("CreationTime:=-1")的时候,表明当前有且仅有一个浏览器窗口,当只需要一个浏览器的时候,可以使用这个方法来作为判断依据,脚本如下所示:

objBrowser = Browser ("CreationTime:=-1").Exist (0) 

If objBrowser Then 

    Msgbox "存在一个浏览器窗口

else 

  Msgbox "存在0个或多个浏览器窗口

End If


使用描述性编程通过遍历对象完成N个同类控件的操作。

假设有这么一个场景,页面中有几百个输入框


'打开网站页面

SystemUtil.Run "C:\Program Files\Internet Explorer\IEXPLORE.EXE",_

"http://www.baidu.com/gaoji/advanced.html"

'描述对象 -- WebEdit

Set all_oEdit = Description.Create 

all_oEdit("micClass").value = "WebEdit" 

'WebEdit找父对象和祖父对象,并将所有对象“包装”在一起

Set all_oEdits = Browser("micClass:=Browser").Page("micClass:=Page")._

ChildObjects(all_oEdit) 

'遍历页面中的WebEdit对象,找到一个就输入一串指定的字符串

For i = 0 to all_oEdits.count - 1 

    Set oEdit = all_oEdits.item(i) 

    oEdit.Set "QTP自动化测试技术领航

Next

'最后记得释放所有设置的对象

Set oEdit = Nothing

Set all_oEdits = Nothing

Set all_oEdit = Nothing

1描述对象micClass赋值“WebEdit” 

2寻找父对象和祖父对象,将所有的对象包装在一起 

3.遍历所有的对象赋值一次赋值须另外定义变量 

4释放对象


订票系统,3名乘客:

For i = 0 to 3

   Browser("Find a Flight:")._

   Page("Book a Flight:").WebEdit("name:=passFirst"& i).Set "FirstName"

   Browser("Find a Flight:")._

   Page("Book a Flight:").WebEdit("name:=passLast"& i).Set "LastName"

Next


对象库的优势。

  (1)可以通过Complete Word“F7”等多个方式进行高效编程。这个特性描述性编程没有。

  (2)对象库编程有一个比较好的特性,假设脚本中引用了同一个对象10多次,这个对象的名字之前取得不是太出色,项目经理要求改名。此时不需要改10多次,只需要进入对象库,对这个对象进行更名,脚本便会批量自动更新,很高效!这个特性描述性编程也没有。

  (3)对象库编程不容易打错字,因为有Complete Word,想打错字都难。但是,描述性编程没有Complete Word,所以,打错字是家常便饭。关键是,对于一个新测试员来说,他不可能有敏锐的分析手段,往往因为这么一个小错别字会浪费很多时间。其实只是一个错别字而已,往往最后被误解成脚本发生了错误,无论怎么调试都看不出来。

  描述性编程的优势。

  (1)不用维护庞大的对象库,不过需要维护庞大的代码。所以这算是优势还是劣势?请读者感悟。作者在此提一句,其实在对象库功能做得如此智能的情况下,维护好对象库不难,只要根据在对象库那个章节中介绍的一些法则,如命名规范等就可以管理好对象库。

  (2)描述性编程可以完成一些特殊的需求


TAG: QTP

liiiih 引用 删除 liiiih   /   2012-12-05 16:26:59
Set baidu = Browser("micClass:=Browser").Page("micClass:=Page")

Print Baidu.Link("name:=新闻").Exist

我执行出来是 false 求解
 

评分:0

我来说两句

日历

« 2024-05-03  
   1234
567891011
12131415161718
19202122232425
262728293031 

我的存档

数据统计

  • 访问量: 12121
  • 日志数: 13
  • 建立时间: 2012-09-11
  • 更新时间: 2012-09-26

RSS订阅

Open Toolbar