QTP相關問題的解析

發表于:2009-11-25來源:作者:點擊數: 標簽:qtpQTP解析
QTP相關問題的解析 軟件測試 一、QTP獲取瀏覽器屬性的方法 獲取瀏覽器屬性的方法: Dimobj,tempValue ’獲得窗體對象 setobj=Browser(\"CreationTime:=1\").Page(\"index:=\").Object.parentWindow ’獲取瀏覽器的當前語言。 tempValue=obj.clientInformatio

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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97