UFT小知识点整理

原创
2016/07/03 12:26
阅读数 1K

一、QTP获取浏览器属性的方法

获取浏览器属性的方法: 

Dim obj,tempValue 
 ’获得窗体对象 
set obj = Browser(\"CreationTime:=1\").Page(\"index:=\").Object.parentWindow 
 ’获取浏览器的当前语言。 
tempValue = obj.clientInformation.browserLanguage 
print(tempValue) 
 ’获取浏览器的名称。 
tempValue = obj.clientInformation.appName 
print(tempValue) 
 ’获取浏览器运行的平台和版本。 
tempValue = obj.clientInformation.appVersion 
print(tempValue) 
 ’获取用户的操作系统名称。 
tempValue = obj.clientInformation.platform 
print(tempValue) 
 ’获取操作系统适用的默认语言。 
tempValue = obj.clientInformation.systemLanguage 
print(tempValue) 
 ’获取浏览器的代码名称。 
tempValue = obj.clientInformation.appCodeName 
print(tempValue) 
 ’获取指示 CPU 等级的字符串。 
tempValue = obj.clientInformation.cpuClass 
print(tempValue) 
 ’获取表明系统是否处于全局脱机模式的值。 
tempValue = obj.clientInformation.onLine 
print(tempValue) 
 ’获取等同于 HTTP 用户代理请求头的字符串。 
tempValue = obj.clientInformation.userAgent 
print(tempValue)

 

二、QTP测试时应用程序的最大化最小化控制

在QTP的测试中,在出现bug的地方,我们想通过截图留下证据,但是有时候可能网页不是最大化,使得我们截到了无关紧要的图像,在这里提供一些方法,可以尽量避免这种现象。 

1.截图可以 
使用QTP自带的函数例如 
只截取page,不包括上面的工具及导航栏 
Browser(\"社内システム\").Page(\"社内システム\").CaptureBitmap(\"D:\\1.bmp) 
整个浏览器 
Browser(\"社内システム).CaptureBitmap(\"D:\\1.bmp) 
由于这种截图只是一屏幕,不能截取到整个page 
所以,有时候我们也可以使用一些开源的截图工具,这样效果比较好。  
2.在截图之前先同步。针对于页面来说就是 
Browser(\"社内システム\").Page(\"社内システム\").Sync  
3.截图之前先最大化。 
应用程序的操作: 
winObject.Maximize   ---最大化 
winObject.Minimize    ---最小化 
winObject.Restore     ---返回到更菜的大小 
浏览器的操作: 
winObject.FullScreen   --- 效果如同F11的最大化 
winObject.Minimize       ---最小化 

  4.针对于网页的最大化我们深入的学习一下,winObject.FullScreen 其效果如同F11的最大化,不是我们通常使用的最大化,有时候截图需要规范,要用到通常的最大化怎么办呢? 
  其实浏览器(IE)对于操作系统来讲,也是一个应用程序,我们可以变相的实现“通常的最大化” 
Dim hwnd 
hwnd = Browser(\"Browser\").GetROProperty(\"HWND\") 
’msgbox cstr(hwnd) 
’将浏览器最大化 
Window(\"hwnd:=\" & hwnd).Maximize 
Browser(\"Browser\").Navigate \"http://www.google.com/\" 
’回复浏览器刚才的大小 
Window(\"hwnd:=\" & hwnd).Restore 
’最小化浏览器 
Window(\"hwnd:=\" & hwnd).Minimize 
这样我们变通的实现了IE的最大化,最小化,同事也能够还原到原来的大小。

 

三、QTP:FileSystemObject基础知识

在QTP测试中,比较本地的两个文件是不是相同,需要使用VBScript的FileSystemObject对象,在此作简要的概述 
(一).基础FileSystemObject 
1.     创建 FileSystemObject 对象 
Dim fso 
Set fso = CreateObject(\"Scripting.FileSystemObject\") 
  Scripting 是类型库的名字,而 FileSystemObject 则是想要创建的对象的名字。 
  要用 FileSystemObject (FSO) 对象模式来编程,则:使用 CreateObject 方法来创建 FileSystemObject 对象。  
  FSO 对象模式包含在 Scripting 类型库中,该库位于 Scrrun.dll 文件中。因而,要使用 FSO 对象模式,必须把 Scrrun.dll 放在 Web 服务器的适当系统目录中。 
2.     使用方法: 
  访问现有驱动器、文件和文件夹 
GetDrive()、GetFolder()、GetFile()、CreateFolder()、CreateFile()、CreateTextFile ()、OpenTextFile()、FolderExists(url)、DeleteFolder(url)、MoveFolder(src,to)、FileExists(url)、CopyFile()、MoveFile()、DeleteFile()、 
例如: 
Dim fso, f1 
Set fso = CreateObject(\"Scripting.FileSystemObject\") 
Set f1 = fso.GetFile(\"c:\\test.txt\") 
3.     访问属性: 
Name、Path、Size、Type、DateLastModified(上一次修改的文件时间) 
(二).FSO的一些特殊功能 
1.        GetSpecialFolder Method 返回特定的Windows文件夹的路径: 
  Windows安装目录;Windows系统目录;Windows临时目录  
  FSO.GetSpecialFolder([0, 1, or 2])   
2.        GetTempName Method 返回一个随机产生的文件或者目录名字,用于存储临数据 
3.        GetAbsolutePathName Method 返回文件夹的绝对路径(类似于Server.MapPath)。 
比如,FSO.GetAbsolutePathName(\"region\") 将返回类似于下面的结果:\"c:mydocsmyfolder egion\"  
4.        GetExtensionName Method 返回路径中最后部分的扩展名 (比如:FSO.GetExtensionName(\"c:docs est.txt\") 将返回txt)  
5.        GetBaseName and GetParentFolder Methods 返回路径中最后部分的父文件夹 (比如:FSO.GetParentFolder (\"c:docsmydocs\") 将返回’docs’)  
6.        Drives Property 返回所有本地可用驱动器的集合,用于建立资源浏览器样的用户接口。

 

四、QTP对象的识别与操作

(一)、QTP识别对象的原理 


  QTP里的对象有两个概念,一个是Test Object(简称TO),一个是Runtime Object(简称RO)。 
  这两个概念从字面上不大好理解,也容易混淆。 
  但从实际作用上来看,应该说TO就是是仓库文件里定义的仓库对象,RO是被测试软件的实际对象。 
  QTP识别对象,一般是要求先在对象仓库文件里定义仓库对象,里面存有实际对象的特征属性的值。 
  然后在运行的时候,QTP会根据脚本里的对象名字,在对象仓库里找到对应的仓库对象, 
  接着根据仓库对象的特征属性描述,在被测试软件里搜索找到相匹配的实际对象,最后就可以对实际对象进行操作了。 
  仓库对象TO一般在录制/编写脚本时加入仓库文件,它不仅可以在录制编写时进行修改, 
  也可以在运行过程中进行动态修改,以匹配实际对象。 

和TO、RO相关的几个函数有: 
  GetTOProperty():取得仓库对象的某个属性的值 
  GetTOProperties():取得仓库对象的所有属性的值 
  SetTOProperty():设置仓库对象的某个属性的值 
  GetROProperty():取得实际对象的某个属性的值 

  理解了TO的含义,你就可以自由的用SetTOProperty()定义TO,以灵活的操作RO 

  比如有个测试任务,窗口上有很多待检查的记录,每条记录右边都有一个Check按钮,用来检查各条记录。 
  记录个数不定,所以Check按钮个数也就不定,只有一个Edit显示记录个数。 
  我们要对每条记录进行检查,也就是要点击每个Check按钮。 
  但是Check按钮个数不定,不好录制,而且个数可能也很多(上百个),即使能一一录制,那也很麻烦。 

  那我有一个好办法,只录制一个按钮对象,它设有两个特征属性 label=OK, index=0 
  然后用下面的脚本,就可以完成测试 


buttonNum = CInt(JavaWindow(\"Test\").JavaEdit(\"Record Num\").GetROProperty(\"value\")) 
For buttonIndex = 0 to buttonNum - 1 
  JavaWindow(\"Test\").JavaButton(\"Check\").SetTOProperty(\"index\", buttonIndex) 
  JavaWindow(\"Test\").JavaButton(\"Check\").Click 
Next 

  或者窗口上有New、Modify、Delete、Check等好几个按钮,要把这几个按钮一一按过去 
  我在对象仓库里只设置一个按钮对象AnyButton,label特征属性值填任意值,然后用下面脚本执行测试 


JavaWindow(\"Test\").JavaButton(\"AnyButton\").SetTOProperty(\"label\", \"New\") 
JavaWindow(\"Test\").JavaButton(\"AnyButton\").Click 

JavaWindow(\"Test\").JavaButton(\"AnyButton\").SetTOProperty(\"label\", \"Modify\") 
JavaWindow(\"Test\").JavaButton(\"AnyButton\").Click 

JavaWindow(\"Test\").JavaButton(\"AnyButton\").SetTOProperty(\"label\", \"Delete\") 
JavaWindow(\"Test\").JavaButton(\"AnyButton\").Click 

JavaWindow(\"Test\").JavaButton(\"AnyButton\").SetTOProperty(\"label\", \"Check\") 
JavaWindow(\"Test\").JavaButton(\"AnyButton\").Click 


  另外,QTP还支持脚本描述的方法来定义和访问对象,即不需要在仓库里定义,也能访问和操作实际对象 [Page]

  如上面两个任务,可以如下实现 
  1. 不需要在仓库里定义Check按钮对象,直接用下面脚本来实现测试 


buttonNum = CInt(JavaWindow(\"Test\").JavaEdit(\"Record Num\").GetROProperty(\"value\")) 
For buttonIndex = 0 to buttonNum - 1 
  JavaWindow(\"Test\").JavaButton(\"label:=Check\", \"index:=\"+CStr(buttonIndex)).Click 
Next 


  2. 不需要在仓库里定义New、Modify、Delete、Check按钮对象,直接用下面脚本来实现测试 

JavaWindow(\"Test\").JavaButton(\"label:=New\").Click 
JavaWindow(\"Test\").JavaButton(\"label:=Modify\").Click 
JavaWindow(\"Test\").JavaButton(\"label:=Delete\").Click 
JavaWindow(\"Test\").JavaButton(\"label:=Check\").Click 

(二)、QTP操作对象的原理


  QTP为用户提供了两种操作对象的接口,一种就是对象的封装接口,另一种是对象的自身接口。

  对象的自身接口是对象控件本身的接口,只要做过软件开发,使用过控件的人应该很清楚。
  对象的封装接口是QTP为对象封装的另一层接口,它是QTP通过调用对象的自身接口来实现的。

  两种接口的脚本书写格式的差别在于:
  自身接口需要在对象名后面加object再加属性名或方法名,
  封装接口就不用在对象名后面加object。

具体格式如下:
  对实际对象的操作:
      对象.object.自身属性
      对象.object.自身方法()
      对象.GetROProperty(\"封装属性\")
      对象.封装方法()

  对仓库对象的操作:
      对象.GetTOProperty(\"封装属性\")
      对象.GetTOProperties()      ’获取所有封装属性的值
      对象.SetTOProperty(\"封装属性\", \"封装属性值\")

  比如操作JavaEdit对象,通过QTP封装的封装接口,脚本如下:
  设置JavaEdit的内容:
     JavaDialog(\"Add NE\").JavaEdit(\"NE Name\").Set \"NE1\"
  读取JavaEdit的内容:
     msgbox JavaDialog(\"Add NE\").JavaEdit(\"NE Name\").GetROProperty(\"value\")

  如果通过JavaEdit的自身接口,脚本如下:
  设置JavaEdit的内容:
     JavaDialog(\"Add NE\").JavaEdit(\"NE Name\").object.setText(\"NE1\")
  读取JavaEdit的内容: 

Msgbox JavaDialog(\"Add NE\").JavaEdit(\"NE Name\").object.getText() 

  QTP执行JavaEdit().Set语句时,是通过执行JavaEdit().object.setText()来实现的。
  QTP执行JavaEdit().GetROProperty(\"value\"),是通过执行JavaEdit().object.getText()来实现的。
  JavaEdit对象的封装接口Set()和GetROProperty(\"value\"),是QTP封装JavaEdit对象的自身接口setText()和getText()而得来的。

  对象的封装接口是QTP使用的缺省接口,我们录制出来的脚本都是使用封装接口,大家用的也都是封装接口。[Page]
  但是封装接口不如自身接口丰富,因为QTP只是封装了部分常用的自身接口嘛。
  所以我们在需要时,可以绕过封装接口,直接调用对象的自身接口。
  不过有些自身接口不够稳定,在实践中偶尔会出现问题,但是概率很少。
  封装接口有相应功能的话,就尽量用封装接口吧!

  理解了封装接口和自身接口的原理,我们就可以更加灵活的操作对象了。

  但是我们怎么知道对象都有哪些封装接口和自身接口呢?
  其实很简单,用对象查看器(Object Spy)查看对象,在查看窗口里有列出这些接口,包括属性和方法。
  窗口中间有选择栏让你选择Run-time Object或者Test Object,
  当你选择Runtime Object时,它显示的就是对象的自身接口(自身的属性和方法)
  当你选择Test Object时,它显示的就是对象的封装接口(封装的属性和方法)

(注意:GetROProperty访问的是实际对象的封装接口,GetTOProperty访问的是仓库对象的封装接口,
            两者访问的都是对象的封装接口,即Object Spy窗口里选Test Object时显示的属性。
            不要以为GetROProperty访问的是自身接口,即Object Spy窗口里选Run-time Object时显示的属性。
            QTP里的Test Object/Run-time Object的概念太容易让人混淆了!
            它既用来区分仓库对象和实际对象,又用来区分对象的封装接口和自身接口。

  明白了这些,你还等什么呢?快拿起对象查看器,看看对象都有哪些封装接口和自身接口,肆意的操作它,玩弄它吧!

比如执行
  JavaDialog(\"Add NE\").JavaEdit(\"NE Name\").object.setVisible(false)
  你的JavaEdit对象就当场消失不见了!!!

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
1 收藏
0
分享
返回顶部
顶部