QTP對象識別原理

一、QTP識別對象原理

QTP裏的對象有兩個概念,一個是Testtime Object(簡稱TO),一個是RunTime Object(簡稱RO)。

從實際作用來看,TO就是對象庫中定義的對象,RO時被測試軟件運行時的實際對象。

QTP識別對象,一般要求先在對象庫中定義對象,裏面存有實際對象的特徵屬性的值。然後在運行時,QTP會根據腳本里的對象名字,在對象庫中找到對應的對象,接着根據對象庫中的對象的特徵屬性描述,在被測試軟件中搜索到相匹配的實際對象,最後就可以對實際對象進行操作了。

TO對象一般在錄製/編寫腳本時加入對象庫,它不僅可以在錄製編寫時進行修改,也可以在運行過程中進行動態修改,以匹配實際對象。

和TO、RO相關的幾個函數:

  • SetToProperty:修改對象庫中對象的屬性值,但僅僅是臨時修改,一旦本次action結束,對象庫中該對象的屬性恢復原值。
  • GetToProperty:獲得當前action的對象庫中該對象的單一屬性的值。
  • GetToProperties:獲得當前action的對象庫中該對象的搜有屬性的值。
  • GetRoProperty:獲得實時操作對象的屬性值。

可以用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還支持腳本描述的方法來定義和訪問對象,即不需要在倉庫裏定義,也能訪問和操作實際對象。
 
  如上面兩個任務,可以如下實現
 
  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使用的缺省接口,我們錄製出來的腳本都是使用封裝接口,大家用的也都是封裝接口。
 
  但是封裝接口不如自身接口豐富,因爲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的概念太容易讓人混淆了!
 
  它既用來區分倉庫對象和實際對象,又用來區分對象的封裝接口和自身接口。)
發佈了28 篇原創文章 · 獲贊 5 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章