为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

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

2012-06-22 46页 doc 1MB 24阅读

用户头像

is_973719

暂无简介

举报
QTP(自动化功能测试工具)知识积累QuickTest Professional 文档状态: 草稿版 当前版本: V1.3 编 写: 刘毅 编写日期: 2006-10-01 审 核: 审核日期: 批 准: 批准日期: 文档修订记录 章节编号 修订前版本号 修订后版本号 修订内容简述 修订日期 所有 1.0 新建 2006-10-01 刘毅 一 1.0 1.1 增加4、5、6三节 2006-12-27 刘毅 一、二 1.1 1.2 新增第一、二...
QTP(自动化功能测试工具)知识积累
QuickTest Professional 文档状态: 草稿版 当前版本: V1.3 编 写: 刘毅 编写日期: 2006-10-01 审 核: 审核日期: 批 准: 批准日期: 文档修订记录 章节编号 修订前版本号 修订后版本号 修订内容简述 修订日期 所有 1.0 新建 2006-10-01 刘毅 一 1.0 1.1 增加4、5、6三节 2006-12-27 刘毅 一、二 1.1 1.2 新增第一、二部分图片说明 2007-1-12 刘毅 二、三 1.2 1.3 新增16、30、33节,修改11 2007-1-15 刘毅 摘 要 「软件测试自动化」已经被许多的软件测试专家验证是可行的,并且反复的运用在许多软件开发过程中。大多数参与软件测试的专家也同意自动化测试不只是值得的同时也是必要的。在软件测试的市场上有许多针对使用者接口(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的帮助文档: Command Shortcut Key Function Record (普通录制) F3 Starts a recording session. Run (运行) F5 Starts a run session from the beginning or from the line at which the session was paused. Stop (停止) F4 Stops the recording or run session. Run from Step (丛当前步骤运行) Ctrl+F5 Starts a run session from the selected step. Analog Recording (模拟录制) Shift+Alt+F3 Starts recording in analog recording mode. Low Level Recording(低级录制) Ctrl+Shift+F3 Starts recording in low level recording mode. Object Repository(打开对象库) Ctrl+R Opens the Object Repository dialog box. Step Into (单步调试运行到) F11 Runs only the current line of the script. If the current line calls a method, the method is displayed in the view but is not performed. Step Over (跳出断点) F10 Runs only the current line of the script. When the current line calls a method, the method is performed in its entirety, but is not displayed in the view. Step Out (跳过断点) Shift+F11 Runs to the end of the method then pauses the run session. (Available only after running a method using Step Into.) Run to Step (运行到) Ctrl+F10 Runs until the current step. Add to Watch (添加到观察表) Ctrl+T Adds the selected item to the Watch tab. Insert/Remove Breakpoint (断点) F9 Sets or clears a breakpoint in the test. Enable/Disable Breakpoint (启用/停用断点) Ctrl+F9 Enables or disables a breakpoint in the test. Clear All Breakpoints (清除所有端点) Ctrl+Shift+F9 Deletes all breakpoints in the test. Check Syntax (语法检查) Ctrl+7 Checks the syntax of the active document. 5. 检查点概述 在录制会话过程中或在编辑测试或组件时添加检查点。在录制了初始测试或组件之后,通常可以更为方便地定义检查。有几种方法可以添加检查点。 在录制或编辑时添加检查点 · 使用“插入”菜单上的命令,或者单击“测试”工具栏上的“插入检查点”按钮旁边的箭头。这将显示与关键字视图的选定步骤相关的检查点选项的菜单。 只在编辑时添加检查点 · 右键单击关键字视图中您要添加检查点的步骤,然后选择“插入标准检查点”。 · 右键单击 Active Screen 中的任意对象,然后选择“插入标准检查点”。可使用该选项为 Active Screen 中的任意对象创建检查点(即使该对象不是关键字视图中任一步骤的组成部分)。 注意: 如果使用“Active Screen”方法,请确保 Active Screen 包含有关待检查对象的充足数据。 了解检查点类型 检查点类型 描述 用法示例 标准检查点 检查对象的属性值。 检查是否选中某单选按钮。 图像检查点 检查图像的属性值。 检查图像源文件是否正确。 表检查点 检查表中的信息。 检查表单元格中的值是否正确。 页面检查点 检查网页的特性。 检查加载网页所需的时间,或者检查网页是否包含中断链接。 文本/文本区域检查点 检查文本字符串是否显示在网页或应用程序窗口中的适当位置。 检查预期的文本字符串是否显示在网页或对话框上的预期位置。 位图检查点 将网页或应用程序的某个区域捕获为位图后对其进行检查。 检查网页或网页的任何部分是否能按预期显示。 数据库检查点 检查应用程序或网站所访问的数据库内容 检查数据库查询中的值是否正确。 可访问性检查点 对网站区域进行识别,以检查是否符合 508 部分。 检查网页上的图像是否包含 ALT 属性(该属性是 W3C Web 内容可访问性规则所要求的)。 XML 检查点 检查 XML 文档的数据内容。 注意:XML 文件检查点用于检查特定的 XML 文件;XML 应用程序检查点用于检查网页中的 XML 文档。 您可以插入下列检查点类型以检查网站或应用程序中的各种对象。 · “标准检查点”检查应用程序或网页中对象的属性值。标准检查点会检查各种对象,如按钮、单选按钮、组合框、列表等等。例如,您可以检查在选择单选按钮之后它是否处于激活状态,或者可以检查编辑字段的值。标准检查点在所有加载项环境中都受到支持。 · “图像检查点”检查应用程序或网页中的图像的值。例如,您可以检查所选图像的源文件是否正确。 注意:可以通过在图像对象上插入标准检查点来创建图像检查点。图像检查点在 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 '* 开发人员: LY '* 开发日期: 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 micVoid, "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}"     '模拟键盘进行操作 键盘键-函数一览表 Key Argument BACKSPACE {BACKSPACE}, {BS}, or {BKSP} BREAK {BREAK} CAPS LOCK {CAPSLOCK} DEL or DELETE {DELETE} or {DEL} DOWN ARROW {DOWN} END {END} ENTER {ENTER} or ~ ESC {ESC} HELP {HELP} HOME {HOME} INS or INSERT {INSERT} or {INS} LEFT ARROW {LEFT} NUM LOCK {NUMLOCK} PAGE DOWN {PGDN} PAGE UP {PGUP} PRINT SCREEN {PRTSC} RIGHT ARROW {RIGHT} SCROLL LOCK {SCROLLLOCK} TAB {TAB} UP ARROW {UP} F1 {F1} F2 {F2} F3 {F3} F4 {F4} F5 {F5} F6 {F6} F7 {F7} F8 {F8} F9 {F9} F10 {F10} F11 {F11} F12 {F12} 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. 点击“下一步”,进入下一个对话框: 3. 在类里选择你想将WebButton设为那个QTP能够识别的对象,点击“下一步”: 4. 打开你的页面,页面中包含你要的虚拟的对象,并且点击上面对话框中的标记对象按钮,页面会最小化,鼠标会编程”+”,你可以使用”+”来限定虚拟对象的范围选好后,会在宽度和高度中显示虚拟对象的高和宽,并且点击next,弹出如下对话框: 5. 选择整个父层次或者仅父类,弹出如下对话框: 6. 设定虚拟对象的名称,以及收藏的名字,点击完成,虚拟对象添加完成。然后点击工具——虚拟对象——虚拟对象管理器可以查看编辑虚拟对象: 7. 最后是编写相关的语句,进行预期的操作,下面一句是一个简单的例子,这里Vocollection2是虚拟对象父类名,虚拟对象名为button;虚拟对象使用的具体语法可以参见QTP的帮助文档: Browser("Browser").Page("Page").WebButton("关闭窗口").Activex("Vocollection2").VirtualButton("button").Click 16. 获取对象属性名称用法: GetRoProperty——从应用程序界面上获取对象属性(即,是脚本运行时,获取的对象动态属性值),例如:获取对象库中index属性值,似乎只能用GetToProperty,因为应用程序界面上对象没有该属性,只是QTP为识别该对象创立的描述属性; GetToproperty——从对象库中描述对象的属性,静态值 GetToProperties——获取用于标识对象的属性集;对于这个集合,有count等属性。 关键在于RO和TO,R,就是Runtime,T就是Testtime,O就是Object。因此顾名思义,RO就是在测试执行时的对象,TO就是录制/编写测试时的对象。是同一个类在不同的时间生成的不同的实例,一般来说TO是静态的,而RO是动态的(每次执行测试都会生成新的实例)。 17. ChildObjects的应用 ChildObjects可以返回界面上满足条件的对象集合,而且与对象库里是否有这些对象无关,这就可以简化对象库;返回的对象集合的count方法可以返回对象个数,这就可以通过下标对单个对象进行操作;在出现index标识对象时可以进行运用如: Set m_WinCheck=Description.Create()       m_WinCheck("type").Value="checkbox"       set All_WinCheck=Browser("teller").Page("teller").Frame("content").ViewLink("dbtable").ChildObjects(m_WinCheck)       n=All_WinCheck.Count()       for i=0 to n-1        All_WinCheck(i).Set "ON"       next
/
本文档为【QTP(自动化功能测试工具)知识积累】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索