本节书摘来自异步社区《精通QTP——自动化测试技术领航》一书中的第1章1.5节QTP精华—对象库(上)之基础攻略篇,作者余杰 , 赵旭斌,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.5 QTP精华—对象库(上)之基础攻略篇
精通QTP——自动化测试技术领航
阶段要点

初步了解QTP中的测试对象模型。

明确Object Identification是管理对象模型的长官。

掌握智能识别原理、机制和各项设置。

对象库基本操作之添加、更新、对象闪烁、副对象库(Associate Repositorys)。

一个有趣的实验证明,做项目时手工添加对象的好处与效率。

Export Local Objects与Export and Replace Local Objects。

掌握并熟练运用Object Spy。

明确使用公共对象库的必要与优点。

熟练驾驭对象库指挥官Object Repository Manager。

Object Repository Manager的两个王牌级辅助工具初体验。

1.5.1 引言
如果说,上一章节是彻底摆脱脚本录制的一个良好的开端,是带领读者逐步走向QTP自动化测试项目开发的台阶,那么从本章节开始,读者将跨出巨大的一步,真正开始走进QTP脚本开发的世界。

在QTP这个自动化测试工具中,存在着两种脚本开发模式,第一种开发模式就是从本章节开始要逐步具体、深入、详细讲解的“对象库编程”。当然,本书的一贯原则是“实用原则”,所以无论是在上篇(本章节)还是下篇(1.6章节)都绝对不会详细地讲解在实际项目运用中用不到或很少会用到的知识点。想要精通对象库编程这个开发模式,并驾轻就熟地运用到自动化测试项目中,首当其冲就是要先“精通”QTP的对象库,作者讲的对象库其实是一个总称和概括,从大的方面包含对象库本身的功能、对象库的机制与原理、对象库编程知识、如何在实际项目中运用对象库编程等。

在上面作者主要针对QTP对象库的机制与原理以及对象库本身的功能做深入讲解,而对象库编程的部分则会在下篇中精彩解读。虽然需要掌握那么多知识的确很烦,也需要一个过程,但是作者认为上篇和下篇中的所有内容已经是最精简的了,所以,请读者务必对这些知识点做到“精通”,它们都是经常在实际项目中使用的,可以说是QTP脚本开发的必备技能!如果不能精通QTP的对象库,那一定不会是一名合格的QTP自动化测试工程师!

1.5.2 对象库的出现改写了软件测试历史
QTP的对象库是这个强大的自动化测试工具的核心,也是其精华所在!有了对象库这一整套功能、机制,QTP才可以在那么多的自动化测试工具中脱颖而出!QTP的整套对象库功能与对象识别机制给自动化测试人员带来了前所未有的体验,它的成熟、上手度、良好的使用感受都是市面上其他任何自动化测试工具无法给予的。对象库是QTP在实际项目应用中的枢纽,读者一旦精通了它,会感觉到在项目应用、QTP各项功能中都会和对象库产生必要联系。本章节的内容会结合大量仿真项目的应用来引导读者逐步精通对象库,希望读者能够做到举一反三,细细去品味对象库带来的不同感受(针对之前使用过其他自动化测试工具的读者效果更佳)!

小小的总结一下,可以说QTP在实际项目中的应用开发(特别是自动化测试项目做成功的案例)绝大部分都基于对象库编程模式,所以,对象库的出现改写了自动化测试领域的历史,也推动了这个技术领域走向更高的台阶!另外,先预告下,本章节以及下一章节的篇幅会很大,因为这两个章节的内容是QTP最精华的部分,也是整个第一章的最重要的一块,务必耐心学习。

1.5.3 一个简单的实例介绍对象库原理、机制及操作流程
1.5.3.1 对象模型的老大Object Identification和对象库的暧昧关系
在介绍对象库的原理与机制之前,首先说一下QTP自动化测试的原理,分以下3个步骤。

(1)封装真实被测对象并转化为QTP对象到对象库。

(2)对比对象库里的对象鉴别属性和运行时的真实被测对象的鉴别属性。

(3)对比后如果一致,则说明对象成功匹配并可以继续对该真实被测对象进行后续操作,如果两者不一致则报错,提示为对象无法识别。

我们可以看到,QTP自动化测试的原理其第一步就和对象库产生了联系,具体到底是如何联系起来的呢?其实很简单,在QTP里有测试对象模型这一个概念,它把各种对象都分门别类起来,建立出一个个对象模型,然后用这些对象模型来表示Web页面中的对象,比如WebButton、WebList、WebElement等各种各样的对象。每个对象模型都有一个可以唯一标识对象的关键属性列表,我们将前面这些连起来一块说,就是在添加对象至对象库后,QTP自动建立被添加对象的对象模型,并给出一个默认识别标识。然后,每个对象模型都有一个可以唯一标识对象的属性列表,这个属性列表是可以设置的,它就是Object Identification,先认识一下它,如图1-50所示。


如图1-50所示,可以看到这就是Object Identification的界面,开启它的方法是:

QTP上方菜单栏→Tools→Object Identification。

在Object Identification对话框中设置的属性在添加完对象后就可以在对象库中查看到。如果觉得这些默认显示的属性还不够或者有的默认的属性是多余的,可以进行手工设置,看一下实例,通过实例来看最终效果,需要再一次借用百度的搜索框,如图1-51所示。


这是一个WebEdit控件,也就是一个WebEdit对象模型,等会作者把这个对象添加到对象库中,添加两次,第一次不改Object Identification中WebEdit对象模型的默认属性,第二次剔除其中一个属性,然后一起看看它在对象库中的属性列表显示情况。先来看默认的情况,如图1-52所示。


图1-52中,作者标识了两个不同的区域Mandatory Properties和Assistive Properties。先知道它们的区别,Mandatory Properties就是对象模型的必要属性,这个区域设置的属性在实际被测对象与对象库匹配时,只要有一个属性不一致就报错。Assistive Properties就没有这个规矩了,并且QTP默认所有的对象模型在这个区域中没有任何属性。

继续回到前面所讲,如图1-52中所示,可以看到WebEdit对象模型的默认必要属性有3个:html tag、name、type。接下来,开始添加百度搜索框这个WebEdit对象,并一起来看一下对象库中的属性列表情况,如图1-53所示。


我们可以看到,对象库列表中的属性(Description properties)也是3个:type、name、html tag,在Object Identification列表中显示什么,对象库列表就显示什么。

关于 Test object details 列表中Description properties(描述属性):在 Description properties里定义的所有属性都是必要检查属性,都会和实际运行时对象的属性校验,如果匹配不上则报错,就以图1-53中的name属性举例,如果实际运行时,被测对象的name属性不是wd,则匹配失败,我们还可以根据项目实际情况额外地在列表下添加更多的必要检查属性,也可以筛检一部分,后续章节会有一些类似的实例。

那在Object Identification列表中删除一个属性,对象库列表中会有什么变化呢?会不会仍然一致呢?继续做实验,在Object Identification列表中删除html tag属性,如图1-54所示。

可以看到html tag属性已经从Mandatory Properties区域中消失了,关于如何让它消失或者复活,已经在图1-54中明示了。那么,再一次将百度搜索框添加到对象库中看效果,如图1-55所示。



实验证明:Object Identification列表中没有的对象库列表中也不会有,如果读者哪一天发现预期结果不正确的时候,请提交缺陷给HP。

不知道读者是否还记得,在“1.3.4 QTP回放机制”那个章节里提到过智能识别这个概念,在Object Identification里也有智能识别的设置按钮,在这里作者介绍下这个功能,并对QTP的智能识别做一些“合理的解释”。我们先来看下Object Identification里的这个智能识别设置功能,如图1-56所示。


首先,我们可以看到,在所有的Web对象模型里,每个对象默认是允许智能识别的(而Standard Windows对象模型里的各类对象默认是不支持智能识别的),在这里的智能识别功能和“1.3.4 QTP回放机制”那个章节里提到的智能识别功能区别在于,这里的智能识别功能针对的是对象模型下的某一个具体对象,举个例来说,比如可以让WebEdit对象开启智能识别,但是不让WebCheckBox对象开启,而那个章节中的智能识别是一个总开关,假设这个总开关是打开的,那么例子中的情况就是WebEdit控件可以智能识别,而WebCheckBox控件则不行,那么假设这个总开关是关闭的,则在Object Identification里无论你怎么设置,任何对象控件都不会智能识别,务必别搞乱了!

其次,在Object Identification里,如果某控件开启智能识别(仍然借用WebEdit对象为例),我们还可以对可智能识别的属性进行设置,如前面的图1-56中,点击Configure按钮就可以弹出设置框,设置框效果如图1-57所示。

从图1-57中可以看到,已经打开了WebEdit对象模型的智能识别设置窗口,左侧的列表中是这个对象默认的基本智能识别属性,这个列表中的一切属性是即刻生效的(即会首先智能识别这些基本属性),而右侧列表是备用属性,暂时是不会生效的,只有当左侧基本属性列表中的属性全部使用过后,仍然没有识别到的情况下才会生效,QTP会根据备用属性列表中的属性按着设定好的属性顺序来一个个继续智能识别,直到匹配到为止,当然连所有备用属性都不能识别后QTP就会报错了。这里需要注意的是,每个对象模型的默认智能识别属性都是不同的。在做项目的时候,一般使用这些默认的设置即可以应付绝大多数情况,毕竟这些默认设置都是Mercury公司设计出来的,相信他们也是考虑再三的,肯定具备一定道理和权威性。


最后,在了解了Object Identification里的智能识别相关功能和回顾了之前的智能识别功能后,现举一个实例来让读者明白,智能识别这个功能究竟是什么?在项目应用中启用了智能识别后会发生什么?

实例:

先说个基本概念和原理,运用智能识别后,QTP在遇到对象识别出问题的时候,会尝试应用智能识别(Smart Identification),如果智能识别能定位出对象则继续执行脚本,反之则报错并提示错误信息,下面看一下这个示例脚本:

Browser("51Testing软件测试网-中国软件测试人的精神家园")._
Page("51Testing软件测试网-中国软件测试人的精神家园")._
Image("51Testing软件测试网").Click
以上脚本来源于51Testing软件测试网首页,如图1-58所示。


对于“51Testing软件测试网”这个Image对象,QTP默认采用alt、html tag、image type属性来识别对象(见图1-59右下部分)。


然而,当开发好上述脚本后,假设开发人员又在同一个页面添加了名叫“51Testing软件测试网-老网站”的Image对象(现在用作登录老网站),同时修改了原来的“51Testing软件测试网”对象的alt属性,改成了“51Testing软件测试网-全新网站”。这样当针对这个新版本的页面重新回放上述脚本时,QTP就不能基于alt + html tag + image type的属性组合来识别原先的“51Testing软件测试网”(现在的“51Testing软件测试网-全新网站”)这个Image对象了,因为alt属性已经改了。但是QTP仍然能够正确地识别出这个对象,为什么呢?就是因为这个时候它开启并使用了智能识别功能(Smart Identifation)。

下面的过程描述了QTP应用智能识别来确认原“51Testing软件测试网”这个Image对象的步骤。

(1)根据Image对象默认设置的智能识别定义(默认智能识别属性是html tag),QTP首先从页面中找出所有html tag属性=IMG的对象(图1-55中可以看到html tag的属性就是IMG),前面也讲过了,在Base Filter Properties这个左侧区域中,定义的属性将进行第一轮筛选和过滤。

(2)如果第一轮匹配不到,那么就会在右侧的Optioanl Filter Properties(备选属性区域)中根据定义的属性顺序地进行筛选和过滤,请看以下步骤。

① QTP会首先检查对象智能识别备选属性的alt属性(默认在备选属性里alt在第一位,但是发现没有等于“51Testing软件测试网”的,因为已经被开发人员改为“51Testing软件测试网-全新网站”了。因此,QTP会忽略这个属性,继续应用下一个备选属性。

② QTP接着检查对象的image type属性(默认在备选属性里第二位),把image type属性不等于“Image Link”这个值的对象过滤出去(图1-59中可以看到image type的值)。

③ 然后QTP检查对象的html id属性(默认在备选属性里第三位),发现所有其他的对象的这个属性的值都是“logo”(见图1-60中对应位置)。

④ 紧接着QTP检查对象的name属性(默认在备选属性里第四位),发现有两个对象“51Testing软件测试网-老网站”和“51Testing软件测试网-全新网站”的name属性都等于“Image”(见图1-60中对应位置),因此QTP把其他的对象又一次过滤掉,只剩下这两个对象。

⑤ 于是QTP再检查剩下两个对象的file name属性,发现只有一个是等于“logo.gif”(见图1-60中对应位置),至此,QTP结束智能识别过程,推断出这个对象是它要找的“51Testing软件测试网”对象,并且点击它。

当然了,如果在上一步仍然不能定位到对象,则还会依此类推继续下去。

图1-60是一个为已经添加至对象库的对象添加必要的识别属性的窗口。需要注意的是,在这个窗口里属性的位置显示是没有次序可言的,或者和Object Identification里智能识别属性设置窗口中是不一一对应的,关于如何打开这个窗口和其他对象库功能的操作见下一个小章节。


1.5.3.2 以一个实例囊括对象库的原理机制与操作流程并揭开整个篇章
已经初步了解了测试对象模型、掌握了Object Identification、QTP智能识别技术,以及对象库的一些原理和机制,内容太多可能有的读者一下子难以消化,在这里再提示一下,演示一个简单的对象库编程的操作流程的实例来启发读者,也为以后更深入地学习打基础。请先看演示需求如表1-3所示。

表1-3 演示需求表


添加对象之前,如图1-61所示。


添加完对象后,如图1-62所示。


脚本显示代码如下:

Browser("百度一下,你就知道").Page("百度一下,你就知道")._
WebEdit("wd").Set"QTP自动化测试技术领航"
结果:

脚本运行回放完毕后,百度搜索框自动输入了“QTP自动化测试技术领航”,如图1-63所示。


这样一个非常简单的实例演示结束了,接着继续更深入地探索QTP的精华对象库以及对象库编程。

1.5.4 对象库基本操作
在上一节中,对对象和对象库有了整体的认知,包括对象库编程在QTP中的价值、对象模型的含义、对象库的一些作用等。在上一节中有很多关于对象库的图例,这些都是作者事先设计好的,但是有些新人读者并不知道这些图例的效果是怎么设计出来的,因为本书还没介绍过对象库功能的操作,那么在本小节中,开始讲一下对象库功能的基本应用与操作,特别要申明下,本小节介绍的对象库指的是QTP对象库的功能意义上的操作,只是一些很单纯的操作方面的东西,就像如何将对象添加到对象库等,而不再像上一节那样指的是“对象库整体”。

首先,我们得知道对象库如何打开,默认有两种方式。

QTP上方菜单栏→Resources→Object Repository。
快捷键Ctrl+R(推荐)。
上述步骤操作后,打开的界面如图1-64所示。

作者已经在图1-64中以数字标识了对象库功能中必须要掌握的操作,接下来将根据数字的顺序逐个介绍这些知识点(部分知识点配合实例)。

1.Test Objects
我们先来了解对象存放的区域,从QTP 10.0版本开始,对象存放区域被分为两块,HP的意图是将测试对象和检查点对象、输出对象区分开来。Test Objects顾名思义是存放着测试对象(图例效果以及关于如何添加测试对象在第6点,这里暂且略过)。

2.Checkpoint and Output Objects
检查点对象以及输出对象。QTP在10.0以前的版本是没有此区域的,但是感觉这块区域单独划分出来实用性不大,而且经过很多实践证明,Checkpoint and Output Objects在做实际项目时很少会被用到,作者仍然罗列出来的目的是把一些“现状”告知读者,最终是否使用由读者决定。


3.对象库中的Action切换
首先要注意,这里的Action切换只是对象库中的切换,别和对象库外面的Action切换搞混了。在这里,可以通过它查看不同Action下的对象,很好的一个功能,可以非常直观地为对象归类,用户在使用时也可以快速查阅不同Action下所属的对象。同时,当需要添加对象时要注意切换到不同的Action再添加对象,比如当前脚本下有Action1和Action2,如果我们需要在Action2中添加其专属的对象,那就需要把Action切换到Action2后才能添加对象,只有这样对象才会被添加到Action2中。如果仅仅只是建立了Action2,但是添加对象的时候没有切换到Action2(即仍然停留在Action1),此时添加的对象自然是在为Action1添加,很容易忽略这个小细节,请务必注意。

此外还要注意一点,假设脚本调用了外部Action,那么对象库中Action一样可以切换到那个外部的Action,但是只有查看对象的权限,而没有添加、删除、更新、编辑、亮灯等权限(灰显),大家可以看一下效果如图1-65所示。

4.对象的剪切、复制、粘贴与删除
这些功能是软件必备的功能。这里作者拿剪切和删除为例告知读者一些该注意的地方(剪切和复制大同小异,无须重复举例)。先看一下图1-66所示。

如图1-66所示,现在如果需要将51Testing的搜索框对象剪切到百度的Page页面下,非常简单,只需要点击对象,然后使用图标或者快捷键Ctrl+X,再选中百度的Page进行粘贴即可(这个效果就不附带例图了,大家都能明白)。


这里作者要提及的是如果剪切(或复制)的是父对象,那么粘贴后,其子对象会被一起剪切(或复制)过去,比如现在把百度的Page对象剪切到51Testing的Browser对象下,效果就会如图1-67所示一样,“百度一下,你就知道”这个Page对象以及其下的“wd”子对象被一起带到51Testing的Browser对象下,并且与51Testing下的Page对象平行。

删除操作也一样,如果删除父对象,则所有子对象一并被删除,现在删除51Testing的Browser对象试一试,删除后效果如图1-68所示。


如图1-68所示,51Testing的Browser对象一旦被删除,其所有内容一并被删除。

5.对象库中对象的查找与替换
QTP的对象库为用户提供了非常快速且方便的GPRS导航系统,它就是Find & Replace功能,快捷键Crtl+F。认识一下这个功能的界面,如图1-69所示。

打开这个功能后就会出现图 1-69 中的界面效果,上半部分是查找功能,下半部分是属性替换功能,在这里就可以将对象的属性值直接替换掉。

6.添加对象
这个功能是罗列的11条里最重要的,没有添加对象也就没有后续功能了。这里需要给读者解释一下,作者本该把最重要的放第1条,但是为了文章的连贯性(如对象库中图标的排列顺序那样,这个按钮也没有排在第1个),所有内容顺序也尽可能与其图标位置相呼应。下面开始添加一个对象。


步骤如下。

第一步,点击Add Object to Local按钮,在点击后会出现一个白色手指。

第二步,拖动白色手指至待添加的对象上,点击鼠标左键。在这里仍然以百度搜索框为例,来看一下点击后的效果图如图1-70所示。


在图1-70中可以看到,在选中并点击对象后,还不算是添加对象完毕,QTP此时还会弹出一个对象选择框,用来做最后的选择。即从图1-70中可以看到,虽然只选中了百度搜索框,但同时这个名为“wd”的百度搜索框的两个父对象也会一起显示,如果此时假设选中Page对象,则最后添加进去的对象是这个Page,外加它的父对象Browser。所以,到了这一步只能说快接近完成一个对象添加过程,但是没有真正的结束。最后补充一个概念:当子对象被添加时,其父对象会一起被添加至对象库,而当父对象被添加时,如还有祖父对象,则父对象连同祖父对象一起被添加至对象库,但其子对象不会被添加,新手务必牢记。

第三步,最终确认要添加的对象,确认无误后点击OK按钮。

总结:在完成了以上3个步骤后,对象就添加到对象库了。实际效果如图1-71所示。


另外,打个比方,现在需要添加百度首页上的另一个Link对象“贴吧”,它们属于同一个页面的,在添加完后,这个对象就会直接隶属于它的父对象下,如图1-72所示。


当添加对象时,一旦白色手指出现以后就无法再继续页面上的任何操作了,如点击、切换网页、拖动滚轴等,因为只要有任何“左击”的动作,它就会帮你添加对象。假设如果在一个页面上添加对象后,需要切换到另一个Web页面添加另一个对象怎么办?一般的办法就是添加好一个对象后,暂时先不激活白色手指,等网页切换了以后再回到QTP界面切换手指,但这样会繁琐。添加一个、两个对象还好,如果要添加很多对象呢?会一直在页面和QTP界面中来回切换。Mercury公司当然预料到了这个情况,他们提供了一个捕捉模式切换功能。在这里作者先不讲这个功能,也只是做个预告。作者会在介绍到本章节的Object Spy这个重要的知识点时,分享这个实用又贴心的功能,添加对象和Object Spy是共享这一功能的,因为它们都需要捕捉,所以都具备捕捉模式。

这个功能点已经讲完了,但是读者还记得在1.3.1节中请拒绝“录制”,再开始你的实际项目之旅中的1.3.1.2节一些“理论性的社会实际问题”实例吗,作者在末尾段说过要做一个实验来证明以手工添加对象的方式效率远远胜于录制添加的方式。如果已经记不清了,请看下面这段加了引号的原文:

“另外,在添加对象方面上,录制也显得差强人意,因为靠录制的方式添加对象,表面上来看十分快速,但是通过这种方式添加到对象库中的对象,它们的命名都是QTP自动命名的,相当的乱,还是需要一个个去改,而且很多对象还是不需要的,QTP也给自动添加进来了,这样弄下来,效率远不如一开始就老老实实一个个添加对象,并根据规范为它们逐一命名再进行编程呢。”

现在应该回忆起来了吧,作者将借用51Testing论坛的注册页面来做个小小的实验。先来看一下真实环境的界面,首先是进入51Testing软件测试网的首页,并在页面的上方找到“注册”按钮,点击进去,如图1-73所示。


在进入了图1-73中的注册页面后,实验就要开始了,我们的业务流程是完成一次注册,所需要使用到的控件作者也已经排列出来了。对于添加对象的方法“是否效率”,暂且先不做对比。在此就先用录制的方式添加这些对象(所谓录制添加的方式就是指在录制这些业务操作的同时,对象会以QTP默认的设定自动添加到对象库),在完成了操作以后,看以下3张相当直观的例图,界面操作图(1-74)、脚本代码图(1-75)、对象库图(1-76)。

简单插一句:界面操作图没什么可说的,是作者刚才在做的事情。

作者有话说:脚本代码图1是录制完毕后,QTP生成的脚本,读者看看这个脚本是否直观?是否简洁?是否优美?作者就此询问了两位QTP初学者,他俩都给出了自己的观点。

甲说:“QTP写的脚本简直太完美了!”
乙说:“感觉不是很直观、精简,应该还可以优化许多!”
作者在这里只会支持“路乙”为什么?请大家看下脚本代码图1(图1-75)中第13、14行和第16、17行代码,这4行代码是对同一个对象控件的操作,读者无论之前是亲自同步操作的或者是看了作者的操作的,请大家讲一下,这个对象控件是刚才操作的哪个对象?相信大部分读者都不好理解。这是很正常的,看着脚本里的“WebEdit("secanswer")”,谁又会在过了1分钟、10分钟、1小时、1天、10天后重新查看脚本(维护脚本)时还牢牢的记住它是一个“验证回答的输入框”对象?当然,在这个超级简单的脚本中,大部分对象控件我们还是比较熟悉的(QTP在录制时为其默认生成的对象名),比如第2行的“WebEdit("username")”一看便知是“用户名输入框”对象,或者会有读者反驳说,自己刚才能迅速反应出是什么对象!那请迅速地告诉自己第20行和第23行的“WebEdit("seccodeverify")”是什么对象?!

—界面操作图— —脚本代码图1—


在这么简单的一个脚本中就已经出现了2处几秒钟后就会令人“费解”的对象,那更别说十天半个月后的脚本维护工作了,估计那时候打开这个脚本看到这两个对象已经完全不记得它们是什么了!那如何才能有效地避免类似的事情发生呢?作者先不说,请读者继续往下看。

再继续找找这个录制出来的脚本的“茬”!大家有没有发现每行代码都特别的长?长到作者必须要通过换行才能把这张例图的内容完全截取下来,不然肯定有一部分代码无法显示了。截图也就不说啦,就说QTP界面,估计这么长的代码也是无法在界面中全部显示的吧?要通过滚动条才能看到末尾的代码。

现在可以开始解释了。QTP录制出来的脚本真是不太直观!那如何应对?做到直观、简洁并使代码显得更加优美?那就是替录制生成的对象“整下容”,个性化定制自己觉得舒服的名字,比如在这里完全可以将“WebEdit("secanswer")”改成“WebEdit("验证回答")”,将“Browser("51Testing软件测试论坛 软件测试 |")”简化成“Browser("51Testing软件测试论坛")”,将“Page("51Testing软件测试论坛 软件测试 |")”简化成“Page("51Testing软件测试论坛")”等。这样代码就直观、很精炼了。另外需要注意的是,对象类型如WebEdit是不可以更改的,只能修改其括号内的Name。

不过,不能在脚本里直接改,必须要在对象库里改,否则运行的时候对象库里的对象和脚本里所描述的对象就不匹配了,会导致报错!那就进入对象库,先看看“对象库图1”图1-76所示。

先不说怎么为对象改名,当务之急是要继续找对象库的“茬”!图1-76中的这些对象就是在录制时同步添加进对象库的,是脚本里所有涉及的对象。我们可以看到,在这个对象库中呈现出,有的对象默认以中文命名、有的对象却又默认以英文命名,而有的对象的默认命名不够精简。其实这些“茬”刚才在“脚本代码图1”中是同样存在的,只是作者有意将其留到这里。作者找出这个“茬”也不是没根据的,同样地请读者看这份对象库列表,你能迅速而准确地告诉自己每个对象符号代表着哪个对象吗?结论很明确,“茬”也找的差不多了,解决办法前面也讲过了,就是通过先进的科技手段为这些对象“整容”!怎么整?下面作者为读者做个示范,将图1-76中最下面那个WebEdit对象“username”弄成“用户名”。


步骤如下。

第一步,选中“username”这个对象后,将光标定位到右上角的“Name编辑框”,输入“用户名”,如图1-77所示。


第1章 测试脚本开发从零开始
第二步,随意点击一下界面任何位置,目的是为了完成Name的变更,相当于点击“确定”的功效,“整容”后的效果如图1-78所示。

简单两步,“整容”完毕!可以很清楚地从图1-78中看到“username”,从此以后将以更易理解的“用户名”展现给大家。另外再来看看脚本中的第2行代码,发现对象在对象库中更改名称以后,在脚本中也会自动更新,可以看到在脚本中原先的“WebEdit("username")”同步更新成了“WebEdit("用户名")”。


这个小功能还是比较常用的!

接下来展现一下作者已经全部修改好的对象库与脚本,见脚本代码图2(图1-79)、对象库图2(图1-80),看这样是不是优化多了!

—脚本代码图2—


这样处理过的时间长了再回来看脚本和对象库也是一目了然的。但是,这些都是作者之后的补救工作,是后面才改的,这样也会存在不少风险,有时候稍不留神就会改错,要知道对象改错了是会影响脚本的。同样也相当浪费时间,还要在对象库中一个个去识别这些陌生的对象,那还不如在一开始添加的时候就一边添加一边改名呢,这样就绝对不会遗漏和弄错,同样也节省了很多时间!


最后,我们来做个设想,这个业务是非常简单的,对象控件也比较少,我们还能勉强改过来,那如果碰到业务相当复杂、对象控件相当多的情况呢?还能那么轻易地修改吗?读者还可以跟着作者做一个实验,用手表或计时器看看手工添加对象速度快还是录制后修改来的快!前提是效果必须不能比“脚本代码图2”和“对象库图2”中的效果差,至少也得保持一致。顺便提醒一下:对象越多、业务越复杂,“手工添加”越能超过“录制后修改”!

7.对象更新
当版本更新后,原先的脚本由于对象变化导致无法顺利运行,此时就可以使用这个功能进行更新,操作步骤和添加对象的3个步骤完全一样,只是按钮不同,这里不再重复。另外需要注意的是,假设在对象库中选中的是WebEdit控件,但是想更新成Link控件,则会报错,如图1-81所示。


虽然无法更新不同种类的对象控件,但是同种类的控件可以随意更新,切记!另外,作者在做项目时,也碰到过一个现象,就是对象其实没有改变,但是仍然由于对象识别不了而脚本报错了,此时,也可以使用对象更新功能,更新一下就好了。一直不确定为什么会如此,但是的确很实用,也算是作者的一个经验分享吧。

8.对象闪烁(亮灯)
Highlight in Application功能可以使对象在程序或者Web网页上闪烁,非常的显眼、高调!在实际项目中,这个功能使用率很高,大多出现在调试脚本的时候。作者就经常在脚本出现错误时(由对象不能识别引发的错误),首先先“亮灯”,看看能否定位到对象,如果能“亮灯”就说明对象本身是能识别的,可能是因为其他原因综合导致对象假象性的无法识别,当然如果不“亮灯”,那就很明显是对象属性变更导致的识别不了对象。好好地利用“亮灯”技术可以给脚本调试带来很多便利。

脚本错误的原因可以说是千变万化,调试脚本、定位错误绝对是门技术活,在这里就可以靠“亮灯”来一步步定位,排除可能性。反正,只要能成功定位脚本错误的具体原因,无论是什么方法,都是好方法,在今后的内容中,作者也会尽量多列举些这方面的内容。

补充一个小知识点,这个“亮灯”功能有一个Highlight的隐藏方法,如果将代码写入脚本,那么当执行完这句代码以后,本句代码的对象在程序或Web页面上同样会进行闪烁,效果和点击图标是一样的,在某些特殊情况下脚本调试时会运用到。举个例子,下面这句代码就会使“wd”这个WebEdit对象闪烁:

Browser("百度一下,你就知道").Page("百度一下,你就知道").WebEdit("wd").Highlight
9.初步认识下Object Spy
在打开对象库以后,也有一个Object Spy功能,这个功能和另一个QTP内置Object Spy是一模一样的。Mercury把这个功能也放进对象库应该是为了让用户使用更方便。在这里,读者暂时先知道对象库里也有一个就可以了,后面的小节中会重点讲解Object Spy相关知识。

10.Associate Repositories
这个功能的中文名叫副对象库,形象点可以把它看成一名开长途车的“副驾驶员”,当主驾驶累了副驾驶可以顶上继续长途跋涉。这个副对象库功能在实际项目应用中经常会被使用到,可以根据具体的业务情况事先封装好一些项目要用到的对象,并组合成一个对象库文件,在需要时就可以调用这些对象库文件到对象库中,成为一个副对象库。不过使用副对象库功能会有一个弊端,就是在加载后会产生很多ObjectRepository.bdb文件,读者需要了解一下。那么接下来,让我们先来看一下具体是如何调用的,图1-82就是打开副对象库后的窗口界面。


图1-82就是打开副对象库后的效果,界面非常直观,操作也相当方便,作者在这里就不对如何操作做过多的阐述了。界面中一共有3块区域,已经在图中标识了,接下来,让我们一起动手做一个完整的实例。

预备工作。

(1)事先准备两个对象库文件作为副对象库,分别命名为link.tsr以及edit.tsr(其中link.tsr内置“百度”首页上的“视频”这个Link对象,而edit.tsr内置“百度搜索框”)。

(2)启动QTP。

(3)准备两个Action(除默认的Action1外再新增一个Action2)。

(4)开启对象库并将库中的Action切换至Action2。

(5)进入“百度”首页,将“百度一下”这个WebButton测试控件添加至对象库。

暂时不用管.tsr对象库文件是如何生成的,在本小节最后的补充知识点中,以及后续介绍Object Repository Manager那个小节中都会讲到。

要求&完成目标。

(1)不得再添加任何对象控件。

(2)使用已有资源并利用副对象库功能完成以下业务。

在Action1中点击“视频”链接。
在Action2中输入“QTP自动化测试技术领航”并点击“百度一下”。
(3)Action2很有可能以后会添加新业务,所以,需要在Action2中包含所有已知业务所需的对象,即“视频”这个Link对象也需要存在。

(4)无须写脚本代码,只需相应地设计对象库即可。

首先回顾一下刚学过的知识(3.对象库中的Action切换),在上述描写的预备工作中的第4点中我们将Action切换至Action2了,所以在完成了第5点后,此时“百度一下”这个测试控件被添加在对象库中的Action2里,而Action1里是没有这个对象的。

接下来开始“审题”并依次进行解题,请看以下步骤。

第一步,不得再添加任何对象控件。

本点要求不得再添加任何对象控件,所以,必须也只能使用副对象功能才可能完成任务。

第二步,在Action1中点击“视频”链接。

要完成此步则必须将“视频”这个对象添加到对象库中,所以,需要将link.tsr文件导入副对象库,如图1-83所示。

我们可以看到link.tsr文件已经被导入到副对象库中(路径自定)。但是,此时尚未完全成功,还需要一步,就是将这个link.tsr文件具体分配到Action的操作。在图1-83中可以看到,在可用Action区域中一共存在两个可用Action,这两个Action就是在脚本中建立的,脚本Test中有多少个Action,这个区域就有多少个Action。


什么是脚本Test?请先看图1-84和图1-85所示。


我们来看上面两张图,通常建立的最基础的脚本就是Test(图1-84),在Test Flow中,Test下会以列表形式显示所有Action及其执行逻辑与顺序(图1-85)。

根据业务要求,我们把Action1拖至右侧的已用Action区域(Action2暂时还没用不动它),如图1-86所示。


在图1-86所示的步骤完成后,点击OK按钮,整个操作完成,link.tsr文件中的对象也将成功载入到对象库的Action1中,如图1-87所示。


如图1-87,有了对象,就可以开始对象库编程了,不过需要注意的是,从副对象库中引用的对象是灰色的,无法编辑的,如果想编辑对象,则必须先将其变成本地对象,这个在这里就不多讲了,后面会在“11.对象库的切换”中讲到。

第三步,在Action2中输入“QTP自动化测试技术领航”并点击“百度一下”。

这个步骤很有意思,这里需要先输入再点击这两个步骤组合完成。我们在预备工作中已经为Action2添加了“点击”所需的对象了(图1-88),现在就需要通过导入副对象库的方式组合进来。我们把“输入”所需的对象给添加进来,步骤不再重复,直接忽视,最终效果如图1-89所示。


下面就可以根据业务要求正确地在脚本的Action2中进行对象库编程了。

第四步,Action2很有可能以后会添加新业务,所以需要在Action2中包含所有已知业务所需的对象,即“视频”这个Link对象也需要存在。

这一步唯一要做的就是把“视频”对象同样添加到Action2中,以备不时需要。“视频”对象在 link.tsr 文件中,在添加前可以看到目前该文件中的对象没有出现在 Action2中(图1-89),就是因为在设置时没将Action2从可用设成已用(见图1-26)。所以,只需要将Action2“右移”就可以了,步骤直接忽略,最终效果如图1-90所示。


在“视频”对象被添加进Action2后,目标也就完成了。不过相信细心的读者会发现一个问题,大家先把书翻到前面看图1-87,在link.tsr文件被加载后,Action1中的所有对象都是灰色显示的,这代表这些对象是从副对象库中加载的,那为什么到了Action2中,只有“视频”这个子对象灰色而其父对象与祖父对象不灰色(请看QTP当前环境,也可看图1-90)?其实道理很简单,“视频”、“百度一下”、“wd(搜索框)”都是子对象,它们的祖父对象Browser以及父对象Page是3兄弟共有的。之前已经完整操作过一遍了,添加“百度一下”是添加到本地对象库的,所以,其父对象Page以及祖父对象Browser也属于“本地对象”,“本地对象”是不会灰色且可编辑的,这个毋庸置疑。那么在“视频”对象加载进来后,由于它的祖父对象和父对象与Action2中的完全吻合,QTP会在吻合的时候进行合并,“户主”还是原来的“本地对象”,所以“视频”对象只能自己灰色,QTP绝对不会允许它改变它祖父和父亲的“户籍”,这就是QTP的一个规则,虽然不是很重要,但是还是需要为读者揭开这个谜团。其实在之前加载“百度搜索框”的步骤时就已经出现了这个情况,“wd”灰色而其祖父Browser与父亲Page不灰色。

到这里为止,整个实例过程讲解全部结束,这个实例还是比较细致的,在分步讲解过程中,也扩展穿插了一些小知识点,希望读者能够完全掌握“副对象库”的使用方法并做到融会贯通!另外需要注意,点击QTP的上方菜单栏Resources→Associate Repositories,同样能够打开副对象库,入口不同但是结果是相同的。

在结束第10小点之前,作者还要分享一句代码,它就是本书中会陆续讲到的3大实时动态加载的第1个之“动态对象库加载”,代码如下所示:

RepositoriesCollection.Add"D:QTP自动化测试技术领航link.tsr"
这句代码写在脚本中,一旦被执行到以后会触发加载对象库文件使其成为副对象库的事件,效果和手工添加副对象库完全一致,只是没有了选择Action并加载的步骤,因为没必要,把这句代码写在Action1中,则说明加载到Action1中;添加到Action2中,则代码加载到Action2中,依此类推。通常,把3大实时动态加载的代码写在脚本的最前面几行,另外需要注意的是,3大实时动态加载的生命周期都很短,脚本执行结束它们也就结束。下面提供一个用VBScript后台语言动态调用副对象库的函数供读者参考:

PublicFunction AddObjectRepository(objectrepositoryname)
Dim Pos
 '判断:如果已存在".tsr"后缀名则直接使用该文件路径,如果不存在则添加后缀名
Ifinstr(objectrepositoryname,".tsr") > 0 ThenRepPath = objectrepositoryname
elseRepPath = objectrepositoryname & ".tsr"
End If'初始化:如果存在残留的副对象库则删除RepositoriesCollection.RemoveAll()'添加副对象库RepositoriesCollection.Add(RepPath) '添加后的验证:查找副对象库并将值返回给变量,如果存在返回1Pos = RepositoriesCollection.Find(RepPath)
MsgBox Pos'返回的值如果不等于1代表不存在则报错
If Pos <> 1 Then
MsgBox"找不到副对象库!"
End IfEnd Function
'调用该函数
Call AddObjectRepository("D:\QTP自动化测试技术领航\link.tsr")

11.对象库中对象类型的分类与切换
这个功能相对比较简单,其更大的意义在于方便用户操作,可使对象库的类型根据实际操作进行准确而快速地分类,它是以下拉框形式出现的,默认情况下只有All Objects和Local Objects两个类型,含义就如同其字面意思,不多做解释了。

接下来做一个实验,首先需要有低碳的理念,所以原材料仍然复用之前的link.tsr文件,在导入副对象库并应用到Action后,再添加一个“百度搜索框”(本地添加)。在这些准备工作全部完成以后,可以看到对象库中又多了一种对象类型link.tsr,这个其实就是副对象(也可叫作辅助对象),以导入到副对象库的对象库文件名显示,可以有多个不同的副对象,它们的命名也各不相同,但是都属于同一个种类。分别来看一下各种对象类型的实际图例,如图1-91、图1-92、图1-93所示。


如图1-91所示。All Objects下显示了所有的对象,其中副对象“视频”以灰色显示,但是其父对象Page和祖父对象Browser没有灰色,被转化成为本地对象,因为它们另外还有个身为本地对象的后裔“wd”,这个知识点在前面的内容中已经讲解过了,希望在这里能起到一个复习的作用。


如图1-92所示,Local Objects下正确显示了手工添加的本地对象,副对象是绝对不会在这里出现的,如果出现请将Bug提交给HP公司!


如图1-93所示,可以看到所有的对象都是灰色的,这就足以证明它们是通过特殊渠道进来的,这里会显示link.tsr文件下的所有对象。除此之外其他任何本地对象都被排除在外,如果有多个副对象被添加进对象库,它们也只会各司其职,绝对不会发生link.tsr中出现edit.tsr中的对象的错乱情况。

在这里还需要提到一个功能,可以看到,图1-93中的这些对象都是不能编辑的。在讲“副对象库”的时候就讲过,由副对象库导入的对象是无法编辑的,要编辑的话就必须使其先“转职”成本地对象库(即主对象库)。怎么“转职”呢?很简单,在你需要“转职”的对象上点击右键后,再点击Copy to Local即可,现在要把“视 频”这个对象“转正”了,来看下面的操作实例,如图1-94所示。


请注意图1-94中的两个方框位置,先来看左下角的这个,Copy to Local是灰色的,这是怎么回事?刚才还不是说副对象可以转成本地对象的吗?那为什么这个功能灰色了?请看右上角的方框,此时,对象库的对象类型是link.tsr,也就是副对象,而要使对象“转职”必须切换到All Objects下进行,操作实例如图1-95所示。

同样先注意两个方框位置,这个时候可以清楚地看到Copy to Local可以点击了。点击后即宣告“转职”成功,需要注意的是在“转职”后,原先的副对象库文件是绝对不会受到影响的,因为“转职”只起到了Copy作用,它并没有改变文件自身内容的本领。另外还需要注意一点,“转职”跟复制、剪切、删除对象是相反的,父对象一旦“转职”了,祖父对象也受影响跟着“转职”而不会制约子对象,复制、剪切、删除则是父对象制约子对象,而祖父对象不受任何制约,正好相反,读者可以多加尝试!


知识点补充。

以上的11点全部讲解完了,除此之外,作者再介绍一项图中没有用数字标识出来的对象库导出(替换)功能,在项目应用中也时常会使用到,先看这个功能出自于哪里,如图1-96所示。

上图1-96所示就是这个功能的具体位置,File菜单下有3个子菜单,其中Close就是关闭对象库,这个太简单了,主要说一下“Export Local Objects”和“Export and Replace Local Objects”,这两个功能的共同点是,它们都可以导出对象,前者就是最单纯的导出本地对象,而后者稍许复杂点,除了导出本地对象以外还有一个“代替”的附加功能,这个附加功能的实际效果是什么?让我们一起来看两个实例。第1个实例就是最简单的导出对象,操作实例图1-97所示。


通过图1-97中的操作,就可以保存一个对象库文件到指定文件夹中了,之前一直用的link.tsr就是这么来的,这个是最简单的,接下来主要讲讲后者,在讲之前先做一下准备工作。很简单,在新脚本里添加一个“百度一下”按钮就可以了。继续,后者其实就多了一个“替换”的附加功能,作者起先误以为是保存文件的时候,如果命名相同则会覆盖,保留下新的文件内容,但是仔细想想就觉得不对,这好像有点多此一举,因为Mercury并不需要单独开发这个功能,Windows系统现成的就有这个功能了,那这里的替换到底是什么?作者其实也不大明白……那我们现在怎么办?还记得1.2中学到的知识吗?通过帮助文档“F1”找到想要的答案,在输入关键字“Export and Replace Local Objects”后,“F1”终于揭开了真相,如图1-98所示。

如图1-98所示,帮助文档已经写的非常清楚,原来选择Export and Replace Local Objects后,这些对象就会自动替换成副对象(也叫辅助对象),以副对象的身份出现,其本地对象的身份将被剥夺,原来这里的替换含义是将本地对象替换成副对象,实际效果就是导出这些对象并自动替换成副对象来使用,那么将其导出,就命名为“实例2.tsr”,并且来验证一下到底正确不正确。需要验证两点:第一点,副对象是灰色的,那我们来看究竟有没有达到预期结果(读者也可以自己在本地环境上同步试验),如图1-99所示。



第一点通过了,那么接下来验证第二点,副对象库里是否存在刚才被导出的文件,打开副对象库,如图1-100所示。


我们可以看到,在副对象库中的确存在“实例2.tsr”这个文件,并且当前Action自动会从可用区域移至已用区域,这也就意味着该文件中的对象已经在履行副对象的使命了。至此,试验结束,验证通过,和“F1”里描述的毫无差错。通过这两个实例,相信读者应该可以理解导出对象的两个不同的概念及其运用了。特别是后者,如果能在实际项目中举一反三且灵活运用的话,一定可以化繁为简,并很大程度上提高对象维护的效率。

本小节的内容针对对象库功能的基本操作,但是都是非常具有实用的,扩展操作或高级操作如共享对象库、对象库合并等知识在后续小节中讲解。

1.5.5 Object Spy让对象无处藏身
1.5.5.1 结交新朋友—侦探Jack
做基于界面的功能自动化测试,其归根到底就是对界面上的对象控件做文章。想要掌控这些“五花八门”的对象控件,就一定要深入地去认识它们,只有掌握了它们的内部结构,自动化测试工程师才能把测试工作做起来。内部结构是什么?其实就是一个个(大批量)的对象属性,正是利用这些属性才能控制这些对象控件,以便使用它们做每一件事。不过,对象控件不是万能的,它们都有自己的业务范围,所以,它们只对范围内的有效!

那么,该如何去探知对象控件的内部结构呢?有两种办法:第一种,自己识别对象控件的内部结构!如果第一种办法不适合你或者你没法实现。那么第二种办法就是获得一种探测器工具,用它可以轻松探测各类对象控件的属性。在这一小节,作者将讲解第二种办法。

市面上,有很多自动化测试工具内置这样一个探测器,因为只有探测到了对象控件的内部属性,才能继续将自动化测试做下去。如果没有内置的探测器,也一定要去寻找一个独立的外部探测器来配合使用。QTP直接提供了一个重量级的探测仪,它就是Object Spy,它一定会是你自动化测试旅途的“贴身伴侣”,让我们来认识一下这位新朋友,有3种方式可以调用它。

(1)QTP上方菜单栏→Tools→Object Spy。

(2)QTP默认显示工具栏中点击Object Spy的图标,如图1-101所示(推荐)。


(3)打开对象库,在对象库中找到“侦探Jack”,然后点击它(推荐)。

3种方式中有两种是推荐使用方法。如果没有打开对象库,那就直接点击工具栏中的图标,如果对象库已被打开,那么就可以点击里面的图标(前面的内容中已提到过,点击对象库中的Spy图标一样能调用它),做到灵活应用!细心的读者会问,为什么不支持快捷键?这个问题请咨询HP,至少目前暂时还没有快捷键。那么接下来,有请我们的“侦探Jack”,如图1-102所示。

如图1-102所示,已经见到了“Jack先生”的庐山真面目,那么接下来作者用它探测一个对象,然后对这个界面做一些说明(如何探测先不讲,后面就讲。另外,本说明只针对新人,已经会的朋友请体谅下作者要照顾到每一位读者,暂时跳过即可),被探测的对象是百度的搜索框。那么就让新人和作者一起来看界面说明图,如图1-103所示。

界面详细说明。

1.探测手指
点击该手指后会出现一个白色的手指,就和添加对象一样,作用就是选择需要探测的对象,在下一个小节中,作者会扩充一个知识点“捕获对象时的模式切换”。

2.Keep Object Spy on top while spying
探测时保持探测器置顶,这个就看个人习惯了,默认是勾选上的,也就是总是保持置顶的,如果不习惯这种方式,取消勾选就可以了,在这里还是推荐大家采用默认的形式。

3.显示对象的区域
在使用探测手指后,这块显示区域会显示Object Spy探测到的对象及其父对象、祖父对象。默认是停格在被探测的对象上,如果需要查看它的父对象或祖父对象,只需点击即可。在这里能看到“百度搜索框”被探测到了,它就是“WebEdit:wd”。

4.Native Properties和Identification Properties的切换
这是一个重点,也是学习Spy探测器最难的地方!这里所牵涉的内容不只包括本小节,还包括本小节以外的另外几个小节。在这里先大致介绍一下,以后还会多次碰到。首先,作者在这里做一下翻译工作,Native Properties = 本地的属性,IdentificationProperties = 鉴别属性,这两个名词一定看不懂。让作者来替广大新人读者解惑,本地属性就把它看作一个对象控件的自身接口的属性,而鉴别属性它是QTP默认为该对象控件封装的属性。本地的属性相当多,是封装属性的数倍!下面图1-104所示是切换到封装属性的情况,显示的都是“百度搜索框”的封装属性:


图1-106就是“百度搜索框”的一些封装的属性。什么叫封装?这个在这里就不多解释了,因为和本书无关,不过在这里可以告诉你,QTP,把“百度搜索框”封装成一个 WebEdit 控件,依据在哪?因为 Class Name = WebEdit(位置在图1-104中已标注)。Class Name就是“百度搜索框”众多封装属性中的一个,读者可以重新选择到本地属性里去看看有没有Class Name,答案是没有!至于这些封装属性是怎么来的呢?答案是 QTP 自己给封装好的。所以,关于这些封装属性的秘密,在下一章节中会讲到,敬请期待吧!

言归正传。两种属性都是在实际的运用中经常会被用到的,调用不同的属性方法的形式也是不同的,两个概念上的介绍基本就到这里了。


后者是IdentificationProperties,以后会牵涉到对象库编程中的两个重大概念Test Objects(测试对象,TO)和Run-time Objects(运行时对象,RO),在为TO或RO进行编码的时候使用的就是QTP自己封装的这些对象属性。关于前者,也就是Native Properties有其独特的调用方法。

5.Properties和Operations的切换
这里以切换选项卡的形式来查看对象的属性或查看关于该对象控件的操作的一些方法,默认选项卡是查看对象属性的。

6.对象属性&对象操作的详细表


本条和第5条是关联的,在这个区域能查询到对象的属性(包括本地的属性和鉴别属性)及其属性值或对象控件的一些方法,在图1-104中,我们可以看到对象的具体属性显示效果,那么接下来,把选项卡切换到“对象操作”效率效果,如图1-105所示。

在如图1-105中,可以查看到关于“百度搜索框”的一些可执行的操作及其方法,如CheckProperty、Click、Drop、ChildObjects及Exist等。

7.文字显示区域
别小看这一块小小的区域,在实际项目中有实际的用处的,现举两个例子,先来看一下两张图(图1-106和图1-107)。


首先需要说明一下,在图1-106上鼠标箭头停格在default value这个属性上并点击,而图1-107则是停格在属性abs_x的值606上并点击,由于鼠标箭头无法被截在图中,所以只能在图中标记。

为什么说这个小小的区域很实用呢?第一个例子大家请看图1-106,假设需要把default value这个属性写到脚本的某行中去。那么此时有两种办法,第一种就是手写,一个一个字母的拼写,显然这种方法效率比较低,而且容易拼写错。所以推荐第二种方法,就是去点击表中的default value,点击后,在文字显示区域就会显示default value了,然后再复制、粘贴到脚本中,这样效率就大大提高而且绝对不会出错了。这个default value的例子还是比较经典的,请注意当中是有一个空格的,用这种的话就保证不会漏掉这个空格了。

然后看一下第二个例子,在这里不光可以点击“属性”,还可以点击“属性的值”,同样可以出现在文字显示区域中,比如图1-107中的606。除此之外,Operations选项卡下的内容同样能够点击、显示,只不过Operations选项卡下的内容只是看看就行了,是没有实际性用途的。

8.具体描述区域
这个区域中会显示一些QTP自带的描述信息。细心的读者应该会发现,Properties选项卡下这块区域是没有什么描述信息的,这说明HP公司并没有给各类属性添加描述。但是在切换到Operations选项卡后,可以发现HP公司给所有QTP自行封装的方法进行了描述,比如Click方法(图1-108),而自身接口的一些操作方法都是没有描述的,同样如Click方法(图1-109)。


这个知识点大家只需要了解即可,即使QTP自带的封装方法有一些描述,也没有必要去看,因为我们有“F1”这个好老师。

1.5.5.2 捕获对象时的模式切换
在讲解对象库功能之一“6.添加对象”的时候,作者分享了“小提示9”,读者可以重新翻回到那部分内容。当时提出了一个问题“假设在一个页面上,添加对象后需要切换到另一个Web页面添加另一个对象怎么办?”,最后作者给出了最好的解决方案“在添加对象时,QTP提供了捕捉模式切换功能”。但是作者并没有继续深入下去,因为添加对象时的模式切换是和本小节要讲到的Object Spy捕捉对象的模式切换是一致的,现在,可以好好学习一下这个技巧了,这个知识点在今后的实际项目运用中经常会被使用到。

作者先举一个简单的例子,还是借用“百度”为例,当我们打开百度进入到百度首页时,会发现有个搜索框,这个搜索框是有讲究的,它支持AJAX技术,直白点说也就是模糊匹配下拉框功能,那么在这里我们将通过这个功能来进入本小节的主题。

实验开始了,在搜索框中输入“QTP”,可以看到此搜索框下面会自动出现一些模糊匹配“QTP”的关键词,如图1-110所示。

假设需要在这功能上做自动化测试,首先需要抓取到这些对象(模糊匹配出来的关键词)。那让我们试着使用“侦探Jack”去抓取它们!但是,我们会发现在抓取的时候事情出现了。你会发现“侦探Jack”根本无法抓取到图中的这些模糊匹配出来的对象,当点击探测手指以后就相当于切换了窗口,再切回来的话模糊匹配下拉框就必定会消失,这样就导致根本无法正常捕捉到这些需要获取的对象……这块功能的自动化测试就无法进行下去吗?当然不是!其实这块功能的自动化测试是非常简单的,问题就出在无法捕获到这些模糊匹配的对象控件。为了解决这个问题。那么在这里为读者介绍的模式切换就起到了决定性的作用,我们完全可以不需要切换百度窗口而直接获取到模糊匹配下拉框里的对象,这就是模式切换的优势,接下来,会详细讲解本小节的主题—捕获对象时的模式切换(当然也包括了添加对象时)。


通常使用过QTP的读者都会发现,当使用Spy或者对象库捕获对象时,一旦点击白色手指后就只能抓取对象而无法进行其他任何操作。但其实当在点击了白色手指之后,仍然可以通过两种模式切换操作,使得切换后可以停止对控件的抓取,并还可以对被测对象进行操作。那么,看一下是哪两种模式。

半操作模式—CTRL键 支持点击。
全操作模式—CTRL+ALT键 支持点击和键盘输入。
1.半操作模式详解
首先进入百度首页,当使用Spy并点击白色手指后,可以看到鼠标光标是手指的状态,此时也就是捕获对象的状态。在这个时侯是不可以做任何操作的,只能抓取想要的对象,而当按住CTRL键并保持不放开,就可以做点击动作了,如同正常操作网页,也包括拉动滚动条等。与此同时,鼠标光标也会从“小手指”变回原来的鼠标箭头,当放开CTRL键时,可以看到鼠标光标又会从箭头恢复到“小手指”,也就等于恢复到抓取对象的模式。

2.全操作模式详解
全操作模式就是支持任何操作,包括点击和键盘输入。当处在抓取对象模式的情况下按住CTRL键不放,然后再按下ALT键,紧接着先松开CTRL键再松开ALT键,这样就已经成功切换到全操作模式了。假设在此模式下在百度搜索框中进行输入操作,输入“quicktest”(图1-111),在输入后百度搜索框会弹出模糊匹配下拉框,这个时候可以通过点击CTRL键,然后松开从而达到切换回抓取对象模式的目的,此时模糊匹配下拉框也就不会消失了,这样就能够对模糊匹配下拉框对象控件进行“抓取”,也就成功解决了之前无法抓取到该对象的难题(见图1-112)。有了模式切换,就算再“狡猾”的对象控件也照样会被一网打尽。


当在使用Spy抓取对象时,如果遇到需要抓取的对象恰好被Spy窗口挡住的情况(图1-113),可以拖动Spy使其不会将需要添加的对象挡住(图1-114)。


整个Object Spy操作运用就介绍到这里了,对于自动化测试工程师来说,“侦探Jack”起着至关重要的作用,往往需要去探测一些对象控件的属性并利用它们,这就全要靠我们今天认识的这位“新朋友”了。特别是新人,他们往往对对象控件的“习性”不够熟悉,所以更加需要依赖于Spy,直到对每个对象都非常熟悉以后,可以逐步摆脱Spy来节省时间。

1.5.6 对象库的最高指挥官(Object Repository Manager)
1.5.6.1 使用公共对象库更有利于项目管理
对于使用QTP的自动化测试项目来说,其对象库的管理在整个自动化测试过程中占有非常重要的地位。特别是对于一个大型的应用系统,往往界面上的对象多而杂,所以拥有一个统一、规范、直观、有序的对象库将非常有利于脚本的快速开发以及团队成员间的协作。在前面的小节中已经深入介绍了Object Repository,不过这只能说已经掌握了单兵作战的技巧,在真实的自动化测试项目运用中,我们需要的是整个团队的协作,只有这样自动化测试项目最终才能成功。如果选择对象库编程来完成所在的项目,那么如何管理好对象库将是一门很大的学问和最当务之急要研究、探讨的事情。

有幸的是,QTP提供了一套管理对象库的功能,由此也就产生了公共对象库的概念。那么,什么叫公共对象库呢?举个最简单的例子,假设系统中有3个模块,分别由3名自动化测试工程师负责,此3人在完成自己模块的脚本开发后,开始进行脚本联调,但是他们发现自己模块的脚本单独运行都非常完美而却在集成完毕以后发生了致命的错误,没有一个组合后的业务脚本能够顺利的通过。最后他们发现,导致如此的原因是因为,他们没有一个统一的对象库,比如有一个公共对象Browser(“browser”),3个模块都具备这么一个对象,但是3名工程师分别把它写成了Browser(“browser1”)、Browser(“browser2”)、Browser(“browser3”),对象的命名规范都没有统一,那最终集成到一起以后怎么可能没有问题呢?要想防止类似的问题发生,就必须管理好对象库,将凌乱而琐碎的对象进行统一管理,并集成到一个对象库中,所有工程师只在这一个对象库上进行脚本开发工作,因此也就产生了公共对象库这个名词!当然,作者也并不是说必须所有的对象全部集合在一个对象库中,但是至少(再次强调“至少”这两个字)模块间共有的对象必须提炼出来并统一命名,然后封装成一个供所有团队成员共享的公共对象库。这个公共对象库是不能随意变更的,必须有专人进行严格控制及维护,这个在本书的第一章中就已经讲过。另外,关于如何调用公共对象库,请读者复习“1.5.4 对象库基本操作”,这个小节中的第10点“Associate Repositories”,在这里就不再对这些知识点做重复性的阐述了。现在去认识对象库的最高指挥官Object Repository Manager吧。

首先,召唤Object Repository Manager的方法不像召唤Object Spy那样的多,既没有快捷键,也没有什么直接可以点击的图标,唯一的入口就是。

QTP上方菜单栏→Resources→Object Repository Manager。
点击进入后,界面效果如图1-115所示。

从图1-115中可以看到Object Repository Manager中的很多可用功能和前面已经介绍过的Object Repository中的完全是同一个功能,在图1-115中,作者只是特别标注了个别几个。这些既然前面都已经介绍过,在这里就略过了。接下来,结合一个实例来介绍Enable Editing这个功能(图1-115中已标注位置)以及整个对象库管理的大致操作流程。

Object Repository Manager的实例1。

Step 1,依次选择File→Open→link.tsr。

打开之前使用过的素材<一个对象库文件>,打开后的效果如图1-116所示。


在1-116图中,读者需要注意到3处地方,Read only、Add按钮灰色以及所有对象的灰色,由此可以得出结论:原来在Object Repository Manager中打开一个对象库文件后是不能进行编辑修改的,也不可以添加新的对象进来,只可以单纯地“看”!那这样的话,这个对象库管理机制还有什么实质意义呢?难道想要添加或者修改亦或者删除一些对象都不行吗?

当然不是!这只是默认的一个情况,在Object Repository Manager中提供了一个按钮,它就是Enable Editing,点击它以后,就可以随心所欲地进行各种操作了。那我们来点击它并看一下点击后的效果,如图1-117所示。

如图1-117所示,这个Enable Editing按钮功能重新给我们带来了“光明”!

当“管理”好对象以后,就可以将战果保存下来了,这个就简单了,在File菜单下New、Open、Save、Save As等一些功能。

Step 2,依次选择File→Save(也可以使用快捷键Ctrl+S)。


至此,对象库管理的一个大致流程就完成了,当下次再打开link.tsr文件后就会发现对象库中的对象已经被优化过了(新增、修改、删除、合并等)。当然,你不想去改变link.tsr文件的话,操作Save As保存就行了,将当前对象库以其他命名保存。所以,对象库文件除了可以在Object Repository中通过导出生成,在这里也同样可以生成,只是存在着一些区别,一个叫Export、另一个叫Save As,仅此而已。

1.5.6.2 对象库的对比与合并
既然是在介绍Object Repository Manager,那就不得不提起它的两个“王牌级”的辅助工具:一个“Object Repository Comparison Tool”,另一个“Object Repository Merge Tool”。这两张王牌是内嵌在Object Repository Manager中的,使用它们的方式也很简单,分别是选择Tools→Object Repository Comparison Tool,以及选择Tools→Object Repository Merge Tool,不过千万要记住这里的“Tools”是对象库管理工具里面的那个。另外,这两个辅助工具和对象库管理工具一样,打开以后都是以独立的窗口显示的,和QTP程序窗口是分开的,好象它们都是一个个单独的小程序,让我们来看一下全部打开以后的效果,如图1-118所示。

那么接下来,将使用两个实例来介绍这两个辅助工具的用法与作用,以及操作它们的一个大致流程。先来介绍Object Repository Comparison Tool,一起来看下面这个实例。


Object Repository Manager的实例2。

Step 1,依次选择Tools→Object Repository Comparison Tool。

打开对象库对比工具,进入后的界面如图1-119所示。


如图1-119所示,打开这个工具以后会自动弹出一个New Comparison对话框,然后继续进行下一步操作。

Step 2,选择First file和Second file(所选文件如图1-120所示),然后点击OK按钮。


再将两个文件分别选择完毕并点击OK以后,会进入图1-121所示的界面。


如图1-121中所示,点击OK按钮后立即弹出了一个Statistics对话框,接下来就要进入下一步了。

Step 3,分析统计数字以及查看两个被比较的对象库之间的差异。

首先,需要分析统计出来的数据,Statistics对话框里所列的数据是相当直观的,如图1-122所示。

通过这些统计数据可以让我们能更快捷有效地查看对象库之间的差异,图 1-123 显示的就是本实例中出现的两个对象库文件之间的差异。


如图1-123所示,图形化的差异标识显得非常地清晰和直观,并且情况完全和统计对话框中的数据吻合。由此可见,Object Repository Comparison Tool的确是一个非常实用的辅助工具。


在自动化测试项目中,对象库管理人员在做对象库维护时,如果能善加利用这些小工具就一定能事半功倍,当然这只是第一
步,目前只是停留在一个分析与确定的阶段,还需要一个步骤,完成对象库的维护工作才算最终完成。这个后续的步骤是什么?那就是对象库合并。读者又要问了,如何才能把不同对象库中的对象合并到同一个对象库中呢?接下来,作者要推介给读者的就是一个对象库合并工具Object Repository Merge Tool,继续看第二个实例,在这个实例中作者同样会做一个流程的操作。

Object Repository Manager的实例3。

Step 1,依次选择Tools→Object Repository Merge Tool。

打开对象库合并工具,进入后的界面如图1-124所示。


同样,打开这个合并工具后也会自动弹出一个对话框,只不过它换了个名字叫New Merge而已,然后继续进行下一步操作。

Step 2,选择Primary file和Secondary File,然后点击OK按钮,如图1-125所示。


如图1-125所示,我们仍然使用之前的两个对象库文件来完成本次实例,再将两个文件分别选择完毕并点击OK以后会进入图1-126所示的界面。


如图1-126所示,点击OK后同样也是弹出一个Statistics对话框,里面包含了关键数据让我们可以一目了然地去掌握一些信息,然后在整个界面的左侧会显示初步合并后的结果(初步合并是自动且默认的),让我们来看一下(如图1-127所示)。

如图1-127所示,在对象的左侧出现了一些数字而有的对象却没有,这里的“1”代表第一个对象库里的对象,而“2”则代表第二个对象库里的对象,那些没有数字的则说明它们是两个对象库共有的对象(共有的对象是要所有属性完全一致才算)。那么接下来再来看一下整个界面的右侧部分,如图1-128所示。


界面我们已经看到了,图例中也做了相应的说明,需要注意的是,当前两个对象库中的对象没有冲突,所以合并的工作就由系统代劳了,不用再手工去设置,也就是因为这个原因,下面的Previous Conflict和Next Conflict两个按钮灰色。由于没有冲突,所以,到这一步对象库合并工作就算结束了,左侧的初步显示的合并结果也将成为最后的结果,最后只需要记得将Statistics对话框关闭掉,并把“战果”保存下来即可。

以上是没有冲突的一个情况,接下来继续再看如果两个对象库之间存在冲突,我们的Merge工具如何来应对,重复的过程就跳过了,直接来看冲突结果,如图1-129所示。

从图1-129中可以看到,Merge Tool会准确标记出那些需要合并但是又有冲突的对象的位置。那么此时此刻,需要继续做些什么呢?那就是给出一个解决方案,比如在两个冲突的对象间到底保留哪个对象等。先看一张图例,如图1-130所示。


如图1-130所示,Resolution Options区域就是Merge Tool的“杀手锏”,上半部分会告知用户一些所需的信息,而下半部分则提供了3种不同的解决方案(见图1-130)。默认选择最下面的Keep both objects,也就是因为这个选项才会有前面那一张初步合并的结果图,保留了第二个对象库中的“百度一下,你就知道”Browser对象,但又为了使其不冲突,所以自动更名为“百度一下,你就知道_1”。至于其他两种方式就不多做介绍了,意思已经相当明确了,读者可以自行将各种解决方案都体验一把。最后,只需要和前面一样,将“战果”保存下来就行。

到此,整个Object Repository Manager小节就介绍完了,它当之无愧的是对象库的最高“指挥官”。同时,作者再次重申:管理对象库就好比管理你的程序,是一项重点工作,必须有统一的命名规则和标准等。在做项目时,如果能有一个优秀的公共对象库供自动化测试工程师调用,那么工作效率势必会翻倍!

1.5.7 总结
本章节基本上是围绕QTP工具本身的功能在做介绍,同时作者也分享了不少额外补充内容,比如说想要做好自动化测试项目,那么管理好对象库则是非常关键的一个环节等一些思想及实际经验。所以,读者不仅仅可以在本章节中学会如何去使用对象库相关的功能,更重要的是读者可以逐步学会,如何将一些好的思想经验和实际的功能操作去相结合。需要注意的是,本章节中介绍的功能都是对象库中最最重要的那些,所以读者务必要掌握操作技巧并能熟练运用。

知识点巩固和举一反三练习

一、请在本地对象库中任意添加一些对象并将该对象库导出。

要求 1:规范命名添加后的对象,养成好习惯。

要求 2:对象添加完毕后导出至D盘目录下并命名为local.tsr。

二、将“练习一”中已完成的local.tsr对象库转变成可供多人调用的公共对象库。

要求 1:在对象库管理工具中打开local.tsr文件并任意新增一些对象(即维护对象库)。

要求 2:维护完毕后以另存为的方式将维护后的对象库保存至D盘目录下并命名为public.tsr,使其成为一个公共对象库。

要求 3:调用公共对象库。

本文仅用于学习和交流目的,不代表异步社区观点。非商业转载请注明作译者、出处,并保留本文的原始链接。

《精通QTP——自动化测试技术领航》—第1章1.5节QTP精华—对象库(上)之基础攻略篇...相关推荐

  1. 《精通QTP——自动化测试技术领航》—第1章1.3节录制与回放—QTP的开关

    本节书摘来自异步社区<精通QTP--自动化测试技术领航>一书中的第1章1.3节录制与回放-QTP的开关,作者余杰 , 赵旭斌,更多章节内容可以访问云栖社区"异步社区"公 ...

  2. 《精通QTP——自动化测试技术领航》—第1章1.2节帮助文档(HELP)-QTP的说明书...

    本节书摘来自异步社区<精通QTP--自动化测试技术领航>一书中的第1章1.2节帮助文档(HELP)-QTP的说明书,作者余杰 , 赵旭斌,更多章节内容可以访问云栖社区"异步社区& ...

  3. 《精通QTP——自动化测试技术领航》—第1章1.6节对象库(下)之进阶编程篇

    本节书摘来自异步社区<精通QTP--自动化测试技术领航>一书中的第1章1.6节对象库(下)之进阶编程篇,作者余杰 , 赵旭斌,更多章节内容可以访问云栖社区"异步社区"公 ...

  4. 软件测试技术qtp,51Testing独家连载:(四十一)精通QTP——自动化测试技术领航

    操控方式2: '获取DOM对象 setoDocument = Browser("Browser").Page("Page").Object '使用GetElem ...

  5. 51Testing独家连载:(七)精通QTP——自动化测试技术领航

    1.3 录制与回放-QTP的开关 阶段要点 录制在实际项目应用中的价值观(极低). 新手切记不可在项目应用时被禁锢在录制中. 录制及其相关功能的重点知识点提炼. 录制功能"旁门左道" ...

  6. QTP自动化测试技术——经典面试题

    文章目录 1) QTP 支持那些环境? 2) QTP 的对象库类型是什么? 3) 可以在其他测试中用脚本语言调用 QTP 测试吗?假设有四个测试,我想在一个主脚本中调用这些测试,这种 QTP 中可能吗 ...

  7. 《Selenium自动化测试指南》—第1章1.1节自动化测试基础

    本节书摘来自异步社区<Selenium自动化测试指南>一书中的第1章1.1节自动化测试基础,作者赵卓,更多章节内容可以访问云栖社区"异步社区"公众号查看. 1.1 自动 ...

  8. 字节程序媛:大厂技术岗求职流程解读经验分享,这是一份保姆级校招攻略

    文章目录 写在前面 流程解读 简历投递 笔试(仅校招) 面试 发Offer 写在最后 写在前面 阳春三月,春暖花开.更重要的是- 一年一度的春招季他来啦!作为校招的两大关键节点之一,春招是应届生去争取 ...

  9. 细胞分裂2java版第4关怎么过_奇迹暖暖第二卷第二章第4关怎么过_ 奇迹暖暖II-2-4通关攻略_游戏吧...

    奇迹暖暖游戏中有很多玩家都想知道第二卷第二章第4关怎么过,下面游戏吧小编为大家奇迹暖暖II-2-4通关攻略,感谢大家的阅读,更多精彩内容请关注游戏吧! 属性:华丽.可爱.活泼.清纯.清凉: 技能推荐: ...

最新文章

  1. oracle exists语句
  2. Kafka 2.8.0发布,与ZooKeeper正式分手!
  3. php笔记之echo/print比较
  4. 计算机应用基础0006 19秋在线作业2,川大《计算机应用基础0006》13春在线作业2
  5. kubeadm部署k8s_用 kubeadm 部署生产级 k8s 集群
  6. 基础算法 —— 高精度计算 —— Java 大数类
  7. GitHub 被爆开始实名制,以便于执行美国贸易制裁
  8. 如何使用MOQ进行单元测试
  9. c语言串口接收的字符转int,从串口发送和接收int值
  10. 【DL小结2】CNN前向、反向传播及常用结构
  11. 嵌入式系统开发必读经典书目
  12. CSS:设置边框和背景
  13. 【深度学习】吴恩达深度学习-Course1神经网络与深度学习-第四周深度神经网络的关键概念编程(下)——深度神经网络用于图像分类:应用
  14. LoRA转4G及网关中继器工作原理
  15. 一文集齐几大硬核Linux技术公众号,不是精品不推荐
  16. 考据党伤不起 - 东京首都大学发表《新世纪福音战士: Q》解说
  17. 计算机是怎样运行的:从根儿上理解计算机
  18. 教你设计一个接收机和发射机FDD系统
  19. CPU卡/CPU的分类/CPU卡标准/CPU卡生产流程
  20. 盐城北大青鸟“北大青鸟杯”IT精英挑战赛设中心评审隆重开赛

热门文章

  1. u 20ubuntu 安装 postfix_2020阜阳PVC-U农村自来水管厂家
  2. Exoplayer+Exomedia打造自定义视频播放器(一)
  3. ppt制作01(office PowerPoint)
  4. win10 休眠设置无效_win10无法进入睡眠模式,是为什么?
  5. element ui 图片加载失败_2.ElementUI之图片懒加载无法显示的问题,求教。
  6. html清除文本框储存记录值,如何清除edge浏览器中已保存的表单数据
  7. jquery 根据class名 赋值_jquery 赋值 创建元素 添加class属于 html内容
  8. 概率统计·概率论的基本概念【条件概率】
  9. 如何实现带动画的动态面包屑,来看看?
  10. Ubuntu 20.04 VNC server 搭建及客户端访问