当前位置:文档之家› QTP(自动化功能测试工具)知识积累

QTP(自动化功能测试工具)知识积累

QTP(自动化功能测试工具)知识积累
QTP(自动化功能测试工具)知识积累

QuickTest

Professional

摘要

「软件测试自动化」已经被许多的软件测试专家验证是可行的,并且反复的运用在许多软件开发过程中。大多数参与软件测试的专家也同意自动化测试不只是值得的同时也是必要的。在软件测试的市场上有许多针对使用者接口(GUI)应用程序所开发的自动化测试工具,而且其中有些工具所提供的功能,已经足够满足软件测试自动化的需求。但是,我们却看到越来越多的公司,在购买自动化测试工具之后才发现,实施一个符合成本效益(cost-effective)的自动化测试解决方案(solution)原比其所呈现的还困难。

我们会常常听到一些抱怨,像是“看软件测试工具厂商做起来好像很容易,但是当我们的人自己做的时候却完全不是那么一回事!”、“事实上我们已经花了六个月的时间在导入自动化测试,但是大部分的测试却还是停留在人工测试的阶段!”或是“要让整个自动化测试运作起来所花费的时间实在太长了,还不如使用原本的人工测试所花的时间更短!”。

通常最后的结局是“另一个错误的采购!”,自动化测试工具从此被束之高阁了。

何谓自动化测试?

简而言之,所谓的自动化测试就是将您现有的手动测试流程给自动化。而且要实施自动化测试的公司或组织,本身必须要有一套「正规(formalized)」的手动测试流程。而这个正规的手动测试流程至少要包含以下的条件:

?详细的测试个案(test cases):从商业功能规格或设计文件而来的测试个案,包含可预期的(predictable)的预期结果(expected result)。

?独立的测试环境(test environment):包含可回复测试资料的测试环境,以便在应用软件每次变动后,都可以重复执行测试个案。

假如您目前的测试流程并未包含上述条件,即使您导入了自动化测试,也不会得到多大的好处。

所以,假如您的测试方法(testing methodology)只是将应用软件移转到一群由「使用者」

或「专家级使用者(subject matter experts)」组成的测试团队,然后任由他们去敲击键盘执行测试工作。那我建议您先把自动化测试放一边,把「建立一个有效的测试流程」当成您目前首要的工作。因为要自动化一项不存在的流程是完全没有意义的。

自动化测试最实际的应用与目的是自动化回归测试(regression testing)。也就是说,您必须要有用来储存详细测试个案的数据库,而且这些测试个案是可以重复执行于每次应用软件被变更后,以确保应用软件的变更没有产生任何因为不小心所造成的影响。

「自动化测试脚本(script)」同时也是一段程序。为了要更有效的开发自动测试脚本,您必须和一般软件开发的过程一样,建立制度以及标准。要更有效的运用自动化测试工具,您至少要有一位受过良好训练的技术人员,换句话说,您至少要有一位程序设计师(programmer)。

该段文字摘自《Totally Data-Driven Automated Testing By Keith Zambelich Sr. Software Quality Assurance Analyst,Automated Testing Evangelist》,作者目前为Automated Testing Specialists,Inc.公司的总裁兼执行长官,主要从事自动化测试导入的顾问工作。

本文介绍的相关知识就是这位程序设计师所需要具备的最基本的知识。

本文系取前者之经验,综合运用,非一人之得,不敢妄专,惟留一己心得耳。

第一部分基础知识

1.QTP安装

●主程序:

进入下面目录运行:

QTP90\QuickTest\setup.exe

在没有Licence的情况下选择安装演示版,完成安装之后再破解,其它按照默认设置完成安装,可暂不重启;中途需要下载Microsoft Script Debugger(脚本调试器),如果下载失败,可以安装结束之后另行下载安装:

..\..\ADD-INS\脚本调试器.exe

●安装中文插件(可选):

进入下面这个目录运行:

QTP90CHS\QuickTestPro_CHS\ QuickTestPro_CHS.exe

按照默认设置完成安装,可暂不重启;

●关联QC插件(Mercury Quality Center Add-in):

进入下面目录运行:

QTP90\TDPlugin\ TDPluginsetup.exe

按照默认设置完成安装,以上安装完成之后必须重新启动QTP才可以进行许可证的安装。

●安装插件许可证:

1、使用并发许可证

这需要有正版Lic的机器做服务器,在运行QTP的时候点击“修改插件许可证”,选择安装并发许可证,再入如服务器地址,如:192.168.168.89

2、使用单机许可证

把mgn-mqt82.exe文件放到X:\Program Files\Mercury Interactive\QuickTest Professional下面,然后运行,退出重新运行QTP即可。

在已经安装并发许可证而又想修改许可证为单机许可证的话,可能上面的方法行不通,这种情况下可以试着先使用记事本或者相关的程序打开C:\Program Files\Common Files\Mercury Interactive\License Manager\lservrc文件,在打开的文件中,复制形如下面的一段字符串:D6BUM D6BUM D6BUM D6BUM D6BUM D6BUM D6BUM D6BUM 8QARH#,记得一定带上“#”号,在首次运行QTP的时候点击“修改插件许可证”,选择安装单机许可证,再将这段字符粘贴到里面重启QTP就行了。

2.QTP启动

要启动QuickTest,请选择“开始”菜单中的“程序” > “QuickTestProfessional” > “QuickTest Professional”。

第一次启动QuickTest 时,打开“加载项管理器”对话框。

提示:如果不希望下次启动QuickTest 时打开该对话框,可以清除“启动时显示”复选框。单击“确定”。打开“QuickTest Professional”窗口。可以选择打开QuickTest 教程,开始录制新测试,打开现有测试或打开空白的新测试。

提示:可以按ESC 键关闭窗口,也可以点击“空白测试”建立新的测试,或者打开其它测试脚本或组件。可以单击“每日提示”浏览所有可用提示。如果不希望下次启动QuickTest 时显示该窗口,可以清除“启动时显示该屏幕”复选框。

3.QTP窗口

QuickTest 窗口包含下列关键元素(下图为QTP 8.2的试图,和9.0版本稍有不同):

?标题栏 - 显示当前打开的测试或组件的名称。

?菜单栏 - 显示 QuickTest 命令菜单。

?文件工具栏 - 包含若干按钮,协助您管理测试或组件。

?测试工具栏 - 包含若干按钮,协助您完成测试过程。

?调试工具栏 - 包含若干按钮,协助您对测试或组件进行调试(默认情况下不显示)。?操作工具栏 - 包含若干按钮和一个操作列表,用于查看单项操作或整个测试流的

详细信息。

?测试窗格 - 包含关键字视图和专家视图选项卡。

? Active Screen - 当您在录制会话过程中执行某个特定步骤时,提供了出现的应用

程序的快照。

?数据表 - 协助您对测试或组件进行参数化。对于测试,数据表包含“全局”选项

卡和每个操作的选项卡;对于组件,数据表包含单个选项卡。

?“调试查看器”窗格 - 协助您对测试或组件进行调试。“调试查看器”窗格包含

“监视表达式”、“变量”和“命令”选项卡(默认情况下不显示)。

?状态栏 - 显示 QuickTest 应用程序的状态。

4.QTP常用快捷方式

下表这些快捷方式是我们经常用得到的,而其它的快捷方式记忆起来比较复杂,具体参见QTP的帮助文档:

5.检查点概述

在录制会话过程中或在编辑测试或组件时添加检查点。在录制了初始测试或组件之后,

通常可以更为方便地定义检查。有几种方法可以添加检查点。

在录制或编辑时添加检查点

?使用“插入”菜单上的命令,或者单击“测试”工具栏上的“插入检查点”按钮旁边的箭头。

这将显示与关键字视图的选定步骤相关的检查点选项的菜单。

只在编辑时添加检查点

?右键单击关键字视图中您要添加检查点的步骤,然后选择“插入标准检查点”。

?右键单击Active Screen 中的任意对象,然后选择“插入标准检查点”。可使用该选项为Active Screen 中的任意对象创建检查点(即使该对象不是关键字视图中任一步骤的组成部分)。

注意:

如果使用“Active Screen”方法,请确保Active Screen 包含有关待检查对象的充足数据。

了解检查点类型

您可以插入下列检查点类型以检查网站或应用程序中的各种对象。

?“标准检查点”检查应用程序或网页中对象的属性值。标准检查点会检查各种对象,如按钮、单选按钮、组合框、列表等等。例如,您可以检查在选择单选按钮之后它是否处于激活状态,或者可以检查编辑字段的值。标准检查点在所有加载项环境中都受到支持。?“图像检查点”检查应用程序或网页中的图像的值。例如,您可以检查所选图像的源文件是否正确。

注意:可以通过在图像对象上插入标准检查点来创建图像检查点。图像检查点在Web 环境中受到支持。

?“位图检查点”检查位图格式的网页或应用程序区域。例如,假设您有一个网站,可以显示用户指定的城市的地图。该地图具有用于缩放的控制键。在单击放大地图的控制键后,您可以录制所显示的新地图。使用位图检查点,您可以检查该地图是否正确放大。位图检查点在所有加载项环境中都受到支持。

?“表检查点”检查表内部的信息。例如,假设您的应用程序或网站包含一个表,该表列出了从纽约到旧金山的所有可用航班。您可以添加一个表检查点,以检查该表中的第一个航班的时间是否正确。

注意:可以通过在表对象中插入标准检查点来创建表检查点。表检查点在Web 和ActiveX 环境中受到支持。表检查点还在很多外部加载项环境中受到支持。

?“文本检查点”检查文本字符串是否显示在应用程序或网页的适当位置中。例如,假设您的应用程序或网页显示句子:“从纽约到旧金山的航班”。您可以创建一个文本检查点,检查词语“纽约”是否显示在“从”与“到旧金山的航班”之间。文本检查点在所有加载项环境中受到支持(请参阅下面的“受支持的检查点” )。

?“文本区域检查点”检查文本字符串是否按照指定的条件显示在WindowsApplications 中所定义的区域内。例如,假设您的Visual Basic 应用程序有一个按钮,显示“查看文档< 号码>”,其中< 号码> 会被输入到应用程序中其他位置的窗体的四位数字代码替换。您可以创建一个文本区域检查点,以确认在该按钮上显示的号码与在窗体中输入的号码相同。文本区域检查点在标准Windows、Visual Basic 和ActiveX 加载项环境中受到支持。文本区域检查点还在一些外部加载项环境中受到支持。

?“可访问性检查点”确定可能不符合万维网联盟(W3C) Web 内容可访问性规则的网站区域。例如,W3C Web 内容可访问性规则的规则1.1 要求您为每个非文本元素提供等效文本。您可以添加“Alt”属性检查,检查按照该规则要求具有“Alt”属性的对象是否确实具有这样的标记。可访问性检查点在Web 环境中受到支持。

?“页面检查点”检查网页的特性。例如,您可以检查加载网页所需的时间,或者检查网页是否包含损坏的链接。

注意:可以通过在页面对象上插入标准检查点来创建页面检查点。页面检查点在Web 环境中受到支持。

?“数据库检查点”检查由您的应用程序访问的数据库的内容。例如,您可以使用数据库检查点来检查网站上包含航班信息的数据库的内容。数据库检查点在所有环境中都受支持(请参阅下面的“受支持的检查点” )。

?“XML 检查点”检查XML 文件中的XML 文档的数据内容,或检查网页和帧中的XML 文档的数据内容。有关XML 检查点的详细信息,请参阅第11 章“检查XML”。

XML 检查点(网页/ 帧)在Web 环境中受到支持;XML 检查点(文件)在所有环境中受到支持(请参阅下面的“受支持的检查点” )。

6.受支持的检查点

下表显示了在每个环境(默认情况下由QuickTest Professional 安装支持)中受支持的

检查点类型。

S - 支持

NS - 不支持

NA - 不适用

7.规范例程

脚本的生成方式就两种,一种是自写脚本,一种是录制生成。常常听见有人说,这两种方式中首选录制生成脚本,因为它简单且智能化。但我个人总觉得手写脚本要好一些,因为:?可读性好,流程清晰,检查点截取含义明确。业务级的代码读起来总比协议级的代码更易让人理解,也更容易维护,必要时可建立一个脚本库。而录制生成的代码大

多没有维护的价值,现炒现卖。

?手写程序相比录制脚本更能增加测试人员的技术含量。开发和测试能力双重提高,何乐而不为呢?QTP提供了java user,vb user,等语言类型的脚本,就是给我们开

发脚本用的,而不是录制用的。

脚本不管录制也好,还是手写也好,选择的时候应该以脚本模拟程序真实有效为准,结合项目进度,开发难易程度等因素考虑。而脚本的开发也需要符合一种规范,也可以说是一种习惯,因为脚本不只是开发者一个人看,测试执行人员也需要看,这就要求可读性和可维护性提高;故而开发时应该考虑这层因素,规范一下。

下面这段某系统登陆的脚本,是一位前辈写的,引用一下(借机崇拜一下):

'*************************************************************************

'* 模板名称:Login

'* 开发人员:L Y

'* 开发日期:2006-10-12

'* 最后修改日期: 2006-10-13

'* 输入参数:用户名、密码

'* 输出参数:成功进入

'* 脚本描述:通用的登陆设计

'***********************************************************************

Dim hint_msg

Dim hint

Dim ActualDialogPopup

InvokeApplication "D:\Program Files\Mercury Interactive\QuickTest Professional\samples\

flight\app\flight4a.exe"

' 参数化user和password值

Dialog("Login").WinEdit("Agent Name:").Set DataTable("user",dtGlobalSheet)

Dialog("Login").WinEdit("Password:").Set DataTable("password",dtGlobalSheet)

Dialog("Login").WinButton("OK").Click

hint = DataTable("hint",dtGlobalSheet)

' 判断弹出错误提示框的正确性,如果输入了正确密码,而用户名又大于4个字符则不弹出错误提示框,否则弹出错误提示框。

If Dialog("Login").Dialog("Flight Reservations").Exist then

ActualDialogPopup = "TRUE"

else

ActualDialogPopup = "FALSE"

end if

ExpectedDialogPopup = DataTable("ExpectedDialogPopup",dtGlobalSheet)

If (ActualDialogPopup = ExpectedDialogPopup) then

Reporter.ReportEvent micpass,"登陆","程序判断正确."

' 如果弹出错误提示框,通过对比hint

If ActualDialogPopup = "TRUE" Then

hint_msg = Dialog("Login").Dialog("Flight

Reservations").Static("Static").GetROProperty("text")

If (hint = hint_msg) Then

Reporter.ReportEvent micpass,"登陆错误提示","错误提示信息正确."

else

Reporter.ReportEvent micFail,"登陆错误提示","错误提示信息错误."

End if

Dialog("Login").Dialog("Flight Reservations").WinButton("确定").Click Dialog("Login").Close

else

Window("Flight Reservation").Close

End If

else

Reporter.ReportEvent micfail,"登陆","程序判断错误."

If ActualDialogPopup = "TRUE" Then

Dialog("Login").Dialog("Flight Reservations").Close

Dialog("Login").Close

else

Window("Flight Reservation").Close

end if

End If

8.模板的应用

新建一个文本,输入一些新建Action时常包含的信息,然后保存为ActionTemplate.MST 文件,并复制到QTP/dat目录下;这样每次新建action都会包含固定的信息了;

例如:

'-------------------脚本说明---------------

'产品版本:

'测试员:

'编写日期:

'测试功能:

'脚本类型:

'被测试对象初始状态:

'进展程度:

'…………

'--------------------脚本内容-------------

9.方式与级别

Analog recording(模拟录制)

将“模拟录制”用于您要在其中录制鼠标的实际移动的应用程序。这些可能包括绘制鼠标签名或者使用通过拖动鼠标创建图像的绘图应用程序。您可以用“模拟录制”模式相对于屏幕或特定窗口进行录制。

相对于指定窗口录制- 如果对其执行操作的对象位于一个窗口内部而且该窗口在模拟录制会话期间没有移动。这可以确保在运行会话过程中,QuickTest 将准确地标识在其上执行模拟步骤的窗口位置,即使当您运行模拟步骤时窗口位于不同的位置。QuickTest 不会录制在指定窗口外部执行的任何单击或鼠标移动。当使用这种模式时,QuickTest 不会捕获任何Active Screen 图像。

相对于屏幕录制- 如果在其上录制模拟步骤的窗口在录制过程中移动,或者您所执行的操作是针对位于多个窗口内的对象。这可能包括将对象从一个窗口拖放到另一个窗口中。当使用这种模式时,QuickTest 将捕获您在其中进行录制的窗口的最终状态的Active Screen 图像。

使用“模拟录制”录制的步骤被保存在单独的数据文件中。该文件与在其中录制模拟步骤的操作或组件一起存储。

当以“模拟录制”模式进行录制时,QuickTest 将向测试或组件添加一个调用所录制的模拟文件的“RunAnalog”语句。相应的Active Screen 将显示在模拟录制会话期间执行的最后一个模拟步骤的结果。

low-level recording(低级录制)

使用“低级录制”在不受QuickTest 支持的环境或对象上进行录制。当您需要在应用程序屏幕上录制操作的精确位置时,请使用“低级录制”。当以正常模式录制时,QuickTest 将在对象上执行步骤,即使该对象已经移动到屏幕上的新位置。如果对象的位置对于您的测试或组件非常重要,请切换到“低级录制”以使QuickTest 能够按照屏幕上的x 坐标和y 坐标录制该对象。这样,该步骤只有在对象位于正确的位置时才能通过。

当使用“低级录制”时,QuickTest 将所有父类对象录制为Windows 测试对象,将所有其他对象录制为WinObject 测试对象。它们在Active Screen 中显示为标准Windows 对象。“低级录制”对每个测试对象支持下列方法:

WinObject 测试对象- Click、DblClick、Drag、Drop、Type

Window 测试对象- Click、DblClick、Drag、Drop、Type、Activate、Minimize、Restore、Maximize

以“低级录制”模式录制的每个步骤都显示在关键字视图和专家视图中。(“模拟录制”仅录制关键字视图中那个调用外部模拟数据文件的步骤。)

模拟录制和低级录制的规则

模拟录制和低级录制产生的脚本无法插入检查点,而且应用程序界面稍有变动则脚本无法正常运行,所以非万不得已(QTP正常支持的B/S结构以外的情况)应该避免这两种录制方式。有时候因为无法正常录制或者无法正常运行,初学者就可能考虑使用这两种方式录制,事实上,只要是C/S(其实部分结构简单一点的B/S)结构,基本上都能够避免所遇到的这些问题,具体方法,参见第二部分。

当选择“模拟录制”或“低级录制”时,请考虑下列规则:

只有当QuickTest 的正常录制模式不能准确录制您的操作时,才应使用“模拟录制”或“低级录制”。“模拟录制”和“低级录制”要求比正常录制模式更多的磁盘空间。对于特定的步骤,您可以在录制会话期间切换到“模拟录制”或“低级录制”。在以“模拟录制”或“低级录制”模式录制了必要的步骤之后,就可以返回到正常录制模式来完成录制会话的其余部分。

第二部分对象库和对象属性

10.对象识别和智能标识

对象的属性识别主要来自QTP识别的网页(或者其它)本身的控件设计,因此对象的属性是灵活多变的,有时候我们需要添加一个或多个属性,有时需要删除一个或多个属性,具体的情形要根据当时的情况而定。录制或编写测试脚本的时候要注意多观察:哪些属性能够唯一表示一个对象,哪些属性值是随机变化的,哪些属性需要多次运行时都能够匹配。

?对于对象属性是变化的,可以参数化/或者用正则表达式(参见第一部分基础知识),即在选定的对象的属性值里面采用正则表达式(具体书写规则参见“正则表达式”一节)或者使用参数表(不是很灵活)来对其进行赋值。这样QTP运行时会自动查找对象进行匹配,比较方便,不需要反复添加对象。

?报匹配多个对象错误,可以spy(如下图)查看对象,添加一个该对象另一个唯一标识属性,而这些能够唯一标识的属性需要自己仔细观察来寻找,通常这些唯一标识对象的属性往往是可变化的,如果需要获取对象属性值,这种方法事实上并不是很明智。例如Web复选框类WebCheckBox的的对象属性基本上都是一样的,录制时的区别可能只是自动在他的运行时属性里添加index或location使录制的对象变为_2、_3等等,否则运行时就会提醒无法唯一表示对象,而QTP本身的智能表示机制就可以解决这个问题,不需要手工添加属性来区别。

?上图中显示能够为一区别于其它几行的对象是凭证号对应的列,其对象属性值1117是不同与其它对象的唯一标识,然而在对象捕捉的时候如果将此对象属性值也包含在内的话,下次运行时如果第一行1117号票据已经不存在的话,QTP就会报“找不到对象”

错误。所以对于多个完全相同的对象,可以采用添加index,location,createtime等特殊属性的“定位法”来识别对象。例如:

index: 按照程序源码,绘制对象的先后标识对象,所以与其它相同对象是相互依赖,当其它对象发生变化后,原先的所有对象index属性要发生变化,开始是0。东

亚银行前端交易页面某些交易(例如RB7H,RB1904等)进行时需要获取

webelement的变化的属性值“innertext”,为了能够将交易进行下去,只能使用方

法三里的方法:删除属性“innertext”,然后通过调整index的值来定位所需要

获取的属性的属性值所在的位置。

location:根据对象的位置进行确定,从上到下,从左到右

CreateTime:按照对象被浏览器打开的先后标识对象)

在对象库里添加一个自动含有index标识属性的对象,然后每次通过SetToproperty来改变index值,对对象进行数据驱动,使其操作另一个对象,但脚本始终操作原先index 属性值的对象;这时考虑把该对象删除掉,重新添加一个不自动含有index标识属性的该类对象,然后,手工添加index标识属性,后来脚本能正常工作了,可见两次的对象属性完全一致,但形成方式不一样,导致的结果往往也不一样。

?而QTP自身为了解决相似问题在windows控件里都会添加window id这个属性,它是个随机变化的属性,每次都会随机产生一个与上次不同的值,所以这样反而无法在下一次运行时对对象进行匹配,总是提示找不到对象,有时可以删除对象的变化的属性来解决识别问题,再进行录制脚本的时候可以事先在工具\对象标识(如图)里面通过配置

各个类的属性操作来删除这些可变属性,重新进行录制或添加对象就可以了。

选择相应的插件类型(如Web、Activex等),然后对相应的类(如WebElement)

分别在强制属性和辅助属性里点击“添加/删除”按钮,配置你所需要的能够为一标示你所需要的对象的属性。

如需启用智能标识,则选中“启用智能表识”,然后点击“配置”按钮(如图):

同样在“基本筛选属性”和“可筛选属性”里面通过点击“添加/删除”按钮来选择进行对象智能标识的属性。

另外换一种思维方式,采取等效的方法;比如用键盘代替鼠标或用操作系统本身特性去解决问题。这种方法可忽略对象库中的对象,不需要识别,前提是除去判断语句;但是这种写法——使用键盘模拟函数只能够处理弹出对话框或msgbox中只有一个按钮的情

况,或者两种但是默认停留在需要点击的地方。

相关信息参见下文“键盘模拟”。

11.万能键盘模拟函数

Extern.Declare micV oid,"keybd_event","user32.dll","keybd_event",micByte,micByte,micDWord,micULong

Extern.keybd_event 32(参数),0,0,0

由于space键代码为32,所以上述代码模拟了点击space键操作,其它键盘操作代替可由下表查得:

更多的键盘代码请参见:虚拟键盘码一览表

12.键盘模拟函数:WScript.Shell的应用

set WshShell =CreateObject("WScript.Shell")

WshShell.SendKeys "{ENTER}"'模拟键盘进行操作

键盘键-函数一览表

13.等待时间的艺术

某个对象是否出现不明确或者应用系统响应时间不确定的时候,我们往往采取Wait的方法,而且这个时间是不确定,所以一般初学者会考虑使用最大时间值(系统最慢的情形)。其实完全没有必要等这么长时间,而且如果系统忽快忽慢怎么办?总不能每次“跑脚本”之前都去修改一次吧,这样脚本少还可以,脚本多(一个或多个测试集往往牵涉到几十上百个测试脚本)了呢?这样的话,脚本维护的代价太昂贵了!

这种情况下可以考虑写一些循环语句代替wait语句,这些语句写得合理的话,会在系统响应的第一时间做下一步操作,而长时间无响应就可以通过跳出条件来终止运行,报告系统连接超时就可以了。因为这种速度的系统版本客户是不会要的,一般情况下这种测试是没有意义的。

下面是我曾经使用的一些例子:

?系统必须作出响应的情形,无须跳出,只待系统正常,否则手动干预:Do

If Browser("teller").Page("teller").Frame("content").WebList("ACCT_STATUS").

GetROProperty("value") = "" Then

Else

Exit Do

End If

Loop

?使用WaitProperty函数,该函数的作用基本上和If……Exist(second)……End If比较类似。但是它的判断结果有True和False两种,在If的判断语句的时候很方便,因为条件成立可以执行下一步,反之如果需要不成立而去执行下一步,他的作用就不是

If……Exist(second)……End If所能比的了。

WaitProperty("visible",true,10000)

第一个引号内参数是对象的属性名称,第二个是该属性的值,第三个就是等待的时间,单位是毫秒,具体的应用如:

If Browser("teller").Page("teller").WebElement("手续费打印完毕!

").WaitProperty("innertext","手续费打印完毕!",60000) = False Then

Browser("teller").Page("teller").Image("ToolBar_Refresh_0").Click

Elseif Browser("teller").Dialog("Microsoft Internet Explorer").Exist(10)Then

Browser("teller").Dialog("Microsoft Internet Explorer").WinButton("确定").Click

Browser("teller").Page("teller").Image("ToolBar_Refresh_0").Click

Reporter.ReportEvent micFail,"发出托收票据","交易失败"

ExitAction(1)

End If

?定义弹出框存在性状态,使用循环语句判断

Dim blnDone,counter

blnDone=false

counter=1

While blnDone

Wait (1)

blnDone=Window("iexplore").WinObject("OK").Exist

counter=counter+1

If counter=10 then

blnDone=True

End if

Wend

?循环判断,跳出条件是i=10

Dim i

i=1

while ((window("iexplore").WinObject("OK").Exist) and (i<10))

window("Iexplore").WinObject("OK").Click

i=i+1

wend

14.验证弹出错误类型

If Browser("teller").Dialog("Explorer").exist(1) then

em=browser("teller ").dialog("Explorer ").static("密码错误!").getRoproperty("text")

If em<>(datatable.value("error_info"))then

msgbox(em)

reporter.ReportEvent micFail,"系统登陆","密码错误"

End If

Browser("teller").Dialog("Explorer").close

…或者Browser("teller").Dialog("Explorer").WinButton(确定).Click

End if

一:对于Dialog中,虽然提示信息对象名称是"用户密码错误",但如果信息对象名称是“该用户不存在”,不用更改会自动识别,我想主要是录制第一遍时,“用户密码错误”只是让运行时能找到这个控制,而不管它是什么内容,因为在对象仓库中,text不是决定该对象的属性。事实上,可以经过对象属性配置,在Static对象的强制属性中添加text属性,然后上面的语句就可以这样写了:

If Browser("teller").Dialog("Explorer"). static("密码错误!").exist(1) then

msgbox(密码错误!)

Reporter.ReportEvent micFail,"系统登陆","密码错误"

Else

Reporter.ReportEvent micPass,"系统登陆","登陆成功"

Browser("teller").Dialog("Explorer").close

…或者Browser("teller").Dialog("Explorer").WinButton(确定).Click

End if

这种情况要求需求必须明确,要知道这种情况下的弹出框内容,否则就是无的放矢了。

二:如果对于提示信息比较长的,可以用mid(error_message,n,m)取一部份特征提示信息进行验证,这样我想可以节省处理时间,又可以避免长度以及空格等字符的处理。15.虚拟对象

在实际测试过程中,很多时候网页上的控件并不能都被QTP识别,例如网页上一个flash动画,实际上是一个链接,但是QTP无法识别出flash这个控件,这时使用QTP中的虚拟对象来解决这个问题。

下文以WebButton为例:

1.使用虚拟对象,将WebButton设为一个对象,点击工具——虚拟对象——新建虚

拟对象,弹出如下对话框:

2.点击“下一步”,进入下一个对话框:

相关主题
文本预览
相关文档 最新文档