1.运行错误:不能识别对象(Cannot Identify Object)
在运行测试脚本过程中,常常会遇到不能识别对象(Cannot Identify Object)的问题,出现了这个错误时,就表示当前被测程序的窗口中没有符合条件的对象。出现这种错误,可能的原因有以下两种:
☞在程序中存在该对象,但是它的描述在后来发生了改变,导致与对象对象库中存储的信息不匹配,从而QTP无法识别对象。
☞对象在程序中没有显示或不存在。
1.1对象的属性值发生了改变的问题解决办法
如果在被测程序中看到对象,但仍出现了“Cannot Identify Object”错误信息,这表示对象库中对象的描述与程序中对象的描述一定存在着差异。解决对象描述问题首先找到差异,最简单的方法是将对象库中对象的属性值与程序中对象的属性值进行比较。(对象库中对象的属性值可在Object Repository窗口中查看,程序中对象的属性值可用Object Spy功能查看)。比较对象库中对象的属性值与程序中对象的属性值,操作如下:
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步中记下的内容进行比较。
在完成比较后,如果发现对象库中对象的属性值与程序中对象的属性值不同,应该判断这个不同是个别对象的问题,还是其它同类对象也存在相同的问题。如果发现某类对象的对象描述对于被测程序来说都不是很合理,或预期到对象描述中的某属性值是经常变化的,可以在菜单栏Tools→Object Identification对话框中改变该类的识别属性的设置,或定义该类的Smart Identification设置并启用Smart Identification机制,这样QTP就可以唯一识别对象了。
如果发现是单个对象的描述对于被测试程序来说不合理,则可以选择下列方法之一来解决对象的描述问题:
☞如果被测程序中对象描述发生了改变,并且该改变是永久性或长期性的,可以直接手工修改对象库中对象描述中的相关属性值。
☞如果被测程序中的对象的属性值依赖于前面的步骤或其它对象,则将该属性值参数化,这样就可以使用其它步骤的输出值为属性值。
☞如果属性值的组成部分中,部分是固定的,部分是动态改变的,则可以将属性值设计为正则表达式。
☞如果属性值是遵循某种规则变化的,或者是不可预期的,则从对象描述中移除该属性,并向对象描述中添加一个或多个属性以便于QTP进行对象识别。
☞如果在录制过程中对象是唯一的,但现在程序中出现了两个或多个描述相同的对象,但是它们在页面(或窗口)中的位置不相同,则应在Object Properties或Object Repository窗口中,向对象描述中添加一个ordinal identifier(index或location)。
在完成比较后,如果能在被测程序中看到对象,而且程序中对象的属性值与对象库中对象的属性值也是一致的,但仍然遇到了“Cannot identify object”错误,则这个错误可能与它的父对象有关(如对象库中父对象的属性值与程序中父对象的属性值不一致),也可能是对象库中的对象与程序中对象的继承关系不相同导致的。要判断是继承关系中的哪个父对象出现了问题,应偿试下面的方法之一:
☞重新录制对象,比较新旧对象的父对象。
通过重新录制对象,来判断它的父对象是否存在问题,步骤如下:
1)打开浏览器或程序,来到包含被测对象的页面或窗口。
2)在关键字视图模式,选择最后一个组件(component),或在专家视图模式,将光标放在最后一个脚本步骤的下面。
3)点击Record按钮,或选择Automation→Record。
4)点击(或操作)页面或窗口中的目标对象。
5)点击Stop按钮,或选择Automation→Stop,完成步骤添加。
6)右击新添加的步骤,选中新对象并选择Object Properties右键菜单。
7)在Object Properties对话框中,点击View in Repository,打开Object Repository窗口,并选择。注意记下该对象的继承关系。
8)在Object Repository窗口中找到旧的对象(即存在问题的对象),将它的继承关系与新对象的继承关系进行比较。
通过比较,可以检查到新旧对象是父对象的描述存在不同,还是它们的继承关系根本就不同。
a.如果是父对象的描述问题,则修改父对象的描述。
b.如果是对象的继承关系不正确(即具有不同的父对象)引起的问题,则在脚本中找到所有使用该继承关系的实例,将它们替换为正确的继承关系。
例如link对象“管理”的Click操作:Browser("登录").Page("目标绩效过程化管理软件_2").Frame("leftfrm").Link("管理").Click
其对象的继承关系应该是
Browser("登录")
Page("目标绩效过程化管理软件_2")
Frame("leftfrm")
Link("管理")
当运行脚本时,网页看起来没有什么不同,但是识别link对象时却出现了“Cannot identiry object”的错误提示。当重新录制操作步骤,然后在Object Repository窗口中查看新的link对象时,发现该对象的继承关系如下所示:
Browser("登录")
Page("目标绩效过程化管理软件_2")
Link("管理")
从中可以看出,Frame.已经从Page中移除,所以尽管link对象“Click”的描述没有发生任何改变,但它的继承关系已经改变了。在Object Repository窗口,可以看到新旧link对象“Click”是两个完全不同的对象:旧的位于已经被移除的Frame.对象之下,而新的则直接位于Page("目标绩效过程化管理软件_2")对象之下。
修复这个问题,可以在脚本步骤中将旧的对象替换为新的对象。为了保持Object Repository窗口的整洁,应删除那些已不再存在的对象(如本例中的Frame)。
☞对继承关系中的每个父对象,分别插入一个Exist语句,并运行该部分脚本。
使用带有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行语句运行,当QTP运行到第2步时,就弹出信息框,内容为“False”,表示不能找到Page object。这就证明Page对象存在问题。确定了出现问题的父对象以后,修复该问题。
注:也可以使用Object Repository窗口中的Highlight in Application功能,在被测程序中定位对象。
一旦找到了存在问题的父对象,接下来偿试以下方法:
☞修复存在问题的父对象的描述。
☞在专家视图的模式下,查找所有继承存在问题的实例并进行修正。
1.2对象在程序中不显示或丢失的解决方法
在运行脚本时,QTP偿试进行某种操作,而该操作的对象在程序中却没有出现,出现这种情况的原因有以下几种:
☞对象不再存在。对象已经被从程序中删除。
如果对象已经不再在被测程序中存在,则应在脚本中修改或删除相关步骤。
☞对象还没有装载。
如果对象丢失的原因是因为没有足够的时间装载,偿试以下解决方案:
a.对于Web对象,增加Browser Navigation Timeout(File→Setting→Web页签)时间。
b.在包括该对象的步骤前使用Wait语句,让QTP在执行该步骤之前等待一段时间。
☞当前的程序页面(或窗口)不正确,不是对象所在的页面(或窗口),或前一个步骤没有正确运行。
如果是因为打开了错误的页面(或窗口)导致对象丢失问题,或因为前一步骤执行措误导致对象丢失问题,则请按以下方法检查原因:
a.如果怀疑在完成脚本后,被测程序又发生了改变,则检查对象的继承关系以及对象描述。
b.如果怀疑脚本错误,则检查脚本的每一个步骤。可能是遗失了某个步骤,也可能是使用了不正确的方法或参数。