QTP相關問題的解析 軟件測試
一、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 ---最小化
?。?針對于網頁的最大化我們深入的學習一下,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對象就當場消失不見了?。?!
原文轉自:http://www.anti-gravitydesign.com