3.3.3捕捉动态信息用户名和密码参数异常时,如何捕捉动态信息呢?在参数化的过程中,要尽可能全面地测试登录功能的正常和异常情况,在上面的参数化测试数据中,准备的两个测试数据都是正常情况:只要username大于或等于4个字符,密码是“mercury”,即可登录成功。为测试异常登录,准备了异常登录的测试数据,系统会弹出如表3.4所示的提示信息。表3.4用户名和密码异常时,系统的提示测试数据应用程序弹出的异常提示usernamepasswordwrongmercurytyqtyqmercurytyqwrongtianyanqintianyanqinwrongtianyanqinmercury正常登录,启动应用程序针对如上的几种测试数据,当然可以针对每个异常的测试数据进行录制,每类测试数据都要录制一遍脚本,该工作量很大,而且工作非常乏味。为了解决上述问题,可以让QTP针对不同的异常测试数据,自动捕捉这些错误提示信息。如何自动捕捉错误提示信息呢?首先,需要识别出提示框内的所有对象,将识别的对象添加到对象仓库中,其次,需要编写捕捉异常的脚本代码,将错误的信息报告给测试结果。3.3.3.1添加待识别的对象到对象仓库中要添加待识别的对象到对象仓库中,操作如下:1.手动打开如图3.6所示的应用程序,用户名输入“tyq”,密码不输入任何字符。2.在“Login”对话框中单击“OK”按钮,弹出一个错误提示对话框,如图3.37所示。图3.37用户名为“tyq”、密码为空的报错提示3.在QTP主界面中,单击“ObjectRepository”按钮,或者按下“Ctrl+R”组合键,打开识别对象的窗口,如图3.38所示。图3.38识别对象窗口4.在“ObjectRepository”窗口中,单击“AddObjectstoLocal”按钮,选择如图2.37所示的飞机订票系统的错误提示对话框。为了让QTP方便地识别出待捕捉的对象,在单击“AddObjectstoLocal”按钮前,首先需要按住“Ctrl”键,直到鼠标已经定位到待捕捉的对象时,放开“Ctrl”键,这样对象更容易被正确地捕捉。5.在“ObjectSelection”对话框中,单击“OK”按钮,如图3.39所示。图3.39“ObjectSelection”对话框6.在弹出的“DefineObjectFilter”对话框中,选中“Allobjecttypes”单选项(含义就是将该提示对话框的所有对象都识别出来),单击“OK”按钮,如图3.40所示。图3.40“DefineObjectFilter”对话框这样,对象就添加到了对象仓库中了。注意,在“DefineObjectFilter”对话框中,可以选中的单选项含义如下。Selectedobjectonly(nodescendants):将当前选择对象(不包含子对象)的属性和值添加到对象仓库Objectrepository中。Defaultobjecttypes:将当前选择对象的属性和值添加到对象仓库中,并根据过滤器(defaultfilter)指定默认对象的属性和值添加到对象仓库中。若单击“Select”按钮,在弹出的选择对象类型(“SelectObjectTypes”)对话框中,单击“Default”按钮,可见当前默认过滤器(defaultfilter)指定的默认对象,如图3.41所示。图3.41“SelectObjectTypes”对话框Allobjecttypes:将当前选择对象和其子对象的所有属性和值添加到对象仓库中。Selectedobjecttypes:将当前选择对象的属性和值添加到对象仓库中,并将过滤器指定的默认对象类型属性和值添加到对象仓库中。若单击“Select”按钮,在弹出的选择对象类型(“SelectObjectTypes”)对话框中,可以将支持的类型或者类添加到对象仓库中。在对象仓库中,可以看见添加到其中的FlightReservations的所有对象:“Agentnamemustbeat”和“Static”静态文本,以及一个“确定”按钮,如图3.42所示。图3.42FlightReservations的所有对象3.3.3.2捕捉动态提示信息此实例中,捕捉动态提示信息的思想是将动态提示信息捕捉到err_message变量中,并将该变量信息写到结果报告中。捕捉动态提示的方法如下:err_message=Dialog(Login).Dialog(FlightReservations).Static(Agentnamemustbeat).GetROProperty(text)写该语句的时候,使用QTP的默认配置,自动调出支持的对象方法属性,选择脚本所示的方法属性,获取动态提示信息。为什么选择text属性呢?因为“AgentNamemustbeat”对象的text属性描述的是错误提示信息,在“ObjectRepository”窗口中,选择“AgentNamemustbeat”对象选项,在右侧的对象属性窗格中显示了该对象的属性信息,单击按钮,在弹出的对话框中可以选择添加要查看的该对象的属性信息,如图3.43所示。图3.43查看对象的所有属性通过上述操作,动态的提示信息被捕捉出来了,那么如何编写脚本呢?编写脚本如图3.44所示。图3.44动态提示信息捕捉脚本如上脚本虽然解决了捕捉动态提示信息的问题,但是仍然存在问题。在动态提示信息脚本实例中,设置的是当存在动态提示信息,也就是登录飞机订票应用程序失败时,弹出提示信息,确定提示信息后,并未“Cancle”(取消)该应用程序。这导致循环参数时,脚本又启动了飞机订票应用程序,这样,当前界面存在两个飞机订票应用程序的初始界面,此时QTP遇到了难题,它不知道该选择哪个应用程序继续工作,因此在脚本中要添加取消这个未退出的应用程序登录界面的操作。3.3.3.3取消未退出的应用程序登录界面取消未退出的应用程序登录界面的核心思想是:当登录失败时,首先确定动态提示信息,然后取消“Login”界面。要取消该应用程序,首先是要让QTP识别出登录界面的所有对象,具体操作如下:1.手动启动飞机订票系统应用程序。2.在QTP主界面中,单击“ObjectRepository”按钮(或按下“Ctrl+R”组合键),打开“ObjectRepository”(识别对象)窗口。3.在“ObjectRepository”窗口中,单击“AddObjectstoLocal”按钮,选择飞机订票系统的登录界面。4.在弹出的“ObjectSelection”对话框中,单击“OK”按钮。5.在弹出的“DefineObjectFilter”对话框中,选中“Allobjecttypes”单选项,将该提示信息的所有对象都识别出来。6.在“ObjectRepository”窗口中,添加了“Login”的所有对象,如图3.45所示。图3.45“Login”的所有对象7.关闭“ObjectRepository”窗口,这样,该登录界面的所有提示信息就被识别出来了。8.在QTP的ExpertView中,修改登录失败判断的if脚本,修改结果如图3.46所示。图3.46ExpertView中修改登录失败判断的if脚本这样,整个登录功能的脚本就做好了,该脚本的扩展性比较强。在捕捉动态提示信息的脚本中,使用了GetROProperty方法,下面详细说明如何使用GetROProperty方法。GetROProperty方法的含义是在应用程序的对象中,返回当前测试对象属性的值。GetROProperty方法适用的环境有:ActiveX、Web、VisualBasic和StandardWindows。适用ActiveX环境的对象类型有:ActiveX、AcxButton、AcxCalendar、AcxCheckBox、AcxComboBox、AcxEdit、AcxRadioButton和AcxTable。适用Web环境的对象类型有:Browser、Frame、Image、Link、Page、ViewLink、WebArea、WebButton、WebCheckBox、WebEdit、WebElement、WebFile、WebList、WebRadioGroup、WebTable和WebXML。适用VisualBasic环境的对象类型有:VbButton、VbCheckBox、VbComboBox、VbEdit、VbEditor、VbLabel、VbList、VbListView、VbRadioButton、VbScrollBar、VbToolbar、VbTreeView和VbWindow。适用StandardWindows环境的对象类型有:Dialog、Static、WinButton、WinCalendar、WinCheckBox、WinComboBox、Window、WinEdit、WinEditor、WinList、WinListView、WinMenu、WinObject、WinRadioButton、WinScrollBar、WinSpin、WinStatusBar、WinTab、WinToolbar和WinTreeView。本实例中,使用的就是StandardWindows环境的Static对象,返回的是Static对象的text属性值,因为需要的就是该属性值,弹出报错原因的提示。回放一下,弹出了测试报告,查看测试报告,如图3.47所示。图3.47捕捉动态提示信息后,登录脚本回放测试报告再次检查一下脚本,发现该脚本叫做Action1,从该脚本的名称,很难判断出脚本的含义,因此要对脚本进行设置。4.6.1相对路径调用存在的Action1.创建被调用脚本在保存“调用Action”脚本的根目录下,创建“Login.xls”文件,如图4.60所示。在“Login.xls”文件中,将“Sheet1”命名为“Login_Sheet”,如图4.61所示。图4.60创建“Login.xls”文件“Login.xls”文件中的“Login_Sheet”工作表的数据中,第一行的前两列导入到QTP的DataTable中,显示的是列名,分别是“username”和“password”。图4.61“Login.xls”中的“Login_Sheet”工作表从外部文件中读取参数,创建登录脚本的思想是:以相对路径方式启动飞机订票系统,读取相对路径的Excel文件到当前Action的DataTable中,根据参数,按行操作,循环登录应用程序,直到所有参数执行完毕,部分脚本在ExpertView中如图4.62所示。图4.62读外部文件作为参数的登录脚本脚本说明:a.DataTable.ImportSheetPathFinder.Locate(Login.xls),Login_Sheet,LoginAction含义:读取Excel文件,将Excel中的工作表读到本地的DataTable中,并且被读取的Excel文件放到当前脚本的目录下,以相对路径方式读取。在4.6.3节中将会介绍,DataTable对象的ImportSheet方法有三个参数,第一个参数是外部文件Excel的位置,第二个参数是Excel中的工作表,第三个参数是QTP中DataTable的表名。在该脚本中,以相对路径方式读取“Login.xls”文件,取该文件中的“Login_Sheet”工作表,将Excel文件中的参数读入到QTP的DataTable表LoginAction中。b.RowCount=DataTable.GetSheet(LoginAction).GetRowCount含义:将DataTable中LoginAction表的行数读取出来,赋值到变量RowCount中。c.DataTable.SetCurrentRow(i)含义:指定当前运行的DataTable中的i行是激活行,操作数据时,操作的也是当前指定的第i行。d.Dialog(Login).WinEdit(AgentName:).Set