获取浏览器属性的方法: 编程
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的测试中,在出现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 ---最小化 app
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测试中,比较本地的两个文件是否是相同,须要使用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里的对象有两个概念,一个是Test Object(简称TO),一个是Runtime Object(简称RO)。
这两个概念从字面上不大好理解,也容易混淆。
但从实际做用上来看,应该说TO就是是仓库文件里定义的仓库对象,RO是被测试软件的实际对象。
QTP识别对象,通常是要求先在对象仓库文件里定义仓库对象,里面存有实际对象的特征属性的值。
而后在运行的时候,QTP会根据脚本里的对象名字,在对象仓库里找到对应的仓库对象,
接着根据仓库对象的特征属性描述,在被测试软件里搜索找到相匹配的实际对象,最后就能够对实际对象进行操做了。
仓库对象TO通常在录制/编写脚本时加入仓库文件,它不只能够在录制编写时进行修改,
也能够在运行过程当中进行动态修改,以匹配实际对象。 学习
和TO、RO相关的几个函数有:
GetTOProperty():取得仓库对象的某个属性的值
GetTOProperties():取得仓库对象的全部属性的值
SetTOProperty():设置仓库对象的某个属性的值
GetROProperty():取得实际对象的某个属性的值 测试
理解了TO的含义,你就能够自由的用SetTOProperty()定义TO,以灵活的操做RO google
好比有个测试任务,窗口上有不少待检查的记录,每条记录右边都有一个Check按钮,用来检查各条记录。
记录个数不定,因此Check按钮个数也就不定,只有一个Edit显示记录个数。
咱们要对每条记录进行检查,也就是要点击每一个Check按钮。
可是Check按钮个数不定,很差录制,并且个数可能也不少(上百个),即便能一一录制,那也很麻烦。 url
那我有一个好办法,只录制一个按钮对象,它设有两个特征属性 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经过调用对象的自身接口来实现的。
两种接口的脚本书写格式的差异在于:
自身接口须要在对象名后面加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对象就当场消失不见了!!!