巅峰之作-QTP系列经典讲座集锦


IQuickTest 领先技术研究专栏 QTP 系列讲座集锦 (1 到 40 讲) 作者:赵旭斌(zzxxbb112) 时间:二零一一年十月二十日 博客:http://blog.csdn.net/zzxxbb112 引言: 二零零九年八月二十六日,一位叫zzxxbb112 的人在csdn上开设了博客《IQuickTest领 先技术专栏》,并一直坚持分享他的QTP系列经典讲座,博客开设六个月就获得了 50000 访问量,之后顺利被选为CSDN博客专家,两度被评选为年度CSDN博客之星,博客至二零一一 年十月十二日已达 20 万多访问量,博客订阅数也达到了 2000 人。如果你希望第一时间能 够获得IQuickTest的最新消息,请订阅IQuickTest领先技术专栏。 最近常有朋友和网友询问QTP系列讲座后续一直没有更新,其主要原因还是最近把大量 精力花在了写书上,书名为《51testing测试丛书-QTP自动化测试技术领航》,将近 一年的功夫,因此一直没有时间去更新博客。而这次还需要告诉大家一个好消息,本书写作 已经完毕,在二零一一年十一月左右即将发售。另外本人还是会继续更新和分享QTP系列经 典讲座的后续内容以及自动化测试方面的最新技术。 任何东西只有分享出来才有着它的价值,之前一直有许多网友一直要求是否能把 QTP 系列经典讲座集中整理成一个 PDF 文件,这样即方便离线阅读也不需要一篇篇的点击来阅 读,就这样这篇 QTP 系列讲座的官方集锦版诞生了。 加入我们: IQuickTest超级主力群可容纳 500 人:  (加入我们) IQuickTest 主力群管理员:zzxxbb112@上海、杜帅@重庆、寒武纪@上海 群内不乏优秀管理人员及众多自动化测试高手,群共享内含有将近 1G 自动化学习资料 注意:加群请注明: iquicktest 否则一律拒绝 QTP 经典系列讲座目录 讲座一  Add-in Manager插件介绍 ............................................. 3 讲座二  对象库及原理透析 ................................................... 6 讲座三  手工参数化 ........................................................ 11 讲座四  资源池 ............................................................ 15 讲座五  DOM技术的应用 ..................................................... 18 讲座六  利用DotNetFactory调用.NET类库 ..................................... 21 讲座七  自定义COM组件的实现(一)WSC篇 .................................... 23 讲座八  自定义COM组件的实现 (二)activex dll生成篇 ....................... 28 讲座九  AutoItX技术的应用 ................................................. 32 讲座十  QTP的两种回放模式 ................................................. 35 讲座十一  AOM应用(一)QuickTest Automation ............................... 38 讲座十二  AOM应用(二)Object Repository Automation ......................... 43 讲座十三  QTP IDE中的垂直分割选取 ......................................... 47 讲座十四  揭开QTP的神秘面纱 (一)隐藏对象篇 .............................. 50 讲座十五  揭开QTP的神秘面纱 (二)隐藏方法篇 .............................. 52 讲座十六  揭开QTP的神秘面纱 (三)保留对象篇 .............................. 56 讲座十七与十八  揭开QTP的神秘面纱 (四)插件开发 .......................... 61 讲座十九  重写Reporter对象 ................................................ 61 讲座二十  利用函数指针重写QTP方法 ......................................... 64 讲座二十一  单例模式在QTP中的应用 ......................................... 66 讲座二十二  描述性编程 .................................................... 68 讲座二十三  QTP中API的应用 ................................................ 70 讲座二十四  创建保留对象的会话实例 ........................................ 72 讲座二十五  重载页面后Web对象的重用 ....................................... 74 讲座二十六  保留对象XmlUtil的应用 ......................................... 77 讲座二十七  ArrayList数组类在DotnetFactory中的应用 ........................ 80 讲座二十八  正则表达式的应用 .............................................. 82 讲座二十九  捕获对象时的模式切换 .......................................... 86 讲座三十  XML联合XSL输出html报表 .......................................... 88 讲座三十一  管理动态保留对象的隐藏组件 .................................. 93 讲座三十二  对象封装属性的真正源头 ........................................ 96 讲座三十三  环境变量的动态生成与秘密加载 ................................. 101 讲座三十四  访问对象自身接口的特殊渠道 ................................... 104 讲座三十五  基于类和函数的complete Word .................................. 106 讲座三十六  自定义验证点-HTML模式 ........................................ 107 讲座三十七  MFL自动化路径模型对象应用 .................................... 110 讲座三十八  自定义场景恢复RecoveryFunction ............................... 114 讲座三十九  注册异类子控件强制注入开启HOOK ............................... 116 讲座四十  创建多个QTP实例 ................................................ 121 QTP 系列讲座集锦 讲座一  Add-in Manager 插件介绍 首先说一下如果你不知道QTP是什么,那就请先打开浏览器输入http://www.baidu.com搜索 下QTP吧~ 进入正题。。。。 在我们打开 QTP 之后,我们可以看到有如下的一个 Add-in Manager 框弹出来 这是一个QTP插件管理器,每次启动前需要选择对应的插件才能进行测试。 经常会在网上看到一些朋友会问:这个项目是用什么什么语言写的,应该选择哪个插件? 其实提出这个问题的朋友是因为没有了解插件的真正含义和作用。 插件的含义与作用: Add-in 的选择是为了能够成功识别对应 Add-in 的测试对象控件,也就是说是和被测控件有 关,而跟什么什么语言写的是没有关系的。 ==========实例=========== 需求:成功使用 QTP 的 SPY 识别出百度搜索框(WebEdit)控件 序号 测试步骤 预期结果 1 双击 QTP.EXE 弹出插件选择框 2 选择 WEB 插件,点击确定 成功打开 QTP 3 打开浏览器,输入WWW.BAIDU.COM 页面成功跳转百度 4 点击 QTP 的菜单栏下 TOOLS-OBJECT SPY 弹出 SPY 框 5 点击手指图标按钮 页面跳转百度页面 6 点击百度文本框 SPY 中显示为 WebEdit 对象 如下图,正确插件SPY显示对象,成功定位到WebEdit对象控件 如下图,错误插件 SPY 显示对象,只能把整个浏览器识别为一个对象,而不能具体定位到正 确的控件对象。 注意事项: 一定要先开 QTP,然后打开 IE,这样 SPY 才能正确识别,因为安装完 QTP 之后,每次打开 IE,浏览器会自动加载 BHOManager,而 QTP 在 IE 中识别对象是依靠一个叫 BHOManager Class 的动态链接库来完成的,如果是先打开 IE 再打开 QTP,QTP 就不能成功读到 BHOManager 这 个动态链接库而导致 QTP 识别对象失败。 讲座二  对象库及原理透析 在介绍对象库前首先要说一下QTP自动化的原理 1.封装被测对象到对象库 2.对比对象库里的对象属性和运行时的真实被测对象的属性 3.对比一致后找到相应的对象 通过以上 3 个步骤,QTP 就可以完成自动化对象。 ===========================实例 1 =========================== 这是一个非常简单的例子~ 如果觉得都懂的可以略过 序号 测试步骤 预期结果 1 打开对象库 弹出对象库 2 打开浏览器,跳转百度 页面成功跳转百度 3 A.点击对象库中的 ADD OBJECT TO LOCAL B.选择百度搜索框对象 成功把搜索框添加到对象库 4 在专家视图中输入写入输入搜索框执行脚本 专家视图显示脚本 5 回放脚本 测试对象自动化输入 添加对象之前,见图 添加完对象之后,见图 脚本显示,如下图: 回放之后,搜索自动输入了 HELLOWORLD~ 如果能够熟练掌握以上的例子之后我们就可以开始进行下一步的工作 这部分的概念很重要,想学好 QTP 就一定要掌握。 熟练运用SetTOProperty,GetROProperty,GetTOProperty 首先说明一下 TO 和 RO 分别是什么意思 TO:测试对象库 RO:运行对象 简单的说: SetTOProperty:修改对象库中对象的属性值 GetTOProperty:获取对象库中对象的属性值 GetROProperty:获取运行对象的属性值 ===========================实例 2 =========================== 就拿刚才的那个例子接着做下去 现在对象库里那个对象是百度的搜索框对象,这点现在没问题吧。 现在我要用这个对象库里的对象来控制 GOOGLE 搜索框的对象 大家肯定会问: 百度的搜索框和 GOOGLE 的搜索框对象属性肯定是不一样的,怎么能控制 GOOGLE 的搜索框 呢? 解决方案:更改对象库里的属性和 GOOGLE 的对象库属性一样就 OK 了, 序列 测试步骤 预期结果 1 使用 SPY 查看你 GOOGLE 搜索框的 NAME 属性 显示 NAME 属性值为 q 2 使用 SetTOProperty 更改对象库 NAME 属性为 q,并进行输入 HELLOWORLD 脚本视图重新改写 3 回放 GOOGLE 搜索框输入 HELLOWORLD 步骤 1: 如果不是很清楚怎么用 SPY 可以去【QTP 系列讲座 1】 Add-in Manager 插件介绍 地址: http://blog.csdn.net/zzxxbb112/archive/2009/08/26/4485906.aspx 步骤 2:脚本视图输入 1. Browser("百度一下,你就知道").Page("百度一下,你就知道"). _ 2. WebEdit("wd").SetTOProperty "name","q" 3. Browser("百度一下,你就知道").Page("百度一下,你就知道"). _ 4. WebEdit("wd").Set "helloworld" 步骤 3:回放 页面成功输入 HELLOWORLD ===========================实例 3 =========================== 序列 测试步骤 预期结果 1 查看对象库的 NAME 属性 显示 NAME 属性值为 wd 2 GetTOProperty 获取对象库的属性值 脚本视图重新改写 3 回放 成功显示指定对象库的属性值 步骤 1.查看对象库 NAME 属性为 wd 步骤 2.脚本视图输入 1. msgbox Browser("百度一下,你就知道").Page("百度一下,你就知道"). _ 2. WebEdit("wd").GetTOProperty("name") 步骤 3.成功显示对象库中百度搜索框 NAME 属性的值 GetROProperty 用法和 GetTOProperty 是一样的,只不过一个是运行对象属性,而一个是 对象库中的属性 ============================================= 细分的朋友应该会发现既然有获取对象库中对象属性,修改对象库中对象属性,获取运行时 对象的属性。 为什么没有 SetROProperty 修改运行时对象的属性呢~ 因为这个方法可以直接使用调用对象【object.属性值】的自身接口来修改运行对象的属性 ===========================实例 4 =========================== 序列 测试步骤 预期结果 1 修改搜索框的长度 脚本视图重新改写 2 回放 百度搜索框被改短了 步骤 1.使用 OBJECT.属性来访问 1. Browser("百度一下,你就知道").Page("百度一下,你就知道"). _ 2. WebEdit("wd").Object.size="1" 步骤 2.回放,看到百度的搜索框变短了,是不是很好玩,哈哈 总结: 这一章的东西比较多,也非常的重要,可别小看这些概念,关键大家一定要实践才能真 正领悟到其中的含义。今天内容就到这里。。 讲座三  手工参数化 我一直不提倡使用录制来完成测试脚本的,建议用手工方式来编写测试脚本,因此今天首先 介绍下手工参数化 相信普通的参数化问题大家也应该都知道吧~ 如果不知道的可以去百度进行搜索有一大堆 =================== 实例 =================== 继续上次的百度实例~ Browser(“百度一下,你就知道”).Page(“百度一下,你就知道”). _ WebEdit(“wd”).Set “helloworld” --------------------------------------------------------------------------------------------------------------------- 接下来要做的就是参数化 序号 测试步骤 预期结果 1 在 datatable 中选择 ACTION1 这个 sheet 表 ACTION1 的 SHEET 表被选中 2 在 action1 这个 SHEET 中双击 A 列 弹出框输入 searchContent,点击 OK 按钮 A 列名被更改为 searchContent 3 在 searchContent 列的第一行输入 HELLOWORLD 列表显示 HELLOWORLD 4 更改脚本为读取 DATATABLE 脚本更新 5 回放 百度搜索框成功输入 helloworld 步骤 1.在 datatable 选择 ACTION1 这个 SHEET 表 步骤 2. 在 action1 这个 SHEET 中双击 A 列 弹出框输入 searchContent,点击 OK 按钮 步骤 3.在 searchContent 列的第一行输入 HELLOWORLD 步骤 4. 更改脚本为读取 DATATABLE Browser(“百度一下,你就知道”).Page(“百度一下,你就知道”). _ WebEdit(“wd”).Set datatable(“searchContent”,dtLocalSheet) 步骤 5 回放 小提示:当 datatable 的列数超过 2 列时,输入 DATATABLE( 会自动出现代码提示 ===================================================================== datatable 还有很多用法~感兴趣的可以通过 F1 查看它的所有方法 讲座四  资源池 QTP 的资源池具有可以从外部文件读取测试脚本的功能。 当我们在写完公共函数库的时候,我们就可以通过资源池来灵活的调用我们之前的函数库 下面就来介绍一下 首先我们新建一个"test.txt"文件 内容如下 function hello_world_msg(tt) msgbox tt end function function hello_world_add(a,b) msgbox a+b end function 保存在 D:/test.txt 1.我们打开 QTP,新建一个 TEST 2.选择菜单栏的 FILE-->SETTING 3.选择 RESOURCES,把刚才的 d:/test.txt 添加进资源池 4.点击 OK 点击 F7 弹出 step generator category: Function library: Library Functions 选择我们刚才写的那个函数并输入参数点击确定 QTP 就自动生成了一段代码 hello_world_add 1,2 执行一下是不是弹出 其实我们还可以使用另外一种更加快捷的方法来写这个函数 那就是使用前面一章所讲到的 COMPLETE WORD 来快速编写函数 不熟悉的朋友可以去学习 下:http://blog.csdn.net/zzxxbb112/archive/2009/08/31/4503585.aspx 选择后直接回车后,会显示相应的参数名 然后输入参数就 OK 啦。 讲座五  DOM 技术的应用 看过第二章【QTP系列讲座 2】 对象库及原理透析的朋友都应该知道 不清楚的朋友可以看这里 地址:http://blog.csdn.net/zzxxbb112/archive/2009/08/27/4489342.aspx QTP 自动化测试对象首先是从对象库获取测试对象,然后直接通过对象库对象和真实对象进 行匹配后来控制对象的~ 就是通过上面这句话我们可以对百度的搜索框进行输入内容。 但其实我还可以通过 HTML DOM 的方法来获取对象的 ID 或者 NAME 来控制我们想要的对象 ====================实例===================== 需求: 使用 DOM 技术进行自动化 1.打开百度 2.输入 helloworld 3.点击百度一下按钮 步骤: 1.对象库里添加到 PAGE 这一层 2.分别用SPY获取百度文本框和按钮的ID值 3.使用 getElementById 方法获取对象并进行操作 1. Browser("百度一下,你就知道").Page("百度一下,你就知道 ").Object.getElementById("kw").value="helloworld"Browser("百度一下,你就知道 ").Page("百度一下,你就知道").Object.getElementById("sb").click view plainprint? 4.回放结果--成功输入并点击 通过以上例子我们可以看到又有了一种新的控制对象的方法,其中控制对象有很多种 我这里就以百度搜索框输入为例,总结一下确定对象的一些方法 1.最普通的方法 1. Browser("百度一下,你就知道").Page("百度一下,你就知道 ").WebEdit("wd").Set "helloworld" view plainprint? 2.描述性编程 1. Browser("百度一下,你就知道").Page("百度一下,你就知道 ").webedit("name:=wd").Set "123" view plainprint? 3.对象自身接口 1. Browser("百度一下,你就知道").Page("百度一下,你就知道 ").WebEdit("wd").Object.value="helloworld" view plainprint? 4.DOM 技术 1. Browser("百度一下,你就知道").Page("百度一下,你就知道 ").Object.getElementById("kw").value="helloworld" view plainprint? 5.childobject 结合描述性编程循环遍历获取对象 1. '描述对象 view plainprint? 2. Set oDesc = Description.Create() 3. oDesc("micclass").Value = "WebEdit" 4. '获取 webedit 的数量 5. edit_count=Browser("百度一下,你就知道"). _ 6. Page("百度一下,你就知道").ChildObjects(oDesc).count 7. '获取子对象集合 8. set editobjects=Browser("百度一下,你就知道"). _ 9. Page("百度一下,你就知道").ChildObjects(oDesc) 10. For i=0 to edit_count-1 11. If editobjects(i).GetROProperty("name")="wd" then 12. editobjects(i).set "helloworld" 13. End If 14. Next 讲座六  利用 DotNetFactory 调用.NET 类库 自动 QTP9.X 之后,QTP 加入了强大的 DotNetFactory 这个功能,也就是能够调用.NET 类 库 首先我们看一下 F1 是怎么说明 DotNetFactory 的,我们打开 QTP 输入 DotNetFactory 后, 选中它按 F1 后 我们可以看到它的一个示例: 1. Set var_CreateInstance = DotNetFactory. _ 2. CreateInstance(“System.Windows.Forms.Form”, “System.Windows.Forms”) 3. var_CreateInstance.Show 4. wait 2 5. var_CreateInstance.Close 运行这个示例后我们可以看到一个 Form 窗口弹出来,2 秒后窗口自动关闭 接下来我来介绍两个测试中经常使用的.net 类库,一个是 System.IO.StreamWriter 类,另 一个是 System.IO.StreamReader 类 相信大家看类名也应该知道一个是写,一个是读吧~由于我们在自动化测试中经常会用到写 文件和读文件这些应用,比如写日志,读配置啊一些的。所以掌握这两个类的使用方法还是 很有用的。 接下来就通过一个例子来说明下怎么来使用这两个类。 ==================实例 1 ================== 1.打开 QTP,输入以下代码 1. ‘*********************使用.NET 类写文件************************ 2. Set oFile = DotNetFactory(“System.IO.StreamWriter”, , “d:test.txt”) 3. ‘写文件 4. oFile.Write “test report ” 5. oFile.WriteLine now 6. ‘关闭文件 7. oFile.Close 8. ‘清楚对象 9. oFile.dispose 10. Set oFile = Nothing 11. Set oEncoder = Nothing 12. 2.Set oFile = DotNetFactory(“System.IO.StreamWriter”, , “d:test.txt”) 这步代表创建一个类的对象并且赋予参数,这里的参数就是我们要写文件的文件地址 3.运行代码后,我们可以看到 D 盘里多出一个 test.txt 文件,里边有我们之前写进文件的内 容 ==================实例 2 ================== 1.写完文件之后,我们就可以进行读文件了,也是一样,保留我们之前创建的那个文件,新 建 QTPtest 写入代码 1. ‘*********************使用.NET 类读文件************************ 2. Set oFile = DotNetFactory(“System.IO.StreamReader”, , “d:test.txt”) 3. ‘读文件 4. msgbox oFile.readLine 5. ‘关闭文件 6. oFile.Close 7. ‘清楚对象 8. oFile.dispose 9. Set oFile = Nothing 10. Set oEncoder = Nothing 2.回放直接把刚才写的文件打印出来了 ============================================ 总结: 1.QTP 加入了 DotNetFactory 之后使 QTP 更加强大了,因为它不但能调用现成的.NET 类 库,而且还能调用自己写的类库 2.写文件的方法除了 DotNetFactory,还可以通过调用 COM 组件的 FSO 的方法来实现 讲座七  自定义 COM 组件的实现(一)WSC 篇 在我们自动化测试中很常用的一个东西 比如平时我们使用的 scripting.filesystemobject,wscript.shell,excel.application 等这些都是 COM 组件 但其实我们不止可以调用这些 COM 组件,其实我们还可以自己开发 COM 组件来进行调用 准备工作: 首先我们需要下载一个 WSC 向导程序:windows script component wizard(这个网上很多 大家搜索一下就有了) =============== 实例 =============== 1.下载完成后,打开程序,输入 NAME 为 zzxxbb,并选择我们要生成 WSC 文件的路径, 点 NEXT 2.这一步选择语言,我们这里就默认,点击 NEXT 3.这一步添加属性名和属性值的,也是默认,点击 NEXT 4.这一步是填写函数名和函数参数的,我们这里填入函数名:msg 参数名:content,点击 NEXT 5.一直 NEXT,最后点击 FINISH,完成 WSC 的向导,成功在对应的路径生成了 WSC 文件 6.点击确定后,找到生成的 WSC 文件双击打开后 7.对此文件中的 MSG 方法进行修改,把原来的语句注释掉,添加”msgbox content” 8.添加完保存文件并关闭,我们右键点击我们之前生成的 WSC 文件选择注册 9.注册完之后我们自己开发的 COM 组件就成功完成了并导入注册表了,接下来就可以通过 QTP 来调用它了。 10.输入以上代码之后,我们就可以成功执行刚才我们写的那个函数了,回放之后弹出消息 框 这样一个 COM 组件就已经生成并已经能够成功调用了~ 其实我们平时可以把经常需要使用的方法都注册进 COM 里,以后就可以直接使用这些方法 来调用了 总结: 1. COM 组件有很多种我们可以下载一个 VBSEDIT 进行查阅 查阅方法,打开 VBSEDIT 之后,点击菜单栏的 TOOLS–REFERENCE–ADD,打开下拉框 就全部出来了 2.自定义 COM 组件的方法不止这一种,还有一种方法通过 VB6 生成 ACTIVEX DLL 来生成 COM 组件 这个会在下一章讲解,个人比较推荐后一种 讲座八  自定义 COM 组件的实现 (二)activex dll 生成篇 在上一章我们讲到了使用 WSC 向导生成 WSC 文件来创建自定义 COM 组件,并且实现在 QTP 中的调用 今天来讲一下第二种方式,第二种方式其实说穿了就是在 VB6 里写好函数封装成 DLL 之后 生成自定义 COM 组件。 ============实例============ 准备工作:下载 VB6 网上有很多 如果实在是找不到,或者没办法下载可以邮件我,我会及时发你:zzxxbb112@163.com 1.装完之后,我们就可以开始打开 VB6 应用程序了,打开之后,选择 ActiveX DLL,点击打 开 2.进入之后我们在脚本编辑的地方写两个简单的 FUNCTION 函数 3.修改右边的工程名和类名分别为: zzxxbb 和 operator 4.点击左上角菜单栏的文件--》生成 DLL 5.生成完之后,如果你的 QTP 是 10.0 以下的话,可以使用 vbsedit 直接在里边写好代码, 然后黏贴进 QTP 因为 VBSEDIT 有代码提示,可以看到自己写的方法。 6.上图的两个方法就是我们之前写的两个方法,然后我们写入方法,并运行 运行结果为 3,成功之后就可以把我们的脚本放入 QTP 之中运行了~ 如果你是 QTP 10.0 的话,可以不用 VBSEDIT 直接在 QTP 里写就会出现提示 运行之后的结果也是一样 注意事项: 因为是本机生成的 DLL,因此本机是自动注册 DLL 的,如果是要在别人的机器上调用这个 DLL 的话首先要注册一下这个 DLL,然后就可以用了,注册方法:regsvr32 (DLL 的路径) 比 如:regsvr32 d:/zzxxbb.dll 讲座九  AutoItX 技术的应用 首先介绍一下 AutoIt : AutoIt v3 是用以编写并生成具有 BASIC 语言风格的脚本程序的免费软件,它被设计用 来在 Windows GUI(用户界面)中进行自动操作。通过它可以组合使用模拟键击、鼠标移 动和窗口/控件操作等来实现自动化任务,而这是其它语言所无法做到或尚无可靠方法实现 的(比如 VBScript 和 SendKeys)。 首先要使用 AUTOIT 肯定需要先安装它,安装文件网上很多,这里我就不提供下载地址了 ~大家可以自己百度去搜一下,安装完之后,AUTOIT会自动注册一个AUTOITX的DLL COM 组件~接下来就可以在 QTP 里编写脚本了,如果是 10.0 的话可以直接在 QTP 里编写,如 果不是就先在 VBSEDIT 里编写(原因:有代码提示) 1.在 QTP 脚本视图里输入 1. Set oAutoIt = CreateObject("AutoItX3.Control") view plainprint? 2.由于在我们安装 AUTOIT 过程中已经自动注册过了 COM,所以通过 oAutoIt 这个对象可 以点出很多方法和属性。 知道了怎么调用之后我们就可以通过一个最简单的实例来了解下 AUTOIT 究竟是一个怎么 样的东西,它能够做些什么 ================实例================= 就以飞机订票登陆为例 在 QTP 脚本视图中输入 1. '创建对象 2. Set oAutoIt = CreateObject("AutoItX3.Control") 3. '启动飞机订票 注意路径每个人的路径可能不一样 4. oAutoIt.Run "D://Program Files//HP//QuickTest Professional//samples//flight/ /app//flight4a.exe" 5. '等待登陆窗口弹出 6. oAutoIt.WinWaitActive "Login" 7. '给用户名控件发送消息:zzxxbb112 8. oAutoIt.ControlSend "Login","","Edit1","zzxxbb112" 9. '给密码控件发送消息:mercury 10. oAutoIt.ControlSend "Login","","Edit2","mercury" 11. '点击 LOGIN 按钮 12. oAutoIt.ControlClick "Login","","Button1" 13. set oAutoIt=nothing 简单的介绍一下每一步的意思 1.创建 COM 对象 1. Set oAutoIt = CreateObject("AutoItX3.Control") 2.RUN 方法 ---- 启动对应路径的应用程序,这里因为是 QTP10.0 的因此路径是在 HP 下 的。10.0 一下是在 MERCURY 下的这个可以直接查找下目标就可以了。 1. oAutoIt.Run "D://Program Files//HP//QuickTest Professional//samples//flight/ /app//flight4a.exe" 3.这一步是等待 LOGIN 窗口弹出变为当前激活窗口后,再执行后续的脚本,不然可能出现 错误 1. oAutoIt.WinWaitActive "Login" 4.用户名文本框输入 Edit1,至于为什么是 Edit1 可以使用 AutoIt v3 window info 查看,这 个东西其实就相当于 QTP 的 SPY 1. oAutoIt.ControlSend "Login","","Edit1","zzxxbb112" 5.这一步就是输入密码框和前面用户名大同小异 1. oAutoIt.ControlSend "Login","","Edit2","mercury" 6.也是可以通过 INFO 来查控件属性 1. oAutoIt.ControlClick "Login","","Button1" 7.最后释放对象 1. set oAutoIt=nothing 这样一个简单登录就完成了,我们运行一下看看,是不是自动化了。 总结: 由于 AUTOIT 对于对象识别都比较底层,特别是对 CS 识别还是不错的,因此有些时候 可以用于弥补 QTP 对象不能识别时的不足,比如在 BS 项目中可能会碰到密码控件不能识 别或者一些控件不能成功识别的,可以考虑使用 AUTOIT 的消息发送发放试试。在 AUTOIT 中还有很多实用的方法,大家可以自己去看一下,总之 AUTOIT 绝对是一款非常有用的自 动化测试辅助工具。 autoit帮助文档:http://www.dreams8.com/autoit/ 讲座十  QTP 的两种回放模式 当你在回放 QTP 的时候,你是否有注意过 QTP 在回放的时候鼠标是没有运动的 有些朋友肯定会问,既然是 CLICK 点击为什么鼠标没有动,而 QTP 回放的时候却可以成功 的点击按钮的呢 其实 QTP 是有两种回放模式的: 1. Event 模式 -- 事件跟踪 2. Mouse 模式 -- 鼠标跟踪 Event 模式就是我们平时默认用的模式,也就是事件,其实 QTP 的 click 方法只是触发了对 象的 CLICK 事件,而并未真正通过鼠标来进行点击按钮。而如果我们使用的是 Mouse 模式 的话,我们会看到回放的时候,鼠标是跟着对象走的,也就是鼠标跟踪模式。 下面我们来具体看一下是怎么切换回放模式: 切换回放模式有两种方法: a.修改 QTP OPTIONS 设置 我们进入到 TOOLS--》options--》WEB-->ADVANCED 然后列表拖到最下面可以找到 REPLAY TYPE 我们可以看到 QTP 默认的回放模式是 EVENT,也就是事件跟踪。 如果我们现在切换到 MOUSE,点击确认后,回放时鼠标就会进行跟踪,不信大家可以试一 下。 b.代码控制(个人推荐第二种) 为什么推荐这种方式,因为这种方式可以在 QTP 运行时根据我们的个性化需要来进行控制, 随时可以进行开和关 而使用第一种方式就不能够达到以上的效果。 代码: 1. Setting.WebPackage("ReplayType") = 2 这句话的意思就是把回放模式设置为 2, 1 代表事件跟踪,2 代表鼠标跟踪 很清楚了吧,这样我们就可以在 QTP 运行时个性化的定制我们的回放模式 那说到这里,肯定会有朋友问,那鼠标模式有什么用,我们平时默认的事件模式不是都够用 了吗 接下来就说一下,我们为什么要使用鼠标模式,比如触发了 CLICK 事件后,应该弹出页面 的,却被 IE 给拦截了,而手工点击可以成功;还有当我们需要操作鼠标右键的时候,等等 这些情况我们都可以临时把回放模式切换成鼠标模式 ==================实例================== 我们现在要实现右键点击 GOOGLE 主页中 GOOGLE 大全的链接 1.首先我们把这个链接对象加载到 QTP 对象库中 2.添加完之后我们输入一下脚步 1. Setting.WebPackage("ReplayType") = 2Browser("Google").Page("Google"). _ 2. Link("Google 大全").FireEvent "onclick",,,micRightBtn 3.回放之后就可以看到已经成功点击了右键 讲座十一  AOM 应用(一)QuickTest Automation 这一章的内容网上比较常见,相信很多熟悉 QTP 的朋友一定也都知道 AOM 以及熟悉它的 用法,但是为了教程的完整性,还是简单的把这一章的内容带一下,觉得已经掌握的朋友可 以直接略过。 首先介绍一下什么是 AOM AOM ---- Automation Object Model (自动化对象模型) 简单的说 AOM 就是一个可以自动化 QTP 的自动化对象模型,它可以对 QTP 的进行自动化 配置操作以及 QTP 的运行回放进行自动化等等功能。 下面就来看一个最简单的创建 AOM 的例子: 1. Dim qtApp 2. Set qtApp = CreateObject("QuickTest.Application") 3. ' 创建对象 4. qtApp.Launch 5. 'Start QuickTest 6. qtApp.Visible = True 7. ' 设置为可见 将以上代码保存为 VBS 后缀格式的文件后,双击运行即可自动启动 QTP 应用程序 以上代码只是 VBScript 的调用方式,其实我们还可以有很多种方式去调用 QTP 的 AOM VB: 1. Dim qtApp As QuickTest.Application 2. ' 申明 AOM 对象 3. Set qtApp = New QuickTest.Application 4. ' 创建 AOM 对象 5. qtApp.Launch 6. ' 启动 QTP 7. qtApp.Visible = True 8. ' 设置为可见 C# 1. QuickTest.Application app = new QuickTest.Application(); 2. // 创建 QTP 对象 3. app.Launch(); 4. // 启动 QTP 5. app.Visible =true; 6. // 让 QTP 可见 JavaScript: 1. var qtApp = new ActiveXObject("QuickTest.Application"); 2. // 创建 AOM 对象 3. qtApp.Launch(); 4. // 启动 QTP 5. qtApp.Visible = true 6. // 设置为可见 这里就引发出了一个问题,为什么那么多语言都能够调用 AOM 来自动化 QTP,这是因为 QTP 安装程序中已经注册了一个核心 DLL 文件的 COM,这个 DLL 就是在安装文件夹下的 BIN 目录下:QTObjectModel.dll 下面我们就来简单的完成一个启动 QTP--》打开脚本--》回放 这样的一个实例 我们在这里使用 VBSEDIT 工具 1、首先在这里引用 QTObjectModel.dll 引用方法: TOOLS - REFERENCES - add 在 PROG ID 中输入 QUICKTEST.APPLICATION 在 TYPELIB PATH 中找到这个 dll 的路径,位于安装路径的 BIN 目录下 2、在引用完 DLL 后,就可以创建 AOM 对象,并且会有相应的代码提示 当创建好 AOM 对象的同时也可以在对象浏览器中看到这个 DLL 下的所有方法和属性 3、完成以下代码之后,这样一个简单的从启动 QTP、打开测试脚本、运行回放、关闭 QTP 的整个自动化 QTP 的流程就完成了 1. Set qtapp=CreateObject("quicktest.application") 2. '创建对象 3. qtapp.Launch 4. '启动 5. QTPqtapp.Visible=True 6. '设置为可见 7. qtapp.Open "d:/Test" 8. '打开相应的 QTP 测试脚本 9. qtapp.Test.Run 10. '运行测试脚本 11. qtapp.Quit 12. '退出 QTP 13. Set qtapp=Nothing 14. '释放 4.当我们还需要对 QTP 的设置进行自动化时,由于 QTP 的设置较多,一个个写的话会很繁 琐,因此我们可以先在 QTP 里设置好,然后直接在 QTP 的 setting 和 option 选项中点击 generate scripting 进行导出,这样能去我们很多的精力来写代码。 注意事项: 1.执行以上代码时,系统多出一个 QTAutomationAgent.exe 的进程,此进程在运行完以上 代码后会自动关闭,但是需要注意的是,当我们在调试代码或者是做非法中止以上代码而为 能使以上代码执行到最后完毕的话,此进程不会自动关闭,这样就会导致我们第二次创建 AOM 对象时报错,因此大家如果在调试此代码时遇到“远程过程调用失败”的类似错误提示, 就可以试试 kill 掉 QTAutomationAgent.exe 这个进程,然后重新调试下代码就 ok 了。 2.如果在 QTP 直接创建 AOM 对象是会报错的,因为 QTP 只允许有一个实例对象,当我们 已经开启了一个 QTP 之后就不可以再创建另外一个 QTP 了,因此这个时候我们可以直接 使用 GETOBJECT("","quicktest.application")来对当前启动的 QTP 进行操作,当我们添加下 图脚本后,我们点击运行后当前 QTP 就会自动隐藏,运行完后自动恢复可见. 讲座十二  AOM 应用(二)Object Repository Automation 上一章我们介绍了 quicktest Automation 也就是 QTP 的自动化模型对象 今天这一章主要 讲解的是 Object Repository Automation 也就是对象库的自动化模型对象。 ORAOM ---- Object Repository automation object model (对象库自动化模型对象) Description: 就像 QTP 自动化模型对象来自动化 QTP 的操作一样,可以在 QTP 外部使用 ORAOM 中对象和对象的方法通过写脚本来完成多个对象的共享操作,而不是使用Object Repository Manager 来手工的进行操作,比如测试对象的增删改,XML 对象库的导出和导入,检索以 及复制测试对象等等。 Example: 1.在 vbsEdti 中创建 ObjectRepositoryUtil 对象 Set autoRepository = CreateObject("Mercury.ObjectRepositoryUtil") 创建完对象后可以在 OBJECT BROWSER 中查看 ORAOM 中的所有方法,如图 2.准备一个 TSR 格式的对象库文件,还是以百度为例,我们在对象库中添加一个搜索文本框 对象,两个链接对象(贴吧、知道)后并导出 TSR 文件 3.当我们保存好 TSR 文件之后,就可以使用 ORAOM 来导入 TSR 文件并对其进行操作, 代码如下: 遍历对象库找到对应的测试对象并对其进行对象名和属性名的更改 '********************* scripting by zzxxbb112 ********************* Option Explicit '强制所有变量的显式声明 DimautoRepository,TOCollection,testobject,i '声明变量 Set autoRepository = CreateObject("Mercury.ObjectRepositoryUtil") '创建 ORAOM 对象 autoRepository.Load "d:/baidu.tsr" '导入对象库文件 Set TOCollection = autoRepository.GetAllObjectsByClass("Link") '获取所有链接类的对 象集合 For i=0 To TOCollection.count-1 '遍历所有测试对象 Set testobject = TOCollection.item(i) '获取测试对象 If autoRepository.GetLogicalName(testobject) = "知 道" Then '判断对象名称为“知道” 执行一下操作 testobject.SetTOproperty "text","图 片" '更改对象库的 TEXT 属性为“图 片” autoRepository.UpdateObject testobject '更新对象 autoRepository.RenameObject testobject,"图 片" '重命名对象名称 autoRepository.Save '保存对象库 Exit For '退出循环 End If Next Set testobject = Nothing Set TOCollection = Nothing Set autoRepository = Nothing '释放所有对象 '******************************* end **************************** 注意:经本人研究,以上代码的对象释放不可省略,并且要由里向外的释放,否则会造成运 行时报错,这一点在 QTP 的帮助文档里也没有提到 执行完以上脚本之后我们重新打开之前的那个 TSR 文件可以清楚的看到之前 LINK 类 的"知 道"对象的对象名和属性名已经都被改成了"图 片",此时原来的知道对象就已经不存 在了,而图片这个对象则取代了它的位置,当我们选择图片这个对象然后点一下高亮之后, 可以清楚看到这个对象已经定位在图片链接上了 AOM 总结: 总结一下这两章的内容:AOM 的作用主要是通过 QTP 外部使用脚本语言调用其 COM 自动 化对象模型来对其工具和对象库进行自由的操作,甚至可以在我们自己的应用中调用它,从 而达到自动化工具和对象库的效果,这些都是在我们自己开发自定义测试框架的时候非常有 用的。 讲座十三  QTP IDE 中的垂直分割选取 今天这一章的内容比较简单,其实也算不上讲座了,只是一个简单的快捷操作,在很多时候 还是非常有用的哦。大家都知道在大多数开发的 IDE 中都会有一种选择标记为垂直选择 垂直分割选取 - 通过定位在文本中选取一个特定的垂直柱,并可以进行多行同时输入代码。 如下图所示: 当然 QTP 的 IDE 也不例外,同样也可以使用此功能来方便省去很多不必要的操作 ==================实例================== 1.新建一个 TEST,输入以下代码 2.现在我们可以使用垂直选取的方法轻松的对多行代码进行同时更改,首先我们要选取“垂 直柱” 方法: 在左上角点击鼠标左键往右拉一定距离不放手,与此同时我们点下鼠标右键,然后我们就可 以轻松的进行垂直段的选择了。 3.选取垂直柱之后的同时我们可以输入我们想要更改的代码,比如这里我们输入 DIM,QTP 就会同时对多行进行输入并覆盖 PUBLIC 总结: 大家可别小看这个功能,在关键时间还是能够帮我们节省很多时间的,呵呵,今天就到这里 讲座十四  揭开 QTP 的神秘面纱 (一)隐藏对象篇 大家应该都知道 QTP 是一个非常强大的自动化测试工具,而其专家试图也是相当的强 大,它不仅可以通过 VBS 调用 COM 或者调用自己写的 DLL,还可以方便的调用.NET 类进 行扩展我们的脚本,其实 QTP 还不止这些,它还有很多很多未解开的谜,本系列中会给大 家一一揭开这些神秘的面纱。 如果是一直使用 QTP 做自动化的朋友应该知道 QTP 自带有一个非常非常有用的宝贝,那 就是 F1,没错就是它的帮助文档,QTP 的帮助文档非常非常的详细,并在每个知识点上还 配有相应的例子,当我们一查就知道对象以及函数或者方法的一些用法。但是我要来讲一下 QTP 帮助文档中没有提到的一个对象。 webUtil ---- 此对象在 QTP 的帮助文档里以及对象浏览器里都是找不到的,可以说是 QTP 的一个隐藏对象 我们只需要在专家视图中输入 WEBUTIL 再加一个点,就是展开许多的方法,下图就是 webUtil 的所有方法 这个方法提供了对 COOKIE 以及证书等的一些操作,以下是 TARUN 提供的一些方法说明 大家可以看一下: WebUtil. Description : DeleteCookie : Delete specified cookie for the specified domain DeleteCookies : Delete all cookies present on the local cache GetCookies : GetCookies for a specified domain AddCookie : Add specified cookie for a specified domain 讲座十五  揭开 QTP 的神秘面纱 (二)隐藏方法篇 上一章我们介绍了 QTP 的隐藏对象,那么这一章我们来看一下 QTP 的隐藏方法 相信大多数喜欢研究 QTP 的朋友应该看过 Yaron Assa 发表的一篇文章: 《Secret Methods of QTP Objects》 在这篇文章介绍了一些 QTP 的秘密方法,这些方法在文档中也是从来没有出现过, 个别的方法也是相当实用的,如果没有看过或者有兴趣的朋友可以去看一下这篇文章,相信 一定会有收获,那今天我们主要是来讲解这些方法的来源。 查阅 QTP 隐藏方法的途径有两种: Exescope 读取 DLL 类库(方法一) <安装目录>/bin/StdPackage.dll (标准对象包) <安装目录>/bin/WWWPackage.dll (WEB 对象包) <安装目录>/bin/VbPackage.dll (VB 对象包) <安装目录>/bin/AcxPackage.dll (ActiveX 对象包) <安装目录>/bin/VoPackage.dll (虚拟对象包) 我们可以分别使用 Exescope 来打开以上以及 DLL 来查看其对象的隐藏方法,打开后在 TYPELIB 里可以查看,里边有许多 QTP 的隐藏方法 Debug Viewer 调试(方法二) QTP 本身自带的 DEBUG 功能很简单,但是当我们装完 VS2008 之后,就自动注册一个 PDM.DLL 的动态链接库,这样就使得 QTP 的 Dubug 可以在调试的时候让我们看到对象的 所有方法和属性,让 QTP 变得更为强大和健壮。 1.查看 Reporter 对象的所有隐藏方法 2.我们还可以查看 com 对象的方法,比如 WSH 3.查看 WebEdit 对象的隐藏方法,以及 OBJECT 下的展开的一些方法 总结 不管大家用哪种方法都可以查看其隐藏方法,但是使用第一种方法的朋友需要注意的 是,当我们在先打开 DLL 再打开 QTP 时,QTP 的对象识别将会失效,必须先打开 QTP 之 后再打开 DLL,因为当我们启动 QTP 时它会自动加载对应的 DLL 来进行对象的识别,因此 笔者在此还是推荐第二种方法。 讲座十六  揭开 QTP 的神秘面纱 (三)保留对象篇 相信大家都看过我的系列讲座 《自定义 COM 组件的实现 (一) wsc 篇 》,如果还没有 看过这篇文章的朋友,最好先去看下此篇文章来来学习下本讲座: http://blog.csdn.net/zzxxbb112/archive/2009/09/16/4558540.aspx Reserved Objects ---- 保留对象 所谓保留对象也就是在 QTP 内置的一些内部对象,当我们打开 F7 步骤生成器时,在 CATEGORY 选择 utility objects 之后就可以看到 这些都是 QTP 内置的一些保存对象。我们可以直接通过 F7 进行调用同样如果你对这些对 象熟悉的话也可以直接使用 COMPLETE WORD 进行调用,具体怎么在 QTP 中方便的使用 COMPLETE WORD 可以去看我写的 《QTP 中 complete word 的实现》 http://blog.csdn.net/zzxxbb112/archive/2009/08/31/4503585.aspx 今天我们就来看一下怎样在 QTP 中添加我们自定义的保留对象, 满足条件:  自定义的保留对象必须是 COM 组件,  需要添加自定义保留对象就必须更改注册表信息。 步骤: 1.我们可以先用 WSC 来创建一个自定义 COM 组件,并保证可以使用 CREATEOBJECT 进行调用 2.打开运行输入 regedit 进入注册表 找到路径: HKEY_CURRENT_USER/Software/Mercury Interactive/QuickTest Professional/MicTest/ReservedObjects/ 新建项:Zzxxbb 3.进入此项后  新建字符串值 ProgID ,数值为 COM 组件的程序 ID,这里我们输入 zzxxbb.WSC  新建字符串值 UIName ,数值为保留对象的名字,这里填写 Zzxxbb  新建 DWORD 值 VisibleMode ,数值为显示模式,这里填写表示控制自动完成可见, 这里输入 2 4.设置完之后我们就可以打开 QTP 查看我们已经自定义好的保留对象了  F7 显示结果  COMPLETE WORD 显示结果 • 智能感知结果 总结: 这一章介绍了自定义保留对象的应用,主要是通过更改注册表然后对 QTP 进行注入保 留对象,如果是第一次看的朋友,一定会感到很神奇,其实保留对象技术在国内已经有专家 先发布过了此作品,只是因为系列中涉及到此内容为了完整性所以才添加此章节进来,内容 绝对是原创,呵呵,其实 QTP 还有着很多很多未知的东西等着我们去发现和探索,如果我 们能够发挥自己的一些探索精神相信一定能找出更多的 QTP HACK 类的用法和应用。 讲座十七与十八  揭开 QTP 的神秘面纱 (四)插件开发 说明一下,插件开发篇当初是视频的形式独家发布在 E 测网站上的,但是非常不幸 E 测后 来由于某些原因已经关闭,而本人并没有对其视频进行备份,因此此模块暂缺,后期会补上。 请留意 IQuickTest 领先技术专栏的更新或者订阅 IQuickTest 随时获得最新消息。 讲座十九  重写 Reporter 对象 不知道大家有没有使用我们自定义的 REPORTER,QTP 的 reporter 非常的局限,甚 至有时感觉设计的不是很合理,其实我们完全可以通过写自定义的结果报告出来,网上其实 也有很多,不过我们今天讲座主题不是怎么设计结果报告,而是通过重写 QTP 中的 REPORTER 对象来完成自定义的结果报告。这样做的优势其实很明显,其一是能够让能够 熟练使用 REPORTER 对象的朋友继续使用他们熟悉的函数,其二是可以充分 REPORTER 对象的智能代码提示功能。省去配置自定义保留对象的麻烦. 不清楚保留对象的朋友可以去这里 : 【软件测试自动化-QTP 系列讲座 16】 == 揭开 QTP 的神秘面纱 (三)保留对象篇 == http://blog.csdn.net/zzxxbb112/archive/2009/10/26/4730948.aspx '重写自定义类 Dim Reporter Set Reporter = New clsReporter '定义可以被 ACTION 调用的 FUNCTION Public Function GetReporter Set GetReporter = Reporter End Function '类定义 Class clsReporter Dim oFileReporter Public Sub ReportEvent(iStatus, sStepName, sDetails) oFileReporter.AppendAllText "d:/hello.txt", sStepName & " - " & sDetails & " - " &Now & vbCrLf End Sub Private Sub Class_Initialize Set oFIleReporter = DotNetFactory("System.IO.File") End Sub End Class 我分别介绍一下这段脚本: 首先介绍一下 clsReporter 这个类,它主要实现的是新建一个 TXT 文件,然后在里边写入内 容,里边有一个函数名字为 ReportEvent,注意这个函数名是不能改的,因为 QTP 中 REPORTER 有一个方法也叫 ReportEvent,这样才能能够重写此函数,在类的最后还有一 个初始化类,使用的 DOTNETFACTORY 这个接口来调用.NET 类,这个类中牵涉的知识点 还是比较多的,如果看不懂我说的这些,说明你对这些知识点还不够清楚,建议可以先去以 下两篇之前出的讲座再来回头看此片文章。 【软件测试自动化-QTP 系列讲座 6】 == 利用 DotNetFactory 调用.NET 类库 == http://blog.csdn.net/zzxxbb112/archive/2009/09/14/4552095.aspx 【软件测试自动化-VBScript 基础讲座 3】== 类的组成 == http://blog.csdn.net/zzxxbb112/archive/2009/11/13/4805618.aspx Set Reporter = New clsReporter '定义可以被 ACTION 调用的 FUNCTION Public Function GetReporter Set GetReporter = Reporter End Function 创建 CLSREPORTER 这个类并返回 Reporter 对象,并通过 GETREPORTER 这个函数来 把 Reporter 对象进行返回。接着我们就可以把以上所有的代码都保存为一个 VBS 文 件, 并 通过 QTP 的 associated function libraries 把此文件加载进来,这样我们就可以直接以下代 码来直接调用此函数来达到重写 QTP 中 reporter 的方法 Dim Reporter Set Reporter = GetReporter 加载视图 脚本视图代码 结果文件 总结 Reporter 对象其实还有很多我们不为人知的秘密,很多值得我们去探索的地方,例如,通 过 VS8 后 DEBUG 引擎查到的许多隐藏方法,以及在 REPORTER 载入 HTML 文件并显示 等等。这些我会在后续的讲座中进行讲解。 讲座二十  利用函数指针重写 QTP 方法 在上一章讲座中我们已经讲解了使用类函数来重写 Reporter 方法,在这一讲座中我们主要 来讲解使用函数指针来重写 QTP 方法,在开始之前,建议大家首先完成以下两章的学习。 【软件测试自动化-QTP 系列讲座 19】 == 重写 Reporter 对象 == http://blog.csdn.net/zzxxbb112/archive/2009/11/19/4836822.aspx 【软件测试自动化-VBScript 基础讲座 5】== 函数指针 == http://blog.csdn.net/zzxxbb112/archive/2009/11/22/4853008.aspx 看完 VBS 系列第 5 章之后应该很清楚,我们可以定义一个变量通过 GetRef 将其指针指向 函数的首地址,同样我们也可以使用此方法来将 QTP 内置的函数方法的指针指向我们自定 义函数的首地址。 实例 大家都知道 QTP 的 print 方法是直接打印出 LOG,比如我们使用 print "zzxxbb112" 接下来我们就来看一段使用函数指针来重写 print 方法的实例 '定义变量 Dim print '定义函数 Function helloworld(content) msgbox content End Function '把 PRINT 的指针指向 HELLOWORLD 函数 Set print=GetRef("helloworld") '调用 HELLOWROLD 函数,此时 PRINT 方法已被重写 print "zzxxbb112" 此代码首先是定义了一个变量,变量名 PRINT,注意此处故意定义 print,这样才能重写 print 方法,接着定义个函数,很简单就一个消息框,然后通过 GetRef 把 Print 变量的指针指向 helloworld 函数,此时 QTP 原本的 print 方法已不存在了,只留下了指向 helloworld 方法的 print 方法,因此我们在执行以上代码后最终结果会执行 HELLOWORLD 方法,并弹出消息 框 总结 函数指针是非常重要的技术,在后续的讲座中介绍设计模式、命令包装以及事件处理中 都会使用到此技术。 讲座二十一  单例模式在 QTP 中的应用 在最近一次 VBS 系列讲座中的我们已经讲解了单例模式,建议没有学习的朋友先去看下此 章的内容之后再来学习本章: http://blog.csdn.net/zzxxbb112/archive/2009/11/26/4879692.aspx 上一节课程中我们讲解了单例模式在 VBS 中的应用,这一章我们来讲解下在 QTP 中的应 用,把之前的全局变量更改为环境变量来作为对象实体。调用方法还是和原来的方法一样, 代码如下: Class ExcelWrapper Private oExcelObject Private Sub Class_Initialize Dim bAleadyInit '判断对象是否存在的标志位 On Error Resume Next bAlreadyInit = IsObject(Environment("Excel_Object")) If Err.Number <> 0 Then bAlreadyInit = False '检查对象是否已经被初始化 On Error Goto 0 If bAlreadyInit = True Then If Environment("Excel_Object") is Nothing Then bAlreadyInit = False End If If bAlreadyInit = False Then Environment("Excel_Object") = CreateObject("Excel.Application") End If Set oExcelObject = Environment("Excel_Object") End Sub Private Sub Class_Terminate oExcelObject.Quit Set oExcelObject = Nothing End Sub Public Sub Open(sFileName) '写入打开文件的代码 End Sub Public Function GetSheetData(sSheet) '写如读取单元格的代码 End Sub '********等等,可以写更多方法******* End Class 总结 单例模式可以帮助我们很好的管理对象的生命周期,使用它能够更好的帮我们集中对象 的实体,从而更好的控制对象。后续会讲解更加强大的工厂设计模式来使我们的脚本变得更 加强大和健壮。 讲座二十二  描述性编程 这一章的内容较为简单,对描述性编程熟悉的朋友可以直接略过,为了教程的完整性还是把 这章的内容补上去,在学习本章之前,请先务必完成以下讲座的学习: 【软件测试自动化-QTP 系列讲座 2】 == 对象库及原理透析 == http://blog.csdn.net/zzxxbb112/archive/2009/08/27/4489342.aspx 描述性编程:我们都知道 QTP 对象的鉴别原理,在 QTP 回放时,通过脚本中对应对象库 中的对象的属性与真实测试对象的属性进行对比并且能够唯一匹配之后才能够对对象进行 操作。而描述性编程其实就是通过把对象库中的对象属性的描述全部通过脚本体现出来,并 且可以脱离对象库进行运行脚本。  描述性编程语法 systemutil.Run "C:/Program Files/Internet Explorer/IEXPLORE.EXE","http://www.baidu.com" set oBrowser=Description.Create Set oPage=Description.Create Set oEdit=Description.Create oBrowser("micClass").value = "Browser" oPage("micClass").value="Page" oEdit("name").value="wd" Browser(oBrowser).Page(oPage).WebEdit(oEdit).Set "zzxxbb112" 开启一个百度浏览器后,不需要对象库,直接运行以上脚本,通过以上的例子我们可以看到 通过把对象的属性都描述下来,运行以上脚本并可直接在搜索框进行输入,运行的原理是一 样的,只不过一个是 QTP 帮我们封装好了的对象库,而现在是我们通过把对象的属性都描 述下来从而定位对象。  字符串描述 systemutil.Run "C:/Program Files/Internet Explorer/IEXPLORE.EXE","http://www.baidu.com/" Browser("micClass:=Browser").Page("micClass:=Page").WebEdit("name:=wd").Set "zzxx bb112" 执行完后我们可以看到字符串描述和上面的普通方法效果是一样的。  遍历对象 systemutil.Run "C:/Program Files/Internet Explorer/IEXPLORE.EXE","http://www.baidu.com/gaoji/advanced.html" Set all_oEdit = Description.Create all_oEdit("micClass").value="WebEdit" Set all_oEdits = Browser("micClass:=Browser").Page("micClass:=Page").ChildObjects(all_oEdit) For i = 0 to all_oEdits.count - 1 Set oEdit = all_oEdits.item(i) oEdit.set "zzxxbb112" Next 使用此方法我们就可以通过遍历页面上所有同类型的对象并对其进行操作。  多窗口控制 以上 3 钟情况的脚本都是只能在打开一个浏览器的情况下才能正常执行,否则就会报对象 超过一个的错误,不能识别,因此当出现多窗口的情况我们可以使用 CREATIONTIME 这 个属性来做顺序的控制。 systemutil.Run "C:/Program Files/Internet Explorer/IEXPLORE.EXE" systemutil.Run "C:/Program Files/Internet Explorer/IEXPLORE.EXE" Browser("CreationTime:=0").Navigate "http://blog.csdn.net/zzxxbb112" Browser("CreationTime:=1").Navigate "http://www.baidu.com" 使用以上代码 QTP 就能够分辨出多个浏览器的情况了,当然我也可以使用 INDEX 属性, 大家可以试试。 注意:当我们使用 Browser("CreationTime:=-1")时表明当前有且仅有一个浏览器窗口,当我 们只需要一个浏览器的时候可以使用这个来作为判断依据。 buBrowser=Browser("CreationTime:=-1").Exist(0) If buBrowser Then msgbox "存在一个浏览器窗口" else msgbox "存在 0 个或者多个浏览器窗口" End If 讲座二十三  QTP 中 API 的应用 在看过之前讲座的朋友都知道,QTP 能够通过调用 COM 组件,自定义组件,.net 类使其 变得非常的强大,但其实 QTP 还能够调用 win32 API,通过对 API 的调用我们就可以对一 些最底层的东西进行一系列的操作。 Extern ---- 通过 extern.declare 来声明我们需要调用的 API 下面就来看一个简单的例子: '#######启动浏览器######## systemutil.Run "iexplore.exe" '#######创建 API extern 对象########## Extern.Declare micHWnd, "GetForegroundWindow", "user32.dll", "GetForegroundWindow" '######使用 WIN32 API 获取窗口的句柄###### hwnd = Extern.GetForegroundWindow() '########通过获取的句柄控制浏览器窗口并跳转百度##### Browser("hwnd:=" & hwnd).Navigate "http://www.baidu.com" 通过执行以上脚本我们可以看到在启动浏览器之后,调用获取窗口句柄的 API 方法,并成 功调用浏览器跳转百度首页。 在此做个小提示 大家在使用 API 的时候如果对语法不是很熟悉,推荐大家使用 QTP 大师 TARUN 开发的 VB API to QTP API 的一个工具,此工具很方便,可以直接把 VB 的 API 代码转换成 QTP api 的代码。 下载地址: http://download.csdn.net/source/1890044 下载完成之后直接把 VB 调用 API 的代码粘贴到上方,然后点击下转换按钮后下方会自动生 成 QTP api 的代码,很方便,生成完成后就可以直接复制黏贴到 QTP 中使用了。 讲座二十四  创建保留对象的会话实例 在上一章我们已经介绍了 win32 api 在 QTP 中的应用,其实主要使用了 QTP 中 EXTERN 的这个对象,,但其实当我们使用 EXTERN 对象时会暴露出一个问题,EXTERN 是 QTP 的保留对象,当 QTP 被打开时,EXTERN 这个对象只会被实例化一次,并一直持续下去。 但是当我们在开发测试脚本的时候,经常会把一些 DLL 中的方法传递到 EXTERN 中,而当 我们重新修改其中的方法或者 DLL 时,EXTERN 对象有时会出现不能及时获得改动之后的 一些方法,或者及时收到 DLL 的传递信息。有时候可能需要重启 QTP 才能生效,因此这里 提供出了一个很好的方法,通过创建我们自己的 EXTERN 对象实例,而不是 QTP 启动时 创建的 EXTERN,当我们需要更改 EXTERN 对象的声明时,只需要重新运行我们的脚本, 创建方法 mercury.externObj ---- 用于创建 EXTERN 对象 '#######启动浏览器######## systemutil.Run "iexplore.exe" '#######创建 API extern 对象########## Set myExtern = createobject("mercury.externObj") myExtern.Declare micHWnd, "GetForegroundWindow", "user32.dll", "GetForegroundWindow" '######使用 WIN32 API 获取窗口的句柄###### hwnd = myExtern.GetForegroundWindow() '########通过获取的句柄控制浏览器窗口并跳转百度##### Browser("hwnd:=" & hwnd).Navigate "http://www.baidu.com" '############释放对象实例######## Set myExtern = nothing 通过以上代码我们可以看到,我们是通过创建自己的一个 myExtern 对象,一样可以调用 API,那么大家肯定要问 mercury.externObj 这个值是怎么获取的呢?接下来我们就来看一 下: 1.首先我们运行注册表 2.进入到 HKEY_CURRENT_USER/SOFTWARE/MERCURY INTERACTIVE/QUICKTEST PROFESSIONAL/MICTEST/RESERVEDOBJECTS/EXTERN 下的 PROGID 这个注册表目录就是存放保留对象的路径,看过保留对象那章的朋友应该很熟悉,没有看过 的朋友可以直接去这个: http://blog.csdn.net/zzxxbb112/archive/2009/10/26/4730948.aspx 讲座二十五  重载页面后 Web 对象的重用 这一章主要来讲解下页面同步和对象同步后重用失败的问题,我们在测试中经常会出现在两 个页面中的使用同一个对象,出现这样的情况我们一定是使用同一个对象来处理,这样才不 会出现重复对象,就比如我们使用百度搜索,当我们打开百度时有一个搜索框,在输入一些 内容提交后,页面会重载并且搜索框这个对象仍然存在,这个时候如果我们需要再次控制搜 索框这个对象我们一定会想到直接使用之前对象库里的那个搜索框对象,因为它们其实就是 同一个对象。接下来我们一步步来进行操作和讲解。来看下面的例子,我们需要实现的是在 输入搜索内容后点击提交后页面跳转完成继续对搜索框进行输入。 systemutil.Run "iexplore.exe" Set oBrowser = Browser("micClass:=Browser") Set oEdit = oBrowser.Page("micClass:=Page").WebEdit("name:=wd","index:=0") oBrowser.Navigate "www.baidu.com" With oEdit .Set "zzxxbb112" .Submit End With oEdit.Set "http://blog.csdn.net/zzxxbb112" 我们可以看到在运行以上脚本后,QTP 首先是输入搜索内容然后提交,在提交的瞬间也就 是页面还有跳转完成时就提前输入了另一个值,而这并不是我们想要的效果,我们需要的是 等页面跳转完成之后再输入另一个搜索内容。解决这个问题的办法是添加同步函数 sync。 systemutil.Run "iexplore.exe" Set oBrowser = Browser("micClass:=Browser") Set oEdit = oBrowser.Page("micClass:=Page").WebEdit("name:=wd","index:=0") oBrowser.Navigate "www.baidu.com" With oEdit .Set "zzxxbb112" .Submit End With oBrowser.Sync '使页面加载完成之后再进行输入搜索内容 oEdit.Set "http://blog.csdn.net/zzxxbb112" 在添加完红色字体部分的同步之后,QTP 就会等待页面缓冲完成之后,才 0 对搜索框进行 输入操作,但是问题又来了,我们运行以上脚本后却碰到了另一个问题。QTP 无法对重载 页面后的搜索框对象进行操作,但其实他们是一个对象。 这个问题的原因其实是因为当页面同步完成时,测试对象还没有被同步,因此导致我们无法 对其进行操作,而报出了以上的错误。不过幸好 QTP 提供了一个方法可以解决此问题. systemutil.Run "iexplore.exe" Set oBrowser = Browser("micClass:=Browser") Set oEdit = oBrowser.Page("micClass:=Page").WebEdit("name:=wd","index:=0") oBrowser.Navigate "www.baidu.com" With oEdit .Set "zzxxbb112" .Submit End With oBrowser.Sync oEdit.init oEdit.Set "http://blog.csdn.net/zzxxbb112" 执行以上脚本后成功做到了在 WEB 页面加载后对象的复用。 obj.init ---- 此方法为 QTP 的隐藏方法,在帮助文档中都没有任何的介绍,用于重新同步 页面上的测试对象。我们可以通过使用 VS2008 改装过的 DEBUG 引擎来查看此方法。 如果不清楚的朋友可以去看我写的隐藏方法篇: 揭开 QTP 的神秘面纱 (二)隐藏方法篇: http://blog.csdn.net/zzxxbb112/archive/2009/10/21/4710619.aspx 讲座二十六  保留对象 XmlUtil 的应用 我们都知道 QTP 内置很多实用的保留对象,例如 Systemutil,Reporter,dotnetfactory, extern 等等。 进入 QTP 后,点击 F7 我们就可以看到上图展示的所有非隐藏的保留对象,那么今天我们 主要来看一下最后一个 XMLUTIL 这个对象。 XMLUtil ---- 能够对 XML 进行方便操作的一个保留对象 首先我们来看一个例子,创建一个 XML 文件 '创建 XML 对象 Set doc = XMLUtil.CreateXML() '创建根节点 doc.CreateDocument "Variable" '获取根节点 Set root = doc.GetRootElement() '添加子节点极其值 root.AddChildElementByName "name","Quicktest" root.AddChildElementByName "value", "zzxxbb112" '保存 XML 文件 doc.SaveFile "d:/test.xml" Set root = nothing Set doc = nothing 执行以上代码后,我们可以看到在 D 盘中生成了一个 TEST.XML 文件,我们打开它之后可 以看到如下图的内容,这样一个简单的创建 XML 文件我们就完成了。 接着上面的步骤我们还可以使用此对象对 XML 进行修改 '创建对象 Set doc = XMLUtil.CreateXML '设置路径 xmlPath="d:/test.xml" '导入 xml 文件 doc.LoadFile xmlPath '定位节点路径 set element = doc.ChildElementsByPath("/Variable/name") '修改前的值 msgbox element.Item(1).Value '修改值 element.Item(1).SetValue "qtp" '修改后的值 msgbox element.Item(1).Value '保存文件 doc.SaveFile xmlPath '释放 Set element=nothing Set doc=nothing 执行完毕之后,我们可以看到 XML 文件中的内容被成功修改。 如下图,此对象还有很多的方法供我们使用,读者可以自行进行尝试 虽然这些方法在 QTP 的帮助文档中都没有提及到,但是我们可以通过方法名来大致了解其 方法的作用。 讲座二十七  ArrayList 数组类在 DotnetFactory 中的应用 很久没有来更新博客了,主要原因还是由于还是由于 CSDN 博客无法上传图片,而看惯我 博客的朋友应该都知道我的博客一向是有图文解说的,就像做数学题一样,需要数形结合。 今天我实在忍不住了还是要爬上来写一篇,博客内容由于不能上传图片,因此特地挑了这个 比较简单的主题,呵呵,不废话了,进入正题,会点 VBS 的朋友应该都知道 VBS 中的数组 是使用 ARRAY 或者 DIM 申明后进行初始化来创建的,来看如下脚本 Array 函数创建 person = array("zxb001","zxb002","zxb003") For i=0 To UBound(person) MsgBox person(i) Next Dim 申明创建 Dim person(2) person(0)="zxb001" person(1)="zxb002" person(2)="zxb003" For i=0 To UBound(person) MsgBox person(i) Next 其实除了以上两种方法外还有很多种方法,我们可以使用字典对象,也可以使用容器对象, 这里我们主要讲解 DOTNETFACTORY 中的 System.Collections.ArrayList 类,接下来看例 子: Set MyList = DotnetFactory.CreateInstance("System.Collections.ArrayList") With myList .Add("zxb001") .Add("zxb002") .Add("zxb003") .Add("zxb004") .Add("zxb005") End With For i = 0 To MyList.Count -1 MsgBox MyList.Item(i) Next Set MyList = nothing 同样此方法也可以使用 CREATEOBJECT 来创建 Set MyList=CreateObject("System.Collections.ArrayList") With myList .Add("zxb001") .Add("zxb002") .Add("zxb003") .Add("zxb004") .Add("zxb005") End With For i = 0 To MyList.Count-1 MsgBox MyList.Item(i) Next Set MyList = nothing 以下是 ArrayList 的所有方法,有兴趣的朋友可以试试 Add – adds an item in an arraylist MyList.Add(”ListItem”) Remove – removes an item from the arraylist MyList.Remove(”ListItem “) RemoveAt – removes an item from the specified position in the arraylist MyList.RemoveAt(3) Insert – Inserts an item at a specified position in the arraylist MyList.Insert(3,”ListItem”) Sort – Sorts items in the arraylist MyList.Sort 讲座二十八  正则表达式的应用 正则表达式相信很多朋友都不陌生,它是一个非常常用的技术,不管是在什么语言中,今天 我们就来看一下 QTP 中正则表达式的应用。 描述性编程的应用 1. systemutil.Run "iexplore.exe","www.baidu.com" 2. Browser("title:=.*").Page("name:=.*").WebEdit("name:=wd").Set "zzxxbb112" 当我们在使用描述性编程时,我们可以使用正则来代替长标题 VBS 中 REGEXP 的应用 在 VBS 中有一个叫 REGEXP 的类,它提供了简单的正则支持 1. Function RegExpTest(patrn, strng) 2. Dim regEx, Match, Matches ' Create variable. 3. Set regEx = New RegExp ' Create a regular expression. 4. regEx.Pattern = patrn ' Set pattern. 5. regEx.IgnoreCase = True ' Set case insensitivity. 6. regEx.Global = True ' Set global applicability. 7. Set Matches = regEx.Execute(strng) ' Execute search. 8. For Each Match in Matches ' Iterate Matches collection. 9. RetStr = RetStr & "Match found at position " 10. RetStr = RetStr & Match.FirstIndex & ". Match Value is '" 11. RetStr = RetStr & Match.Value & "'." & vbCRLF 12. Next 13. RegExpTest = RetStr 14. End Function 15. MsgBox(RegExpTest("is.", "IS1 is2 IS3 is4")) 以上脚本是 F1 中提供的 regexp 的一个例子,非常经典! 隐藏保留对象 micRegExpMatch 1. micRegExpMatch.Initialize "t.*" 2. msgbox micRegExpMatch.Compare("test") 执行以上代码我们可以看到弹出了 TRUE 的消息框,说明代码没问题。接下来重点说一下 此对象的来源,此对象是 QTP 中的一个隐藏的保留对象,在 QTP 的帮助文档也没有任何 的说明,这里简单介绍一下。 首先我们打开注册表,运行 regedit,进入到 HKEY_LOCAL_MACHINE –> SOFTWARE –> MERCURY INTERACTIVE –> QUICKTEST APPLICATION –> MICTEST –> RESERVEDOBJECTS 这个保留对象目录下,在这个目录中我们可以看到所有 QTP 的保 留对象。 我们可以看到 micRegExpMatch 这个对象中的 PROGID 为 mercury.CompareRegExp,接着 我们试试在 VBS 里创建一下此对象 Initialize 方法是我们需要初始化的正则表达 Compare 主要是我们需要比较的字符串,并返回比较的状态,代码如下 1. Set rege = CreateObject("mercury.compareregexp") 2. rege.Initialize "t.*" 3. MsgBox rege.Compare ("test") 如果我们直接在 VBS 里运行此代码,会报错“找不到指定模块” 这主要是因为此对象是 QTP 独用的保留对象,不能在外部使用,因此我们只能把代码黏贴 到 QTP 中执行,这样就不会出现以上的错误情况。这样就和之前的最先前的脚本达到了相 同的效果。 注意事项: 建议大家在使用此对象时,尽量自己创建此对象的实例,而不要去用 QTP 隐藏的 micRegExpMatch 对象实例,因为一方面自己创建可以任意起对象名,另一个方面可以有 代码提示,若直接使用 micRegExpMatch 是没有代码提示,点不出任何效果,大家可以试 试(10.0 中代码提示才有效) 讲座二十九  捕获对象时的模式切换 这一章主要是讲解当我们在使用 QTP 去抓去对象或者使用 SPY 去查看对象时的一种模式 切换,可不要小看了这个模式,在有些时候它可是能够帮上我们很大的忙,简单的举个例子, 还是拿百度为例(每次都拿百度为例,是因为大家基本都上百度,申明我不是百度的,呵呵), 当我们打开百度进入到百度首页时,我们自然而然会发现有个搜索框,废话。。但是从 09 年开始大家有没有发现此搜索框有了一定的变化,没错就是 AJAX 的模糊匹配下拉框(这方 面 GOOGLE 比百度领先有一段时间了),那么今天主要讲的就是它了。 AJAX 的模糊匹配 比如我们在搜索框中输一个 quicktest 在上图我们可以看到在此搜索框下面会自动出现一些模糊匹配 quicktest 的一些关键词 那如果我们需要在这块做自动化的话我就需要首先抓取这些对象,这样我们可以试着先使用 SPY 抓去下,但是当你在抓去这些对象的时候你会非常的郁闷,因为你根本无法抓去到上 面的对象,一旦点了 SPY 上的手指那个下拉匹配框就会消失,这样就造成了我们无法正常 的去获取到我们需要获取的对象,结果就是坐着发呆,没有任何办法。而此时我今天需要讲 的模式切换就起到了决定性的作用,目前的关键就在于当我们输入 quicktest 之后一旦切换 了窗口再切回来模糊匹配下拉框就必定会消失,因此我们可以不切换百度窗口而直接获取, 这就是模式切换的优势,接下来我们来详细讲解下模式。 当我们使用 SPY 或者对象库抓去对象时,一旦点了手指就只能抓去对象而无法进行任何的 操作,但其实当我们在点了手指之后我们是可以进行两种模式的切换操作,切换后可以停止 对象的抓取,并可以对被测对象进行操作。 半操作模式 ---- CTRL 键 支持鼠标点击 全操作模式 ---- CTRL+ALT 键 支持鼠标点击和键盘输入 半操作模式: 打开百度后,使用 spy 点击手指后,我们可以看到鼠标是手指状态,也就是抓去对象的 状态,此时是不可以做任何操作,只能抓取对象,而当我们按住 CTRL 键不要松开,此时 我们可以做鼠标点击动作,同时鼠标也从手指变成了原本的箭头鼠标,当我们放开 CTRL 键时,我们可以看到鼠标又从箭头恢复到了手指,也就是说恢复了抓取对象的模式。 全操作模式: 全操作模式就是支持任何操作,包括鼠标点击和键盘输入,当我们在抓取对象模式的情 况下按住 CTRL 不放再按下 ALT,然后先松开 CTRL,再松开 ALT,此时我们就已经成功 切换成全操作模式了,这样我们就可以在搜索框中进行输入操作了,我们这里就输入 quicktest,输入后百度搜索框会弹出模糊匹配下拉框,这时我们可以通过点击 CTRL 键, 然后松开就可以切换回抓取对象模式,同时模糊匹配下拉框也不会消失,这样我们就可以成 功对起模糊匹配下拉框对象进行抓取了,有了它就是再狡猾的对象也照样被我们一网打尽, 哈哈。 讲座三十  XML 联合 XSL 输出 html 报表 在讲这一章之前,我首先要介绍一下 XSL 是什么. XSL -- 简单的说就是一个模版文件,他可以和 HTML 中的标记一起使用并用来设置格式 在大致了解了 XSL 后,我们就可以开始这一章的内容,首先大家都知道平时当我们跑完 QTP 脚本后,QTP 都会生成一个 test results 在这个结果页面里我们可以进入 FILE-->EXPORT REPORT 这里有一个文件类型,我们就选择 HTML,然后在 EXPORT FORMAT 这里我们就暂时先 不管,先选择 short,然后我 们点击 OK,就可以生成一份非常漂亮的根据这个 REPORT 转 化的 HTML 文档,但是如果每个脚本都这样导出会显得十分麻烦,因此我们需要想办法把 这一步骤进行自动化,方法有两种: 修改注册表 如果 QTP 是 9.2 版本的话可以直接修改注册表里的值 进入 HKLM->SOFTWARE->Mercury Interactive->QuickTest Professional->Logger->Media->Log 把 ACTIVE 的属性改成 1,默认为 0 关闭注册表,重新运行脚本后,我们就可以在脚本文件夹里找到 HTML 格式的结果文件 使用 XSL 模版文件联合 XML 结果文件输出 HTML 这个方法是我们今天需要讲的重点,首先我们进入到 QTP 安装路径下的 DAT 目录,我们 可以看到这两个 XSL 文件,是不是很眼熟,没错,就是我们刚才在做导出 HTML 时的 EXPORT FORMAT 栏中的两种导出方式,最后一项是自定义 XSL 导出方式,其实 QTP 的 这两种导出方式就是依靠这两个 XSL 的模版文件。 接下来这段脚本是我在 SQA 上找到的一段代码,我把它拿来并进行了改写,加入了对中文 的支持,原来 HTML 都是不支持中文的,显示时直接是乱码,这里我直接用了 REPLACE 替代函数来把字符集更换成了 GB2312,这样我们生成的 HTML 就可以显示中文了。 view plainprint? 1. 'QTP 的结果文件 RES 中的 XML 文件 2. sResultsXML = "C:/Documents and Settings/Administrator/桌面 /Test1/Res3/Report/Results.xml" 3. 4. '需要的模版文件 XSL 5. sDetailedXSL = "D:/Program Files/HP/QuickTest Professional/dat/PDetails.xsl" 6. 7. '调用转换函数输出 HTML 8. ApplyXSL sResultsXML, sDetailedXSL, "c:/tt.html" 9. 10. '转换函数 11. Public Function ApplyXSL(ByVal inputXML, ByVal inputXSL, ByVal outputFile) 12. sXMLLib = "MSXML.DOMDocument" 13. Set xmlDoc = CreateObject(sXMLLib) 14. Set xslDoc = CreateObject(sXMLLib) 15. 16. xmlDoc.async = False 17. xslDoc.async = False 18. 19. xslDoc.load inputXSL 20. xmlDoc.load inputXML 21. 22. outputText = xmlDoc.transformNode(xslDoc.documentElement) 23. outputText=replace(outputText,"UTF-16","gb2312") 24. Set FSO = CreateObject("Scripting.FileSystemObject") 25. Set outFile = FSO.CreateTextFile(outputFile,True) 26. outFile.Write outputText 27. outFile.Close 28. 29. Set outFile = Nothing 30. Set FSO = Nothing 31. Set xmlDoc = Nothing 32. Set xslDoc = Nothing 33. Set xmlResults = Nothing 34. End Function 初始化响应的参数并运行以上代码后,我们可以看到在 C 盘中有个 tt.html,先不急着打开, 我们先把 DAT 目录下的 Presults.css 文件拷贝到 tt.html 的同级目录下,然后我们就可以打 开了,看~~是不是很漂亮 总结: 其实我们如果对 XSL 熟悉的话,完全可以自己写一个自定义的模版出来,并通过此文件 来生成我们自己想要的 HTML 格式,我们可以看到在 QTP 自带的这两个 xsl 文件中都有导 入另一个 PStringTable.xsl 文件,此文件就是储存我们运行完成的 QTP 结果的参数值的,感 兴趣的朋友可以自己研究一下~尝试来做一个属于你自己的 REPORT. Pshort.xsl 中的导入 PStringTable.xsl • PStringTable.xsl 中的一些常用参数值 讲座三十一  管理动态保留对象的隐藏组件 看过我之前讲座的朋友一定对保留对象有一定的了解了,甚至可以说能够熟练应用的,还没 有理解保留对象的朋友,可以进入以下几个链接了解下什么是保留对象。 【软件测试自动化-QTP 系列讲座 16】 == 揭开 QTP 的神秘面纱 (三)保留对象篇 == http://blog.csdn.net/zzxxbb112/archive/2009/10/26/4730948.aspx 【软件测试自动化-QTP 系列讲座 24】 == 创建保留对象的会话实例 == http://blog.csdn.net/zzxxbb112/archive/2009/12/14/5003287.aspx 【软件测试自动化-QTP 系列讲座 26】==保留对象 XmlUtil 的应用 == http://blog.csdn.net/zzxxbb112/archive/2009/12/28/5090247.aspx 今天这一讲主要是来讲解一下如何使用 QTP 的隐藏组件来管理我们需要自定义的保留对 象 Mercury.ReservedObjectManager ---- 管理保留对象的 COM 组件 此组件名大家应该都比较陌生,没关系,我们可以先通过 VBSEDIT 来查看一下此组件下的 方法和属性,首先我们在 VBSEDIT 创建此 COM 组件,创建方式如下: 1. Set mRom = CreateObject( "Mercury.ReservedObjectManager" ) 创建完毕之后我们可以在 object Browser 里看到此对象的所有方法和属性 接下来我们就可以试用一下此对象,看看这些方法究竟是怎么用的。 当我们在对象后加上点时,出现了代码提示,所有方法都显示出来了。 那么我们现在要做的就是如何去运用此组件。 老规矩,上实例 实例: 添加对象 1. Option Explicit 2. Dim mRom,progId 3. Set mRom=CreateObject("Mercury.ReservedObjectManager") 4. With mRom 5. .AddObject "oWsh","","wscript.shell" 6. .AddObject "oDic","","scripting.dictionary" 7. .AddObject "oFso","","scripting.filesystemobject" 8. End With 使用对象 1. progId=mRom.GetProgID("oWsh") 2. mRom.Item("oWsh").popup progId 销毁对象 1. mRom.RemoveObject("oWsh") 2. Set mRom = nothing 运行时,脚本会首先通过获取对象然后返回此对象的 progid,接着通过 wsh 对象的 POPUP 方法把其通过消息框的方式打印出来。 注意:此代码必须在 QTP 中执行,直接在 VBS 里执行会报找不到指定模块 总结: 通过此组件,我们可以在运行时动态的加载我们需要的自定义保留对象,并进行封装使用. 优点: 1.动态加载 2.随时销毁 缺点: 1.代码提示残废 Notes: 好了,说了那么多,大家应该也已经对此组件的用法和概念都已经学会了,那么大家一定想 知道我是怎么知道这个隐藏组件的吧 哈哈,答案其实还是在 regedit。 大家可以进入到 HKEY_CURRENT_USER -> SOFTWARE -> MERCURY INTERACTIVE -> QUICKTEST PROFESSIONAL -> MICTEST 目录下找到对应的键和键值 讲座三十二  对象封装属性的真正源头 看过我第二章讲座的朋友应该都明白什么是封装属性,以及封装属性与接口属性的区别 【软件测试自动化-QTP 系列讲座 2】 == 对象库及原理透析 == http://blog.csdn.net/zzxxbb112/archive/2009/08/27/4489342.aspx 大家都知道,我们平时需要查看对象的封装属性可以打开 spy,然后选择我们需要查看的对 象,SPY 中即会显示出此对象的属性。 图中我们可以看到在 identification properties 下有很多属性,这些属性就是 QTP 的自己 封装的一些属性。同时这些属性我们可以通过 GetROProperty 方法进行访问。 msgbox Browser("百度一下,你就知道").Page("百度一下,你就知道"). _ WebEdit("wd").GetROProperty("name") 这里我们访问一下 NAME 属性,我们可以看到它的值为 wd 然后我们执行下脚本,会弹出以下对话框 那既然在 SPY 中所有的属性都能访问,那我们再来看一个脚本 msgbox Browser("百度一下,你就知道").Page("百度一下,你就知道"). _ WebEdit("wd").GetROProperty("Class Name") 访问下 Class Name 属性看看是不是能够获得值:WebEdit 执行完脚本后我们可以看到弹出的内容为空。这是为什么? 其实因为 QTP 封装此属性的名称不是这个,其实应该是 micClass msgbox Browser("百度一下,你就知道").Page("百度一下,你就知道"). _ WebEdit("wd").GetROProperty("micclass") 执行以上语句就可以得到我们想要的结果 那大家肯定会问为什么是 micClass,而不是 Class Name 呢? 别急,答案很快就会告诉大家~ 首先我们打开注册表运行 regedit 进入到 HKEY_CURRENT_USER -> software -> Mercury Interactive -> QuickTest Professional -> MicTest -> Attributes 这个目录下,当我们展开 Attributes 这个目录时我们会看到很多我们熟悉的属性,没错这 里面包含了所有的 QTP 的封装属性。 在此目录下我们可以找到 micClass 属性,而 Class Name 属性是没有的,所以刚才我们 打印出来是空的就是这个原因。 还有很多 QTP 隐藏的属性,并且一部分属性在 QTP 的所有帮助文档中都没有提到。 这里我们就随便找一个 QTP spy 中没有的属性来试试,我们这里以 source_index 为例 index = Browser("百度一下,你就知道"). _ Page("百度一下,你就知道").WebEdit("wd"). _ GetROProperty("source_index") Browser("百度一下,你就知道").Page("百度一下,你就知道"). _ WebEdit("source_index:=" & index).Set "zzxxbb112" 执行以上脚本我们可以看到百度搜索框成功输入了 zzxxbb112,原理主要是通过 source_index 获取对象的索引,并通过描述此属性并成功对此对象进行控制。在这个目录 下我们还可以看到一些平时我们所常用一些隐藏属性,例如 creationtime,index 等,还 有很多我们从来没有看到过的属性,有兴趣的朋友可以一个个试试。 注意: 每个属性都是有对应的对象的,比如 creationtime 属性只能用在 Browser 对象上,这 点是需要大家注意的。 讲座三十三  环境变量的动态生成与秘密加载 环境变量相信大家都很熟悉,使用环境可以储存一些变量,这些变量可以储存在外部数据文 件中,并且可以让我们在每个脚本中都能访问,至于一些基础的静态使用方法这里就不做多 介绍了,看下 QTP 的帮助文档很简单就可以学会了,今天主要讲的是关于环境变量的动态 生成,以及动态加载以及加载的两种文件类型。 动态生成 ---- 使用 FSO 把我们需要的变量动态的写入一个 XML 文件 这边主要是通过两个函数: 第一个函数 getVariable 是可以让我们添加环境变量并通过指针变量进行迭代增加, 第二个函数 generateEnvFile 是根据指针变量生成环境变量 XML 文件。 1. '************************** 初始化环境变量 ****************************** 2. 3. getVariable allEnvVar,"url","http://www.baidu.com" 4. getVariable allEnvVar,"username","zzxxbb112" 5. getVariable allEnvVar,"password","passwd" 6. 7. '******************** 生成外部环境变量 XML 文件 **************************** 8. 9. generateEnvFile "d:/test.xml",allEnvVar 10. 11. '******************************************************************** 12. 'Description:获取所有环境变量字符串 13. 'Parameters:XmlVar(指针变量,环境变量字符),arName(环境变量名),varValue(环境变量 值), 14. 'Return Value:无 15. '******************************************************************** 16. Function getVariable(byRef xmlVar,byVal varName,byVal varValue) 17. xmlVar = xmlVar + _ 18. "" + vbCrLf + _ 19. "" + varName + "" + vbCrLf + _ 20. "" + varValue + "" + vbCrLf + _ 21. "" + vbCrLf 22. End Function 23. 24. 25. '******************************************************************** 26. 'Description:生成环境变量 XML 文件 27. 'Parameters:envPathName(路径名),getVar(获取的环境变量字符) 28. 'Return Value:无 29. '******************************************************************** 30. Function generateEnvFile(envPathName,getVar) 31. envStream = _ 32. "" + vbCrLf + _ 33. getVar + _ 34. "" 35. Set fso = CreateObject("scripting.filesystemobject") 36. Set envStreamFile = fso.CreateTextFile(envPathName) 37. envStreamFile.Write envStream 38. Set envStreamFile = Nothing 39. Set fso = Nothing 40. End Function 执行完以上脚本后我们可以看到在我们的 D 盘里自动生成了一个 XML 文件,接着我们就可 以使用动态加载把环境变量加载到 QTP 中。 动态加载 - 使用 Environment.LoadFromFile 方法把环境变量文件动态的加载到 QTP 中 1. '*********动态加载环境变量************* 2. Environment.LoadFromFile "d:/1.xml" Notes: 动态加载可以有两种文件类型: [*.xml] 和 [*.ini] 静态只能加载一种文件类型: [*.xml] 最早在 QTP 5.X 和 6.X 的时候 QTP 是使用 INI 文件作为外部环境变量来使用的,到了后来 8.0 以后开始就使用了 XML 的形式来储存,因此静态的加载方式已经被屏蔽了,但是动态 加载还是可以使用 INI 文件来在加载,不过文件必须遵循一定的格式. 1. [Environment] 2. username = zzxxbb112 3. passwd = 111111 以下是动态加载 INI 文件运行时的结果图: 而如果使用静态加载的方式,则会报文件类型错误,因此如果想要使用 INI 文件,就必须使 用动态加载的方式 讲座三十四  访问对象自身接口的特殊渠道 看过我第 2 章讲座的朋友,都应该知道对象自身接口的概念,我们可以通过对象.object 来 访问对象的自身接口属性。 例如: 1. msgbox Browser("百度一下,你就知道").Page("百度一下,你就知道"). _ 2. WebEdit("wd").Object.value 这是在我第 2 章讲座里讲的一个修改百度搜索框自身属性的一个例子。 没看过的朋友可以先去学习下第 2 章的基础知识: 传送门:http://blog.csdn.net/zzxxbb112/archive/2009/08/27/4489342.aspx 而今天我们主要来讲一下另一种访问对象自身接口的技巧,就是通过 QTP 封装函数来获取, 且此技巧非常实用。 方法: "attribute/自身属性名" 使用以上方法,我们就可以通过 QTP 封装的方法来访问其自身接口了,而不用再使用 OBJECT 来获取。此方法可以结合很多 QTP 的方法进行使用,并且可以发挥出很强大的作用。 1. 结合 GetROProperty 使用 获取自身接口属性 START 的值 1. msgbox Browser("百度一下,你就知道").Page("百度一下,你就知道"). _ 2. WebEdit("wd").GetROProperty("attribute/Start") 使用此法可以获取自身接口的 START 属性 2. 结合 CheckProperty 使用 验证自身接口属性 START 的值是否正确 1. Browser("百度一下,你就知道").Page("百度一下,你就知道"). _ 2. WebEdit("wd").CheckProperty _ 3. "attribute/Start","fileopen",2 使用此法可以验证自身接口的属性,避免了再使用.object 来获取并进行判断的麻烦。 3. 结合 WaitProperty 使用 1. Browser("百度一下,你就知道").WaitProperty "attribute/ReadyState","4" 个人感觉与此方法结合是最实用的。大家都知道 QTP 的这三个方法都是 QTP 封装的方法, 而这些方法都只能支持 QTP 封装的属性,而自身接口属性是不能使用此方法进行访问的, 这样如果我们需要使用 WAITPROPERTY 方法去等待自身属性就会束手无策,此时使用 attribute 进行转化就可以轻松完成我们的需求。 讲座三十五  基于类和函数的 complete Word 看过之前讲座的朋友应该记得,QTP 可以使用 CTRL + SPACE 的快捷键来激活 complete Word 功能,从而增强脚本的编写效率,而此方法只能对于 vbs 函数进行智能提示,而对于 类是不支持的。而今天主要来讲一下,QTP 的一个支持类的 COMPLETE WORD。 方法很简单: Alt + . (alt 键加点键组合) view plainprint? 1. class libClass 2. function libFunction 3. msgbox "libfunction" 4. end function 5. end class 使用快捷键 alt + . 进行激活 怎么样还不快去试试。 经测试: QTP 9.2 可以使用,10.0 版本貌似不行,大家可以试试 讲座三十六  自定义验证点-HTML 模式 很久没更新了,最近事情实在是太多,这两天稍微空点,终于能挤出时间来更新了,今天要 讲的是自定义过程校验,内容比较特别,正常情况我们都知道,自定义报告的话我们可以直 接使用 Report 对象,而当我们在使用验证点时经常会用到 Checkproperty,执行它之后 QTP 会自动在 report 里生成一条验证结果。以上的我就不说了,相信大家一定都非常精通了。 今天主要是讲一下怎么结合验证点在 QTPreport 中输出 HTML 格式的结果。 废话不说,上例子: 上图就是我们需要实现的最终结果。来看一下脚本的实现: 1. 报告生成函数(过度函数) 注意:这里的 GetTOProperty("testObjName")是一个隐藏属性,可以获取 QTP 对象库里的 对象的 LOGICNAME. 1. '######################### 报告生成 ########################### 2. private Function HReport(ExpectedValue,ActualValue,testStatus,nodename) 3. Set oEventDesc = CreateObject("Scripting.Dictionary") 4. '添加状态 5. oEventDesc("Status") = micFail 6. '添加是否过滤 7. oEventDesc("EnableFilter") = False 8. '添加节点名称 9. oEventDesc("NodeName") = nodename 10. '添加 HTML 结果 11. oEventDesc("StepHtmlInfo") = "" & _ 12. "" & _ 13. "" & _ 14. "" & _ 15. "
Actual Value"+ExpectedValue+"
Expected Value"+ActualValue+"
Checkpoint StatusFailed
" 16. '判断状态 17. If testStatus Then 18. oEventDesc("Status") = micPass 19. oEventDesc("StepHtmlInfo") = Replace(oEventDesc("StepHtmlInfo"),_ 20. "Failed","Passed") 21. End If 22. '生成报告 23. newEventContext = Reporter.LogEvent ("Replay",oEventDesc,Reporter.GetCon text) 24. '释放资源 25. Set oEventDesc = nothing 26. End Function 2. 验证函数 - 调用第一个报告生成函数自动判断成功与失败 1. '########################### 自定义过程校验 ########################## 2. Function ValidateProperty (Object, PropertyName, ExpectedValue) 3. '判断预期是否与实际值相等 4. If Object.GetROProperty(PropertyName) = ExpectedValue Then 5. '成功 6. HReport ExpectedValue,Object.GetROProperty(PropertyName),true,_ 7. "check "+Object.GetTOProperty("testObjName")+"<"+PropertyName+">属性 " 8. ValidateProperty = True 9. Exit Function 10. Else 11. ' 失败 12. HReport ExpectedValue,Object.GetROProperty(PropertyName),false,_ 13. "check "+Object.GetTOProperty("testObjName")+"<"+PropertyName+">属性 " 14. ValidateProperty = False 15. Exit Function 16. End If 17. End Function 这里的验证函数使用了测试对象的抽离技术。调用时可以直接把对象传入. 把以上两个函数都存放在函数库中,然后直接调用验证函数(函数 2)即可 1. set oWebEdit = Browser("百度一下,你就知道"). _ 2. Page("百度一下,你就知道").WebEdit("搜索框") 3. ValidateProperty oWebEdit,"name","wd" 4. ValidateProperty oWebEdit,"name","wd1" 结果 1: wd 验证成功,如图: 结果 2: wd1 验证失败,如图: 讲座三十七  MFL 自动化路径模型对象应用 今天讲的内容比较精彩也比较重要。希望不要错过,耐心看完,呵呵,在自动化测试中不管 是相对路径还是保留对象 PathFinder 在框架开发中都是常用+实用。大家都知道对于一个脚 本的相对路径的实现是非常重要的,这样方便以后的脚本移植,同样也能方便管理 QTP 的 一些加载的对象、函数、场景恢复 function,环境变量等等。 相对路径设置方法: Tools -> options -> Folders -> 如图我们可以看到 QTP 默认存在的一个这个就是本 test 的一个动态路径,此 处添加了"d:/framework/",也就是我设置的相对路径, 如果此时我在这个路径下有一个 tsr 的对象库文件,就可以直接使用相对路径加载到共享对象库里。如图 当然如果是开发框架的话完全可以使用 AOM 在 QTP 启动时就事先加载好这些路径,不过 今天我讲的重点不在相对路径的设置。 而是一个非常有用的对象,就是 PathFinder 对象,这才是我今天要讲的核心部分。 其实 PathFinder 我相信很多朋友也一定很熟悉,QTP 中的普通的不能再普通的保留对象, 而今天我就要把它的作用完完全全的发挥出来。 普通用法: msgbox pathfinder.Locate ("123.vbs") 当我们在 QTP 中输入 pathfinder 之后输入"."后 QTP 会由于 complete word 而自动补充 Locate 方法。也就是说在 QTP 中,pathfinder 就只有这一个 Locate 方法。此方法返回一个 相对路径的完整路径。而由于我们之前设置过"d:/framework/"的相对路径,因此我们运行后 会显示完整的路径。 这一点相信很多人都会使用,也应该都很熟练了。 隐藏用法: (MFL 自动化路径模型)Mercury.FileLocator (QTP 的所有帮助文档中都 没有任何蛛丝马迹) 其实这个 MFL 自动化路径模型对象就是在 QTP 中的 PathFinder 对象,那我们就来见识一 下 MFL 对象的庐山真面目。 打开 vbsedit。输入 Set mfl = CreateObject("Mercury.FileLocator")并查看 mfl 的方法 如图: 在 vbsedit 中我们可以发现 MFL 对象的所有方法,同样 Locate 方法也在里面。 我们可以使用一下其中的几个方法: count 方法:获取相对路径的个数 -> msgbox PathFinder.count CurrentTestPath 方法:获取当前测试路径 -> msgbox PathFinder.CurrentTestPath Insert 方法:运行时动态插入一条相对路径,参数 1 为路径,参数 2 为相对路径的 index -> PathFinder.Insert "D:/Program Files", PathFinder.count+1 运行完我们可以看到在 Tools -> options -> Folders ->下自动插入了一条记录。 小结: 剩下的方法大家可以自行去研究,这里就简单的介绍几个比较实用的。今天这一章主要就是 讲 MFL 的这个对象,此对象在路径控制上非常有用,特别是在框架开发中。大家一定还在 琢磨我为什么会知道这个对象吧。其实很简单,还是注册表。 宝藏地点: 进入 HKCU -> SOFTWARE -> MERCURY INTERACTIVE -> QuickTest Professional -> MicTest -> FileLocator 可以看到 prog id 的键值为: Mercury.FileLocator 还不快去挖你的宝藏? 讲座三十八  自定义场景恢复 RecoveryFunction Recovery Scenario 相信大家一定已经很熟悉了,通常在出现一些异常的情况下,比如: 弹 出框,被测程序 crash 了,等等,遇到此类问题我们可以在 QTP 中加载相应的场景恢复机 制,这样当错误发生的时候 QTP 会自动激活它来进行测试场景的恢复,从而继续测试的进 行,而不至于让脚本卡着一直到超时失败。因此 RS 在自动化测试中的地位可见是非常的重 要的. 今天主要来讲一下场景恢复的自定义函数 RecoveryFunction,主要这个函数在 QTP 帮助文 档中没有任何的信息来指导我们具体应该怎么做,因此本文就来简明的概述下。如图:我们 设置场景恢复过程中设置为当出现任何错误即触发自定义函数。 当 QTP 脚本一旦发生错误(除了 VBS 本身的错误)后就会激活此函数并执行它。 接下来我们来详细分析下此函数的四个参数: Object ---- 发生错误时自动映射当前错误的 QTP 封装测试对象 用法:msgbox Object.GetTOProperty("testObjName") 结果:输出对象库中的 LogicName TestObjName 为隐藏属性 Method ---- 发生错误时自动映射当前错误的 QTP 测试对象方法 用法:msgbox Method 结果:输出测试对象的方法 Arguments ---- 发生错误时自动映射当前错误的所有参数 用法:msgbox join(Arguments,",") 结果:输出所有参数,以逗号分隔 注意:由于 Arguments 是一个数组,因此这里直接使用 join 进行连接数组。 retVal ---- 发生错误时自动映射当前错误的具体错误信息 用法: msgbox DescribeResult(Result) 结果: 输出详细错误信息 注意: retVal 是 Long 类型的,不可直接输出,必须要使用 DescribeResult 方法来进 行转化。 总结: 场景恢复的自定义函数在框架设计中的错误处理机制模块中是非常常用的,因此希望大 家能够熟练的掌握它并应用到自己的框架中。以下就是自己框架的报告引擎中用飞机订票的 例子。 讲座三十九  注册异类子控件强制注入开启 HOOK 开始进入今天的正题。今天要讲的内容是注册异类子控件授予强制 HOOK,名字有点抽象, 简单的说就是在一个 QTP 可识别的 A 类插件窗口对象中存在着 B 类插件的控件对象,最常 见的例子就是在应用程序中内嵌一个 Browser 对象子控件。说穿了就是内嵌一个浏览器, 注意这里的大前提是此应用程序是可以被 QTP 识别的。那么如果出现我所说的此类情况, 那么 QTP 是绝对不可能去自动识别此应用程序中的浏览器控件对象的,原因很简单,QTP 只把这个应用程序看做是一个 A 类插件的控件对象,因此他根本不会去识别它。那么本章 就来讲一下如何通过注册异类子控件的方法来强制注入启动 hook,简单来看一下。 图 1 如图 1 是我在。net 中建立的一个非常简单的浏览器程序,我们可以看到此应用程序一共只 有三个控件,一个是地址文本框,一个是“go”按钮用于提交地址栏, 还有一个就是 Browser 对象控件,此浏览器是内嵌在.net 程序中的。 那么现在我们打开 QTP,加载 .Net 和 Web 插件之后,这里我们首先来看一下 spy 识别.net 程序中的 Go 按钮。 图 2 来看一下 QTP 是否能够识别浏览器为 page 对象。我们再使用 spy 对 Browser 控件进行捕 获。 图 3 如图 3,我们发现 QTP 根本无法识别此 Browser 对象,直接是抛了个 WinObject 出来,title 还是 Internet Explorer_Server,还真是不给面子,明明已经查出是 IE 了,还不给识别。那 既然不给面子,那我们也不用客气,怎么办?直接切入 QTP 的核心 HOOK 配置文件,强制 注册应用程序。 精彩部分开始,请注意看下去: 1. 进入到 QTP 的核心目录: 《安装目录》/bin 下找到 mic.ini (此文件是关键文件) 图 4 2. 用记事本打开此 INI 文件。我们都知道 INI 格式的都是配置文件,可以直接在里面更改我 们需要的配置。 3. 找到[ie_hook]部分段落。 图 5 4. 在这一栏的最后添加一行应用程序的 文件名+后缀名 = yes 后保存。 图 6 5. 修改完毕之后,重启 QTP,再次重启刚才的应用程序,此时我们再来看一下 spy 的结果。 图 7 如图 7,我们可以看到结果很明显,经过我们的努力,QTP 当然也相当的给力,成功把 Browser 对象识别为 Page 对象。包括对象库也可以任意添加。 图 8 好了,整个例子就这样完毕了,回头我们再来看一下 mic.ini,除了 ie_hook 外,还有很多 其他的配置可以改,有兴趣的朋友也可试试探索下。忘了提了,其实此方法就是 QTP 的 Register New Browser Control 的一个执行过程。但是此方法比它好的地方就很明显了, 就是我们可以使用脚本的形式来对 ini 文件进行配置,而不是需要人工介入去另行注册。对 于移植脚本来说是非常有利的。 讲座四十  创建多个 QTP 实例 终于迎来了第 40 讲,这一年来也写了不少东西,有批评的也有支持的,但是不管怎样我都 会继续坚持下去,把自己学到的想到的偷到的都通过文字的形式来贡献给大家。最近由于写 书比较忙,因此更新的频率低了很多,也请大家谅解。写书是一件非常累人的事情,要写一 本好书更是不容易的事,为了能够提高书的质量,我们把书的初始目录提前公布出来,如果 对本书有兴趣的读者,可以提一些建议或者需求,我们会努力去改进: 【51testing 测试丛书系列之 QTP 自动化测试技术领航】初始目录展示: http://blog.csdn.net/zzxxbb112/archive/2011/02/18/6193081.aspx http://www.51testing.com/index.php?uid-121033-action-viewspace-itemid-229888 那么接下来进入正题,大多数做过 QTP 自动化测试的朋友都应该很清楚,QTP 对进程方面 做过了限制,每个 windows 操作系统下有且只能打开一个实例,如果打开一个实例之后, 再打开一个,QTP 会直接去引用那个已经打开的实例,所以根本无法实现打开多个 QTP 实 例。而今天我要告诉大家,要实现多个 QTP 实例其实是可行的,不过在实现它之前,我们 必须请出今天主角,它就是 SandBoxie。这是一个可以另任意程序创建多个实例的一个工 具,可以直接去官方网站或者百度进行下载。 下载好了之后,安装并打开 SandBoxie Control,进入到 run any program: 找到 QTP 的路径并填入下拉框,点击 OK 等待片刻,QTP 就会自动启动起来了。 此时我们可以在机器上直接打开原始路径的 QTP,这样就有两个 QTP 了。 注意: 用 SandBoxie 打开的程序与本机直接打开的程序在两个不同的空间里的,因此 sandboxie 打开的 QTP 只能识别 SandBoxie 打开的程序而不能识别外部的直接打开的程 序,言下之意就是 sandboxie 下的 QTP 是不可访问直接打开的 QTP 的,而直接打开的 QTP 是可以访问 sandboxie 下的 QTP 的。 总结: 笔者在这里已经尝试过,在互不干扰的情况下,是可以两个 QTP 同时进行执行测试的。 其实还有很多本身无法实现的可以去实现。嘿嘿。
还剩121页未读

继续阅读

下载pdf到电脑,查找使用更方便

pdf的实际排版效果,会与网站的显示效果略有不同!!

需要 8 金币 [ 分享pdf获得金币 ] 0 人已下载

下载pdf

pdf贡献者

kayi

贡献于2015-01-28

下载需要 8 金币 [金币充值 ]
亲,您也可以通过 分享原创pdf 来获得金币奖励!
下载pdf