描述性编程

    描述性编程(descriptive programming)

1、descriptive programming概述

通 常情况下,当在录制一个操作时,qtp会将被操作对象加入到对象库里(object repository)。一旦对象存在于对象库里,我们就可以在专家 视图里通过添加相关的对象方法来对该对象进行操作。我们可以通过引用层次型对象库里的对象描述(object description)来添加相应的方 法。

因为qtp对象库中的每个对象都具有唯一名称,所以在引用时对象名是必须需要指定的。然后在测试运行期间,qtp在对象库中根据这个对象的名称和父对象来查找对象,并使用为这个测试对象存储的测试对象描述,在网站或应用程序中标识该对象。

例 如我们用qtp录制yahoo mail登录情况时我们需要输入用户名,于是在录制时我们就会录下一个webedit对象,它的缺省逻辑名为 “login”,该编辑字段位于名为“yahoo! mail - the best” 的页面上,并且该页面在浏览器中使用名称yahoo!进行录制。

那么如果我们想要应用该对象,就可以在专家视图输入以下信息:

browser("yahoo!").page("yahoo! mail - the best").webedit("login").set “xxx”

或者我们也可以调用一些方法,获取改对象在运行时的对象名,如:

browser("yahoo!").page("yahoo! mail - the best").webedit("login").getroproperty(“name”)

然 而,我们可以发觉到,上面的例子在处理对象时,对象已经存在于对象库里,因此我们可以应用这个对象的逻辑名。实际使用中,情况往往并非如此简单,我们经常 会遇到很多在页面上动态产生的对象,换而言之,对象库里没有这些对象,我们也无从引用。因此我们必须采用其他的技术来完成这类操作,这也就是我们需要讲解 的descriptive programming。

为了满足上面提到的动态对象的处理问题,qtp允许用户通过将对象属性编码到测试脚 本里来动态识别对象,这就是我们通常意义下称为的descriptive programming。通过这种方式,我们可以指示qtp不通过引用对象库和 对象名来对实际对象进行操作。具体操作中,我们只需要为qtp提供对象的一组属性和值,这样qtp就可以来识别相应的对象并对其进行操作。这相当于,告诉 qtp要识别对象的一些关键特征,根据这些特征qtp就可以一一匹配然后识别出来这个对象。

而且,更为重要的是,通过这种 descriptive programming的方式,还可以让qtp识别具有某些相同属性的对象。我们先来举个例子来看一下:我们假设当前的 windows系统中打开了若干的yahoo主页面(多于一个),现在我们要关闭所有的正在浏览yahoo主页面的浏览器。

对于上面那个例子来说,我们先看一个简单一点的情况,假设只有且仅有一个yahoo主页面:那么我们可以用下面的方法来

window("text:=yahoo! - microsoft internet explorer").close

我 们可以看到语句里我们要查找的对象是window窗口标题为“yahoo! - microsoft internet explorer”,然后把它关 闭,具体的语法说明我们稍后为解释。但是上面的语句仅仅适合前面提到的条件“只有且仅有一个yahoo主页面”,如果有多个同样的窗口就会出错,原因是通 过语句可以匹配到多个对象,而qtp不知道应该对哪个对象进行关闭动作。我们需要进一步的缩小匹配范围:

dim i

i = 0

while (window("text:="yahoo!" - microsoft internet explorer", "index:="&i).exist)

window("text:=yahoo! - microsoft internet explorer", "index:="&i).close

i = i +1

wend

这里我们可以看到,对于具有相同属性的对象,我们可以通过index参数来对其进行区别,第一个对象为index=0,第二个为index=1等等,依次类推。当然我们还可以通过creationtime和location参数来定位对象,这里就不详细叙述了。

通 过上面的例子,我们对descriptive programming有一个基本了解了,下面我们详细讲解一下 descriptive programming:在具体实现中,我们有两种类型的descriptive programming方法。可以列出直接在 测试语句中描述对象的属性和值的集合;或者向description 对象中添加属性和值的集合,然后在语句中输入description 对象的名称。 下面我们分别举例介绍。



2、直接在语句中输入编程描述

通过多个指定描述对象的property:=value对,可以直接在语句中描述对象,这是最直接有效的方法。

常规语法为:

testobject("propertyname1:=propertyvalue1", "..." , "propertynamex:="propertyvaluex""}

testobject - 测试对象的类。

propertyname:=propertyvalue - 测试对象的属性及其值。各个property:="value" 对之间应用逗号和引号分开。

例如:以下语句指定mercury tours 页面中名为author且索引值为3 的webedit 测试对象。当测试运行时,qtp 将查找具有匹配属性值的webedit 对象,并输入文本jojo。

browser("mercury tours").page("mercury tours").webedit("name:="author"", "index:="3"").set "mark twain"

我们也可以从从描述中的特定位置(从page 对象描述开始)开始使用descriptive programming。

browser("mercury tours").page("title:="mercury" tours").webedit("name:="author"", "index:="3"").set "jojo"

此外,如果我们希望在在一个测试或组件中多次使用相同的descriptive programming,则可以将创建的对象赋值给变量,这样使用会方便很多。

例如:我们需要完成下面一系列操作

window("text:=hypersna").winbutton("caption:=日期").click

window("text:=hypersna").winbutton("caption:=时间").click

window("text:=hypersna").winbutton("caption:=确定").click

那么,为了方便其见,我们可以将window("text:=hypersna")赋值到一个变量,然后再使用,参见下面的代码:

set winhyper = window("text:="hypersna"")

winhyper.winbutton("caption:=日期").click

winhyper.winbutton("caption:=时间").click

winhyper.winbutton("caption:=确定").click

如果使用了vbscript里面的with语句,还可以简化为以下代码:

with window("text:="hypersna"")

.winbutton("caption:=日期").click

.winbutton("caption:=时间").click

.winbutton("caption:=确定").click

end with

下面我们来看一个更为详细的例子,在qtp产品缺省安装里面自带了一个网上订机票的示例称为mercury tour,我们看一下在订票过程中何时需要用descriptive programming。

首 先登入系统后,如果需要订票,就要先搜索航班,此时系统要求输入订票乘客的数量,假设我们在第一次录制脚本时选择了1个passenger,并成功完成订 票。然后,我们需要参数化乘客数量来测试订票系统,我们会发现回放会失败。原因在于,不同的乘客的数量导致在订票时需要输入每个乘客的姓名,而录制时,只 输入了一个乘客的姓名。而乘客姓名的输入框是随着乘客数量的变化而动态生成的,我们不可能从对象库里得到没有录制的对象,因此必须使用 descriptive programming。



 



在录制单个乘客时,我们得到的录制语句是:

browser("welcome: mercury tours").page("book a flight: mercury").webedit("passfirst0").set "michael"

browser("welcome: mercury tours").page("book a flight: mercury").webedit("passlast0").set "wang"

显然webedit("passfirst0")和webedit("passlast0")是录制时产生的对象并存放到对象库里的。通过对象库,我们可以看到对象的属性如下



 



系 统对于发生多个firstname时,命名规则是passfirst0,passfirst1…依次类推。因此只要通过简单的 descriptive programming就可以完成动态firstname与lastname的识别工作。这里我们假设参数化的乘客数已经赋值给 intpassnum,下面是脚本中的关键语句:

counter = 0

for i = 0 to (intpassnum)

browser("find a flight:").page("book a flight:").webedit("name:="passfirst""&i).set "michael"

browser("find a flight:").page("book a flight:").webedit("name:="passlast""&i).set "wang"

counter = counter + 1

next



3、使用description对象

使 用description 对象可以返回包含一组property 对象的properties 集合对象。property 对象由属性名和值组成。然 后,可以在语句中指定用返回的properties 集合代替对象名。(每个property 对象都包含一个属性名和值)。

要创建properties 集合,可以使用以下语法输入description.create 语句:

set mydescription = description.create()

创 建properties 对象(例如,以上示例中的mydescription)后,就可以输入语句,以便在运行会话期间在properties 对象中 添加、编辑、删除或检索属性和值。这样,就可以在运行会话期间,使用动态方法确定哪个属性以及多少个属性应包含在对象描述中。

在properties 集合中填充一组property 对象(属性和值)后,可以在测试语句中指定用properties 对象代替对象名。

例如,假设我们需要完成以下一个操作:

window("error").winbutton("text:=ok", "index:="1"").click

我们可以通过description对象来实现同样的功能,参加下面的代码:

set mydescription = description.create()

mydescription("text").value = "ok"

mydescription("index").value = 1

window("error").winbutton(mydescription).click

set mydescription = nothing 

你可能感兴趣的:(java,工作)