qtp运行时找不到对象

上一篇 / 下一篇  2011-11-14 13:36:58

关于QTP 9.2对象库管理的一些总结 QTP 9.2增强了对于对象库的编辑功能,改进了8.2版本中饱受用户诟病的,对于对象库编辑功能不够强大的缺点。
比如
1)在新增“Object Repository Manager”中整合了原8.2版本中以插件形式提供的merge功能,方便用户更加便捷的管理好对象库
2)新增“导入导出成XML”功能,方便用户编辑。当然HP为了商业利益的考虑,并没有完全把对象库完全以XML 形式展现给用户,而仍然对其封装,限制了灵活性。 
3)新增“associate Repository ”,提供给用户对象映射的,全新的对象库管理概念关于对象库,QTP分为共享对象库和本地对象库共享对象库是可以以TSR后缀名结尾,多个action可以用一个共享对象库。在复杂的业务系统的测试框架中,推荐用TSR管理对象,因为业务复杂,如果不很好的管理好对象库,会造成对象库冗余,后期维护复杂,打开action速度慢等缺点。而本地对象库是和action相关联,主要文件ObjectRepository.bdb,Resource.mtr。这些文件在每新建一个action时自动生成“运行错误-不能识别对象”的处理方法(QTP) 
1. 运行错误:不能识别对象(Cannot identify object)出现了这个错误时,就表示当前被测程序的窗口中没有符合条件的对象。出现这种错误,可能的原因有以下两种:1、对象此时在程序中没有显示或不存在。2、在程序中存在该对象,但是它的描述在后来发生了改变,导致与对象仓库中存储的信息不匹配,从而QTP无法识别对象。如果你正遇到“Cannot identify object”的问题,解决方法见1.1。 
1.1 如何去识别对象描述(Idenfirying Test Object Descrīption Problems)如果你能在被测程序中看到对象,但仍出现了“Cannot Identify Object”错误信息,这就表示仓库中对象的描述与程序中对象的描述一定存在着差异。解决对象描述问题的第一步是找到差异,最简单的方法是将仓库中对象的属性值与程序中对象的属性值进行比较。(仓库中对象的属性值可在Object Repository窗口中查看,程序中对象的属性值可用Object Spy功能查看。)比较仓库中对象的属性值与程序中对象的属性值的操作见1.3。 在完成比较后,是否发现存在差异?如果是,请参考1.4;如果否,请参考1.5。 
1.2 处理对象丢失问题(Solving Missing Object Problems)在运行脚本时,QTP偿试进行某种操作,而该操作的对象在程序中却没有出现,出现这种情况的原因有以下几种:1、对象不再存在。对象已经被从程序中删除。解决方法:见1.2.1。2、对象还没有装载。解决方法:见1.2.2。3、当前的程序页面(或窗口)不正确,不是对象所在的页面(或窗口)。解决方法:见1.2.3。4、前一个步骤没有正确执行。解决方法:见1.2.3。 
1.2.1 解决对象不再存在的问题如果对象已经不再在被测程序中存在,则应在脚本中修改或删除相关步骤。 
1.2.2 解决对象装载超时的问题如果对象丢失的原因是因为没有足够的时间装载,偿试以下解决方案: a.对于Web对象,增加Browser Navigation Timeout(File>Setting>Web页签)时间。 b.在包括该对象的步骤前使用Wait语句,让QTP在执行该步骤之前等待一段时间。 
1.2.3 检查前面步骤的执行情况如果是因为打开了错误的页面(或窗口)导致对象丢失问题,或因为前一步骤执行措误导致对象丢失问题,则请按以下方法检查原因: a. 如果怀疑在完成脚本后,被测程序又发生了改变,则检查对象的继承关系以及对象描述。参考1.1。 b. 如果怀疑脚本错误,则检查脚本的每一个步骤。你可能是遗失了某个步骤,也可能是使用了不正确的方法或参数。 
1.3 测试对象的属性值与Run-time对象的属性值的比较(Comparing Test Object and Run-Time Object Property Values)根据以下的步骤比较测试对象与Run-time对象的属性值: 1) 进入Obecjt Repository窗口(Resources>Object Repository),选择对象。 2) 用笔记下对象的class以及它的各个属性及属性值。 3) 打开被测程序,并打开包含被测对象的页面或窗口。 4) 在QTP中选择菜单Tools>Object Spy或点击Object Spy按钮,打开Object Spy对话框。 5) 选择“Test Object Properties”选项。 6) 点击右上角的按钮(带有手图标的),这时QTP窗口以及Object Spy对话框都被最小化。 7) 在程序页面(或窗口)中点击目标对象,恢复Object Spy对话框,并在对话框中显示对象及其父对象(以树的形式显示),并在Properties页签中显示当前对象的属性及属性值。 8) 这时Object Spy对话框的Properties页签中显示Run-time对象的所有属性,在此查看对象的class,以及它的属性及属性值,并将它与第2步中记下的内容进行比较。 
1.4 解决对象描述存在的问题(Solving Object Descrīption Problems)如果发现仓库中对象的属性值与程序中对象的属性值存在不同,你应该判断这个不同是个别对象的问题,还是其它同类对象也存在相同的问题。是所有(或多个)同类对象都存在问题吗?如果是,则参考1.6 如果否,则参考1.7 
1.5 关于父对象描述的识别问题(Identifying Parent Object Descrīption Problems)对象的识别还与它所继承的父对象有关。如果你能在被测程序中看到对象,而且程序中对象的属性值与仓库中对象的属性值也是一致的,但仍然遭遇到了“Cannot identify object”错误,则这个错误可能与它的父对象有关(如仓库中父对象的属性值与程序中父对象的属性值不一致),也可能是仓库中的对象与程序中对象的继承关系不相同导致的。要判断是继承关系中的哪个父对象出现了问题,请偿试下面的方法之一:1、重新录制对象,比较新旧对象的父对象。欲了解如何完成比较,参考1.8。2、对继承关系中的每个父对象,分别插入一个Exist语句,并运行该部分脚本。欲了解如果创建Exist语句,参考1.9。注:你也可以使用Object Repository窗口中的Highlight in Application功能,在被测程序中定位对象。 一旦找到了存在问题的父对象,接下来偿试以下方法:1、修复存在问题的父对象的描述。方法见1.4。2、在专家视图的模式下,查找所有继承存在问题的实例并进行修正。举例:1.8.1。 
1.6 解决某类对象的识别问题(Soving Object Identification Problems for a Test Object Class)如果你发现某类对象的对象描述对于被测程序来说都不是很合理,或你预期到对象描述中的某属性值是经常变化的,你可以在Object Identification对话框中改变该类的识别属性的设置,或定义该类的Smart Identification设置并启用Smart Identification机制,这样QTP就可以唯一识别对象了。 
1.7 解决单个对象的描述问题(Solving Individual Test Object Descrīption Problems)选择下列方法之一来解决对象的描述问题:1、如果被测程序中对象描述发生了改变,并且你也清楚改变的内容,并且该改变是永久性或长期性的,你可以直接手工修改仓库中对象描述中的相关属性值。2、如果被测程序中的对象的属性值依赖于前面的步骤或其它对象,则将该属性值参数化,这样就可以使用其它步骤的输出值为属性值。3、如果属性值的组成部分中,部分是固定的,部分是动态改变的,则可以将属性值设计为正则表达式。4、如果属性值是遵循某种规则变化的,或者是不可预期的,则从对象描述中移除该属性,并向对象描述中添加一个或多个属性以便于QTP进行对象识别。5、If you can only access the information on the property values during the run session, you can create and use functions that use programmatic descrīptions to identify the object using property values retrieved earlier in the run session. 6、如果在录制过程中对象是唯一的,但现在程序中出现了两个或多个描述相同的对象,但是它们在页面(或窗口)中的位置不相同,则应在Object Properties或Object Repository窗口中,向对象描述中添加一个ordinal identifier(index或location)。 
1.8 重新录制对象,以判断父对象描述是否存在问题(Re-recording an Object to Identify Parent Object Descrīption Problems)根据下面的指引,来判断父对象的问题。通过重新录制对象,来判断它的父对象是否存在问题: 1) 打开浏览器或程序,来到包含被测对象的页面或窗口。 2) 在关键字视图模式,选择最后一个组件(component),或在专家视图模式,将光标放在最后一个脚本步骤的下面。 3) 点击Record按钮,或选择Automation>Record。 4) 点击(或操作)页面或窗口中的目标对象。 5) 点击Stop按钮,或选择Automation>Stop,完成步骤添加。 6) 右击新添加的步骤,并选择Object Properties右键菜单。 7) 在Object Properties对话框中,点击Repository,打开Object Repository窗口,并选中了新对象。注意记下该对象的继承关系。 8) 在Object Repository窗口中找到旧的对象(即存在问题的对象),将它的继承关系与新对象的继承关系进行比较。通过比较,可以检查到新旧对象是父对象的描述存在不同,还是它们的继承关系根本就不同。 a. 如果是父对象的描述问题,则修改父对象的描述。参见1.4. b. 如果是对象的继承关系不正确(即具有不同的父对象)引起的问题,则在脚本中找到所有使用该继承关系的实例,将它们替换为正确的继承关系。举例:参见1.8.1。 
1.8.1 举例假设有一个带有Frame的网站,你录制了一个操作针对Image对象“Poster”的操作步骤。在Object Repository窗口,你可以Image对象的继承关系如下所示: MyCompany(Browser) MyCompany(Page) Main(Frame) Poster(image) 当你运行脚本时,网页看起来没有什么不同,但是识别Image对象时却出现了“Cannot identiry object”的错误提示。当你重新录制操作步骤,然后在Object Repository窗口中查看新的Image对象时,发现该对象的继承关系如下所示: MyCompany(Browser) MyCompany(Page) Poster(image) 从中可以看出,Frame已经从Web Page中移除,所以尽管Image对象“Poster”的描述没有发生任何改变,但它的继承关系已经改变了。在Object Repository窗口,你可以看到新旧Image对象“Poster”是两个完全不同的对象:旧的位于已经被移除的Frame对象之下,而新的则直接位于Page“Mycompany”对象之下。修复这个问题,可以在脚本步骤中将旧的对象替换为新的对象。为了保持Object Repository窗口的整洁,你应删除那些已不再存在的对象(如本例中的Frame)。 
1.9 创建Exist语句,以判断父对象的描述是否存在问题 QTP在录制发生在某个对象上的操作时,也会同时去了解对象以及它的继承关系。因此,如果在运行过程中,QTP不能识别继承关系中的任何一个父对象,都会导致目标对象的识别失败。使用带有Exist方法的Msgbox语句,可以方便的检查出是继承关系中的哪个父对象出现了问题。假设在运行下面脚本时,你遇到了“Cannot identify Object”错误信息(但是可以确定对象仓库中Link对象的描述与当前程序中对象的描述是完全一致的): Browser("Yahoo!").Page("Yahoo!").Link("Arts & Humanities").Click 你可以在该语句前面插入以下语句: Msgbox Browser("Yahoo!").Exist Msgbox Browser("Yahoo!").Page("Yahoo!").Exist Msgbox Browser("Yahoo!").Page("Yahoo!").Link("Arts & Humanities").Exist 然后你从头开始运行脚本,发现第1行语句运行成功,并且弹出信息框,内容为“True”。但是,当QTP运行到第2步时,就弹出信息框,内容为“False”,表示不能找到Page object。这就证明Page对象存在问题。确定了出现问题的父对象以后,修复该问题。参见1.4。 

GetROProperty,GetTOProperties,GetTOProperty的区别:
GetTOProperty和GetROProperty都用于取出对象的某个具体属性的值,它们的语法和用法几近相同,唯一的区别就是GetTOProperty取出的是录制对象的属性值,而GetROProperty取出的是在回放过程中运行的对象的属性值. GetTOProperties,是指取出录制对象的所有属性。 
GetTOProperty和GetROProperty语法都是: object.GetTOProperty(Property) 或者是: object.GetROProperty(Property) 其中Property,对象的属性,是必填项. 关键在于RO和TO,R,就是Runtime,T就是Testtime,O就是Object。因此顾名思义,RO就是在测试执行时的对象,TO就是录制/编写测试时的对象。是同一个类在不同的时间生成的不同的实例,一般来说TO是静态的,而RO是动态的(每次执行测试都会生成新的实例)。 
遇到ActiveX无法创建scrīpting.FileSystemObject的问题,我是如何解决的关于QTP中“General Error while saving the test"的解决方法 (转) 今天在使用QuickTest录制教本的时候 ,无法保存所录制的脚本,于是到网上搜索了一下解决办法,别说还挺灵,贴出来,共享! 先将段代码保存为VBS文件,然后运行. 
Dim fso, MyFile Set fso = CreateObject("scrīpting.FileSystemObject") Set MyFile = fso.CreateTextFile("C:\testfile.txt", True) MyFile.WriteLine ("This is a test") MyFile.WriteLine ("This is another test") MyFile.Close 运行提示有错误: ActiveX 部件不能创建对象: 'scrīpting.filesystemobject' 这是操作系统的问题, 是activex有问题!
QTP 是集成这个进行文件保存的去System32目录下查看是否有个scrrun.dll的文件,如果有,就regsvr32 scrrun.dll一下,没有的话,考一个过来 ActiveX 部件不能创建对象: Scripting.FileSystemObject 错误描述:服务器没有启动FSO支持解决方法:开启/关闭系统FSO支持方法 win2000系统:在CMD命令行状态输入以下命令: 关闭命令:RegSvr32 /u C:\WINNT\SYSTEM32\scrrun.dll 打开命令:RegSvr32 C:\WINNT\SYSTEM32\scrrun.dll win2003 运行regsvr32 scrrun.dll即可。 如果想关闭FSO组件,请运行 regsvr32 /u scrrun.dll即可。 
初识Regsvr32 想必Regsvr32大家一定都不陌生吧,在一些电脑教程或电脑杂志上总能看到它的身影,可如此一个高出镜率的"小明星"在我们很多人的眼里却显得十分的神秘,原来一般的文章都很少对它进行介绍,最多只是了了几句介绍一下如何用它解决常见问题,好多朋友可能都已经在一些文章的指导下使用过好多次Regsvr32了,但对它的“身世”却依然不了解,今天笔者就借这篇文章打消大家脑海里的疑团,带大家一起去认识一下这个Regsvr32。 Regsvr32的背景与功能  Regsvr32是一个Windows系统的内嵌程序,不仅存在于windows 2000 / XP下,同时也能在Windows 98中找到它的身影。它的主要功能就是注册或卸载动态链接库文件(DLL)和嵌入式控件(OCX),您可别小看了它呀,有了它,很多软件或操作系统的难题就都可以迎刃而解了。 

基础篇  刚才咱们说到了DLL和OCX,估计在好多的读者心里都会冒出这样一个问题,这两个东东究竟是什么意思?它们究竟能干什么呢?别急,下面就听笔者慢慢道来。   DLL文件:DLL文件全称是Dynamic Link Library,中文名字叫做“动态链接库文件”。在Windows系统中,DLL文件就象EXE文件一样能够完成某项功能,但它却无法像EXE 文件那样独立运行,必须由其他程序来调用它,而它对于程序的执行也是非常重要的,大多数的程序或系统组件在执行时,都必须链接到DLL文件才能正常运行。换言之,DLL文件就像是数据库中一个个公用的函数库,每位设计人员都可以在自己的程序中随意调用它们,这样,不仅不用自己再去编写一些基础功能(因为这些功能都已经由DLL文件完成了),而且还可以让程序的体积更加小巧。因此,如果某个DLL文件发生丢失,就有可能造成某个软件或某个系统模块发生故障而无法正常工作。   OCX文件:OCX文件的全称是Object Linking and Embedding (OLE) Control Extension,中文名字叫做“嵌入式对象控件”,它的作用其实和刚才谈到的DLL文件特别相像,其实所谓的OLE我们平时已经非常熟悉了,简单地说就像在Word中可以使用Excel数据,写字板中可以嵌入图片文件等等这些功能。打个比方的话,剪贴板就像是个简单的数据共享,而OLE则是一种“对象共享”。 刚才我们谈到Regsvr32的功能是注册与卸载DLL文件的,那么现在又有一个问题困扰着我们,既然DLL文件起到的就是公用函数库的作用,为什么我们不能直接在程序里调用,还要进行一次注册呢?其实,这里注册DLL文件的道理就像是我们第一次入学,虽然你坐在教室里,但是如果没有写你的档案,老师是不会认识你的,自然也就不会找到你。同样道理,如果DLL文件没有注册,系统注册表中就没有这个DLL文件的相关信息,虽然它已经存在于我们的硬盘上,但等到调用的时候,系统也就根本找不到这个DLL文件而只能报告没有这个DLL存在了,所以在这个时候就需要我们注册DLL文件了。 

【小提示】 Windows系统的DLL因为在安装时已经注册好了,因此不用注册,但是如果因为某种情况系统无法识别这些DLL文件时,还是需要我们手动再注册一遍。 Regsvr32命令格式  说完了上面这些,想必好多朋友都听得有点懵了,别急,知道了上面这些知识,下面咱们再学习Regsvr32命令就容易多了。   大家知道,凡是命令肯定都有一个格式,Regsvr32也不例外。我们以Windows XP为例,在“开始”菜单→“运行”栏中执行“CMD”命令,打开命令提示行窗口,输入Regsvr32命令后回车,就会看到Regsvr32的命令格式“Regsvr32 [ /u ][ /s ][ /n ][ /i [ :cmdline ] ] dll文件名”,如图1所示。 图1   

由上可知,Regsvr32命令一共有四个参数,分别是:   
/s:注册或卸载成功后不显示操作成功的提示框   
/u:卸载已安装的控件或DLL文件 
/n:不调用DLLRegisterServer,要注意这个参数应与/i一同使用   
/i:调用DLLInstall,并给其传递一个可选的[ cmdline ];
当使用/u时用来卸载DLL   

命令的讲解往往都枯燥难懂,下面咱们就借助一个实例来进一步了解Regsvr32的命令格式。比如我们想注册一个保存在C:\Folder目录中的shmedia.dll动态链接库文件,那么执行的命令就应该是“Regsvr32 c:\folder\shmedia.dll”,而如果注册过后打算卸载时就更简单了,
执行命令“Regsvr32 /u c:\folder\shmedia.dll”就行了。
如图2所示就是正常完成任务的提示窗口 使用Regsvr32命令久后,大家也许会经常看到各种各样的错误提示,这里笔者就找了一些比较有代表性的错误,帮大家来分析分析。   
错误一:未指定DLL文件的具体路径,如图2所示 图3   这种错误比较常见,一般出现在注册非系统DLL文件时,原因就是Regsvr32程序在默认路径找不到指定的DLL文件,无法正常完成注册。解决的办法也很简单,只要在命令中指定好DLL文件的具体存储路径就行了,比如“Regsvr32 c:\folder\abc.dll”就是一个正常的命令。  

错误二:要注册的文件类型错误,如图3所示 图4   这种错误比较少,但容易在新手上出现,原因就是用户欲注册的文件根本就不是一个正常的DLL文件或OCX文件,Regsvr32根本无法完成注册。解决的方法就是指定一个正常的DLL文件或OCX文件就行了。比如原命令为“Regsvr32 c:\abc\abc.txt”,而正确的命令就应该是“Regsvr32 c:\abc\abc.dll”(当然,也得保证这个abc.dll文件已存在并完全正确)   

错误三:键入的命令中未写明DLL文件名,如图4所示 图5   这种错误和上例一样也是主要出现在新手上,它的原因就是根本没有指定DLL文件名,这样Regsvr32自然也就无法得知要对什么进行操作了,所以才会弹出这个提示来。解决的办法就是指定要操作的DLL文件或OCX文件即可。 实例演练   说了这么多,大家应该对这个Regsvr32命令的功能很清楚了,下面咱们就以几个常见的实例来结束这篇文章。  

实例一:卸载Windows XP自带的ZIP文件夹显示功能   
大家可能都知道在Windows XP中默认可以显示ZIP文件夹(压缩文件夹),但问题是大多数的朋友却一直在使用第三方解压缩软件WinRAR或WinZip,这样XP默认的那个ZIP文件夹显示功能就成了摆设,白白的浪费了大量的系统资源。其实,我们就可以利用刚刚学到的Regsvr32命令来卸载它。进入命令提示符窗口,执行命令:Regsvr32 /u zipfldr.dll 即可。当然如果卸载后还想再启用(估计很少有朋友会这么做),只要再执行一遍Regsvr32 zipfldr.dll命令就行了。   

实例二:卸载Windows图片预览功能   
图片预览功能和上面所说的ZIP文件显示功能如出一辙,在强大的第三方图片软件的威胁下,Windows自带的图片预览功能基本上就和鸡肋一般,没有任何优势可言。我们自然也就可以“卸它没商量”。   进入命令提示符窗口,执行命令:Regsvr32 /u shimgvw.dll即可。当然再次启用的方法和前面一样,也是Regsvr32 shimgvw.dll。   

实例三:修复损坏的IE浏览器   
好多朋友都有过这样的遭遇,IE链接点击无效,无法正常打开新窗口,按照以前的作法,基本上重装一遍IE肯定能解决问题,但这种方法既费时间也费精力,倒不如直接用Regsvr32命令来试试呢。   
进入命令提示符窗口,执行命令:Regsvr32 actxprxy.dll,待正常报告窗口弹出后,再次执行命令:regsvr32 shdocvw.dll,再等待正常报告弹出后,继续执行命令:Regsvr32 Oleaut32.dll,等最后这次正常报告弹出后,您就可以重新打开IE试试了,怎么样?保准让你喜出望外。
   
实例四:卸载XP的影像预览功能也很简单   
同上面所说的图片预览功能一样,XP的影像预览功能(即视频文件预览功能)也可以让我们自由地注册与卸载。   进入命令提示符窗口,执行命令:Regsvr32 /u shmedia.dll即可成功地卸载XP默认的影像预览功能,当然去掉/U参数,即Regsvr32 shmedia.dll命令又可以将影像预览功能重新注册上。   【小提示】 以上几个实例均是将这些系统功能反注册,以使系统无法使用到这些功能,并没有删除掉任何系统文件,因此我们也就可以轻松地重新注册这些功能,整个过程都是可逆的,请大家放心试用   写在最后   至此,Regsvr32就给大家介绍完了,不知道对大家有没有帮助。其实,Regsvr32的用处岂止上面几个实例,它还能修复损坏的Windows自动更新,修复损坏的“我的文档”,还可以让Windows Media播放器支持RM这样的文件格式。限于篇幅有限,在此就不一一介绍了,有兴趣的朋友也可以参考相关的其他文章,当然要是有了更好的方法,也要记着和大家一起切磋啊。 posted @ 2008-01-03 14:03 beagles 阅读(774) | 评论(0) | 编辑 2007年12月6日 QTP中使用描述性编程我们简单介绍一下有关功能测试的基本方法,这实际上对于所有自动化功能测试产品来说都是一样的。一般情况下,用QTP来进行功能测试的基本方法主要包括三个主要阶段: 1、创建测试或组建首先可以通过在应用程序或网站上录制会话,或者建立对象库并使用关键字驱动功能向关键字视图中手动添加步骤来创建测试或组件。在QTP里面我们可以通过两种方式添加步骤来创建测试或组件:在应用程序或网站上录制会话。 建立对象库并使用这些对象在关键字视图或专家视图中手动添加步骤然后在在测试或组件中插入检查点,检查页面、对象或文本字符串中的特定值或特征,通过它可以标识网站或应用程序是否正常运行。或是通过用参数替换固定值扩展测试或组件的范围。提供数据表中的数据,定义环境变量和值,定义测试、组件或操作参数和值,或者使用QTP生成随机数字或当前用户和测试数据等。最后如果需要的话使用QTP中众多的功能测试功能来增强测试或组件或添加编写语句来实现更复杂的测试目标。 2、运行测试和组建控制运行会话,帮助标识和消除测试或组件中的缺陷。使用“单步执行”、“单步跳过”和“单步退出”命令逐步运行测试或组件,或设置断点使测试或组件在预定点暂停。每当测试或组件在断点处停止时,可以在“调试查看器”中查看其变量的值。 3、分析结果在运行测试或组件之后,通过两种方式可以查看其结果:在“结果”窗口中查看结果;自动报告在运行会话过程中检测到的缺陷,可能的话并上报到其他缺陷管理产品中。.试图与对象模型在介绍QTP中的Descriptive Programming前,我们有必要先介绍一下ExpertView及在ExpertView里进行编码的一些基本知识。在QTP里面提供了两种视图,第一种我们把它称为KeywordView(关键字视图,在早期的版本中称为TreeView),第二种把它成为ExpertView(专家视图),这两种视图分别是针对两种类型的人进行使用的。 1、KeywordView(关键字视图)通过关键字视图,QTP提供了一种模块化的表格格式创建和查看测试或组件的步骤。每个步骤在关键字视图中都是一行,这样用户可以轻松的修改任何一部分组成。在录制会话过程中,用户在应用程序上执行的每个步骤在关键字视图中记录为一行。例如,在51testing的页面上执行的下列三个步骤:在“用户名”编辑框中输入zhoda02。 在“密码”编辑框中输入加密字符串41c630a213508cd49eb35089db1b893144b9。 单击“登录”按钮。那么,关键字视图将包含下列行: 很显然,关键字视图非常直观有效,使用的人可以很清晰的看到被录制对象的录制层次及运行步骤,比较适合那些对于业务操作流程熟悉的人员使用。但是,如果需要一些增强型的操作,那就需要切换到专家视图里进行了。 2.ExpertView(专家视图) QTP在关键字视图中的每个节点在专家视图中对应一行脚本。上面例子对应的脚本如下:(删除后一句是因为前后重复,一句可以说明问题) Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebEdit("username").Set "zhoda02" Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebEdit("password").SetSecure "41c630a213508cd49eb35089db1b893144b9" Browser("51Testing软件测试网:软件测试的专业网站").Page("51Testing软件测试网:软件测试的专业网站").WebButton("登录").Click 对于QTP来说,其核心编码语言是Visual Basic Script,因此,如果用户熟悉VBScript,可以运用自如的添加和更新语句,并通过编程方式增强测试和脚本,而这一切必须在专家视图中完成。更为重要的是,有些操作是必须在专家视图中才可以完成的,例如:要处理动态对象、客户化报告、获取对象运行时的属性值(Run-time Value)等等,这些都必须通过专家视图中的VBScript编码完成。然而,QTP里所有的操作都是基于对象进行的,所以我们必须对对象模型有一个基本了解,才可以在专家视图内进行Descriptive Programming。 3、测试对象模型测试对象模型是一大组对象类型或类,QTP用这些对象类型或类来表示应用程序中的对象。每个测试对象类都有一个可以唯一标识属于该类的对象的属性列表,以及一组QTP可以对其进行录制的方法。它包括测试对象(Test Object)和运行时对象(RunTime Object)。测试对象是QTP在测试或组件中创建的用于表示应用程序中的实际对象的对象。QTP存储有关该对象的信息,这些信息有助于它在运行会话期间标识和检查该对象。运行时对象是网站或应用程序中的实际对象,在运行会话期间执行针对该对象的方法。如果录制时执行应用程序的相应操作,则一般情况下QTP将完成以下操作:标识QTP测试对象类(表示执行了操作的对象),并创建相应的测试对象 读取应用程序中对象属性的当前值,然后将属性和属性值列表与测试对象一起存储。 选择该对象的唯一名称,一般使用该对象某个重要属性的值。 使用适当的QPT 测试对象方法录制对对象执行的操作。例如,假定使用以下HTML 源代码单击“查找”按钮: QTPl将单击的对象标识为WebButton 测试对象。它将创建一个名为Find 的WebButton 对象,然后为该Find WebButton 对象录制下列属性和属性值,同时还会录制对WebButtion的Click方法。 在关键字视图及专家视图中显示内容分别为: Browser("Mercury Interactive").Page("Mercury Interactive").WebButton("Find").Click 运行测试或组件时,QTP通过其测试对象类及其描述(一组用于唯一标识该对象的测试对象属性和属性值)来标识应用程序中的每个对象。测试对象及其属性和属性值的列表存储在对象库中。例如在上例中,QTP将在运行会话期间在对象库中搜索WebButton 对象,通过名称Find 来查找其描述。QTP根据找到的描述,在应用程序中查找WebButton 对象,该对象带有HTML 标记INPUT、类型为submit、值为Find。找到对象后,它将对其执行Click 方法。在这样一组对象模型的基础上,QTP为各类应用对象都提供了一组方法和属性,例如Web Objects,Windows Objects,SAPGUI Objects,ActiveX,Java等。下面是一些Web Objects的方法和示例:对象方法 Browser Check Frame. Click Image Exist Link GetCellData Page GetProperty WebArea GetROProperty WebButtion Mouseover WebCheckBox RowCount WebEdit Select WebList Set WebRadioGroup SetProperty WebTable Submit 例1:获取单元格中的值 thisText = Browser(…).Page(…).Frame.(…).WebTable("sample").GetCellData(2,1) 例2:获取图片的名称 bjectName = Browser(…).Page(…).Image("Find").GetProperty("Name") 例3:检查某个对象是否存在,如果存在弹出对话框说明对象存在。 If Browser("Browser").Page("Page").Applet("login.html").JavaEdit("username").Exist Then MsgBox("The object exists.") End if .描述性编程(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 【小结】以上是对QTP中有关处理动态对象中的Descriptive Programming的简单介绍,希望对大家能够有所帮助,就总体而言,如果能够熟练掌握Descriptive Programming,那么有很多实际中的问题就可以迎刃而解。当然Descriptive Programming只是QTP中的一个功能,QTP在实际功能测试中还有很多强大的功能,作为QTP学习的一个系列有机会我会一一介绍。 posted @ 2007-12-06 15:21 beagles 阅读(1563) | 评论(4) | 编辑 2006年11月7日在QTP中如何管理对象库 摘要: 管理对象库在QTP中,如果不能有效的管理对象,将大大加大后期脚本的维护成本。我们需要的是一个干净整洁的对象库,但由于QTP本身对于对象的管理操作的局限性,我们只有运用有限的方法,来应对无限的可能发生的情况。在录制过程中,QTP将抓取大量的WEB对象(包括Button、Link、text等),有些对象是重复出现的,可以重复利用。但如果不及时清理这些冗余的对象,势必造成对象库臃肿和复杂。下面,我们制定... 阅读全文 posted @ 2006-11-07 11:56 beagles 阅读(735) | 评论(0) | 编辑在QTP中如何运用XML管理参数 摘要: 我们现阶段是运用XML文件,存放页面输入操作数据优点:树型结构,可读性较好;操作简便缺点:如数据庞大,不便维护;以文件形式管理数据,效率太低另外也可以运用EXCLE维护数据优点:操作简便缺点:可读性差;维护效率低或者连接数据库,以数据库形式管理(这点LR支持的比较好,提供了连接功能接口,操作简便,而我用的QTP8.2支持不大好),总的来说,以数据库形式管理参数数据,其优势是其他两种数据管理方式无法... 阅读全文

TAG:

 

评分:0

我来说两句

我的栏目

日历

« 2024-05-02  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 58391
  • 日志数: 34
  • 图片数: 1
  • 建立时间: 2011-09-26
  • 更新时间: 2017-02-28

RSS订阅

Open Toolbar