1.
不能識別對象(Cannot identify object)
出現了這個錯誤時,就表示當前被測程序的窗口中沒有符合條件的對象。
出現這種錯誤,可能的原因有以下兩種:
>>> 對象此時在程序中沒有顯示或不存在。
>>> 在程序中存在該對象,但是它的描述在后來發生了改變,導致與對象倉庫中存儲的信息不匹配,從而QTP無法識別對象。
如果你正遇到“Cannot identify object”的問題,解決方法見1.1。
1.1 如何去識別對象描述(Identifying Test Object Description Problems)
如果你能在被測程序中看到對象,但仍出現了“Cannot Identify Object”錯誤信息,這就表示倉庫中對象的描述與程序中對象的描述一定存在著差異。
解決對象描述問題的第一步是找到差異,最簡單的方法是將倉庫中對象的屬性值與程序中對象的屬性值進行比較。(倉庫中對象的屬性值可在Object Repository窗口中查看,程序中對象的屬性值可用Object Spy功能查看。)
比較倉庫中對象的屬性值與程序中對象的屬性值的操作見1.3。
在完成比較后,是否發現存在差異?
如果是,請參考1.4;
如果否,請參考1.5。
1.2 處理對象丟失問題(Solving Missing Object Problems)
在運行腳本時,QTP嘗試進行某種操作,而該操作的對象在程序中卻沒有出現,出現這種情況的原因有以下幾種:
>>> 對象不再存在。對象已經被從程序中刪除。
解決方法:見1.2.1。
>>> 對象還沒有裝載。
解決方法:見1.2.2。
>>>當前的程序頁面(或窗口)不正確,不是對象所在的頁面(或窗口)。
解決方法:見1.2.3。
>>>前一個步驟沒有正確執行。
解決方法:見1.2.3。
1.2.1 解決對象不再存在的問題
如果對象已經不再在被測程序中存在,則應在腳本中修改或刪除相關步驟。
1.2.2 解決對象裝載超時的問題
如果對象丟失的原因是因為沒有足夠的時間裝載,嘗試以下解決方案:
a.對于Web對象,增加Browser Navigation Timeout(File>Setting>Web頁簽)時間。
b.在包括該對象的步驟前使用Wait語句,讓QTP在執行該步驟之前等待一段時間。
1.2.3 檢查前面步驟的執行情況
如果是因為打開了錯誤的頁面(或窗口)導致對象丟失問題,或因為前一步驟執行措誤導致對象丟失問題,則請按以下方法檢查原因:
a. 如果懷疑在完成腳本后,被測程序又發生了改變,則檢查對象的繼承關系以及對象描述。參考1.1。
b. 如果懷疑腳本錯誤,則檢查腳本的每一個步驟。你可能是遺失了某個步驟,也可能是使用了不正確的方法或參數
1.3 測試對象的屬性值與Run-time對象的屬性值的比較(Comparing Test Object and Run-Time Object Property Values)
根據以下的步驟比較測試對象與Run-time對象的屬性值:
1) 進入Obecjt Repository窗口(Resources>Object Repository),選擇對象。
2) 用筆記下對象的class以及它的各個屬性及屬性值。
3) 打開被測程序,并打開包含被測對象的頁面或窗口。
4) 在QTP中選擇菜單Tools>Object Spy或點擊Object Spy按鈕,打開Object Spy對話框。
5) 選擇“Test Object Properties”選項。
6) 點擊右上角的按鈕(帶有手圖標的),這時QTP窗口以及Object Spy對話框都被最小化。
7) 在程序頁面(或窗口)中點擊目標對象,恢復Object Spy對話框,并在對話框中顯示對象及其父對象(以樹的形式顯示),并在Properties頁簽中顯示當前對象的屬性及屬性值。
8) 這時Object Spy對話框的Properties頁簽中顯示Run-time對象的所有屬性,在此查看對象的class,以及它的屬性及屬性值,并將它與第2步中記下的內容進行比較。
1.4 解決對象描述存在的問題(Solving Object Descrīption Problems)
如果發現倉庫中對象的屬性值與程序中對象的屬性值存在不同,你應該判斷這個不同是個別對象的問題,還是其它同類對象也存在相同的問題。
是所有(或多個)同類對象都存在問題嗎?
如果是,則參考1.6
如果否,則參考1.7
1.5 關于父對象描述的識別問題(Identifying Parent Object Descrīption Problems)
對象的識別還與它所繼承的父對象有關。
如果你能在被測程序中看到對象,而且程序中對象的屬性值與倉庫中對象的屬性值也是一致的,但仍然遭遇到了“Cannot identify object”錯誤,則這個錯誤可能與它的父對象有關(如倉庫中父對象的屬性值與程序中父對象的屬性值不一致),也可能是倉庫中的對象與程序中對象的繼承關系不相同導致的。
要判斷是繼承關系中的哪個父對象出現了問題,請償試下面的方法之一:
>>>重新錄制對象,比較新舊對象的父對象。
欲了解如何完成比較,參考1.8。
>>>對繼承關系中的每個父對象,分別插入一個Exist語句,并運行該部分腳本。
欲了解如果創建Exist語句,參考1.9。
注:你也可以使用Object Repository窗口中的Highlight in Application功能,在被測程序中定位對象。
一旦找到了存在問題的父對象,接下來償試以下方法:
>>>修復存在問題的父對象的描述。方法見1.4。
>>>在專家視圖的模式下,查找所有繼承存在問題的實例并進行修正。
舉例:1.8.1。
1.6 解決某類對象的識別問題(Soving Object Identification Problems for a Test Object Class)
如果你發現某類對象的對象描述對于被測程序來說都不是很合理,或你預期到對象描述中的某屬性值是經常變化的,你可以在Object Identification對話框中改變該類的識別屬性的設置,或定義該類的Smart Identification設置并啟用Smart Identification機制,這樣QTP就可以唯一識別對象了。
1.7 解決單個對象的描述問題(Solving Individual Test Object Description Problems)
選擇下列方法之一來解決對象的描述問題:
>>>如果被測程序中對象描述發生了改變,并且你也清楚改變的內容,并且該改變是永久性或長期性的,你可以直接手工修改倉庫中對象描述中的相關屬性值。
>>>如果被測程序中的對象的屬性值依賴于前面的步驟或其它對象,則將該屬性值參數化,這樣就可以使用其它步驟的輸出值為屬性值。
>>>如果屬性值的組成部分中,部分是固定的,部分是動態改變的,則可以將屬性值設計為正則表達式。
>>>如果屬性值是遵循某種規則變化的,或者是不可預期的,則從對象描述中移除該屬性,并向對象描述中添加一個或多個屬性以便于QTP進行對象識別。
>>>If you can only access the information on the property values during the run session, you can create and use functions that use programmatic descriptions to identify the object using property values retrieved earlier in the run session.
For more information on programmatic descriptions, see Using Programmatic Descriptions.
>>>如果在錄制過程中對象是唯一的,但現在程序中出現了兩個或多個描述相同的對象,但是它們在頁面(或窗口)中的位置不相同,則應在Object Properties或Object Repository窗口中,向對象描述中添加一個ordinal identifier(index或location)。
1.8 重新錄制對象,以判斷父對象描述是否存在問題(Re-recording an Object to Identify Parent Object Description Problems)
根據下面的指引,來判斷父對象的問題。
通過重新錄制對象,來判斷它的父對象是否存在問題:
1) 打開瀏覽器或程序,來到包含被測對象的頁面或窗口。
2) 在關鍵字視圖模式,選擇最后一個組件(component),或在專家視圖模式,將光標放在最后一個腳本步驟的下面。
3) 點擊Record按鈕,或選擇Automation>Record。
4) 點擊(或操作)頁面或窗口中的目標對象。
5) 點擊Stop按鈕,或選擇Automation>Stop,完成步驟添加。
6) 右擊新添加的步驟,并選擇Object Properties右鍵菜單。
7) 在Object Properties對話框中,點擊Repository,打開Object Repository窗口,并選中了新對象。注意記下該對象的繼承關系。
8) 在Object Repository窗口中找到舊的對象(即存在問題的對象),將它的繼承關系與新對象的繼承關系進行比較。
通過比較,可以檢查到新舊對象是父對象的描述存在不同,還是它們的繼承關系根本就不同。
a. 如果是父對象的描述問題,則修改父對象的描述。參見1.4.
b. 如果是對象的繼承關系不正確(即具有不同的父對象)引起的問題,則在腳本中找到所有使用該繼承關系的實例,將它們替換為正確的繼承關系。
舉例:參見1.8.1。
1.8.1 舉例
假設有一個帶有Frame的網站,你錄制了一個操作針對Image對象“Poster”的操作步驟。在Object Repository窗口,你可以Image對象的繼承關系如下所示:
MyCompany(Browser)
MyCompany(Page)
Main(Frame)
Poster(image)
當你運行腳本時,網頁看起來沒有什么不同,但是識別Image對象時卻出現了“Cannot identiry object”的錯誤提示。當你重新錄制操作步驟,然后在Object Repository窗口中查看新的Image對象時,發現該對象的繼承關系如下所示:
MyCompany(Browser)
MyCompany(Page)
Poster(image)
從中可以看出,Frame已經從Web Page中移除,所以盡管Image對象“Poster”的描述沒有發生任何改變,但它的繼承關系已經改變了。
在Object Repository窗口,你可以看到新舊Image對象“Poster”是兩個完全不同的對象:舊的位于已經被移除的Frame對象之下,而新的則直接位于Page“Mycompany”對象之下。
修復這個問題,可以在腳本步驟中將舊的對象替換為新的對象。
為了保持Object Repository窗口的整潔,你應刪除那些已不再存在的對象(如本例中的Frame)。
1.9 創建Exist語句,以判斷父對象的描述是否存在問題
QTP在錄制發生在某個對象上的操作時,也會同時去了解對象以及它的繼承關系。因此,如果在運行過程中,QTP不能識別繼承關系中的任何一個父對象,都會導致目標對象的識別失敗。
使用帶有Exist方法的Msgbox語句,可以方便的檢查出是繼承關系中的哪個父對象出現了問題。
假設在運行下面腳本時,你遇到了“Cannot identify Object”錯誤信息(但是可以確定對象倉庫中Link對象的描述與當前程序中對象的描述是完全一致的):
Browser("Yahoo!").Page("Yahoo!").Link("Arts & Humanities").Click
你可以在該語句前面插入以下語句:
Msgbox Browser("Yahoo!").Exist
Msgbox Browser("Yahoo!").Page("Yahoo!").Exist
Msgbox Browser("Yahoo!").Page("Yahoo!").Link("Arts & Humanities").Exist
然后你從頭開始運行腳本,發現第1行語句運
但是,當QTP運行到第2步時,就彈出信息框,內容為“False”,表示不能找到Page object。這就證明Page對象存在問題。
確定了出現問題的父對象以后,修復該問題。參見1.4。
2. 對象不唯一(The object is not unique)
在被測頁面或窗口中的同一父對象下,找到多個與倉庫中對象描述相符的Run-tim對象。
請確定是只有個別對象存在此問題,還是此類對象的所有對象(或部分對象)存在此問題。
此類對象的所有對象(或部分對象)都存在此問題嗎?
如果是,參考2.1;
如果否,參考2.2。
2.1 為某對象類設置能唯一識別對象的描述規則(Configuring Unique Test Object Descrīptions for a Test Object Class)
如果你發現某類對象的對象描述都不足以唯一識別對象,你可以在Object Identification對話框中,改變該類的識別屬性的設置,或定義該類的Smart Identification設置并啟用Smart Identification機制,這樣QTP就可以唯一識別對象了。
2.2 設置通唯一識別對象的對象描述(Creating a Unique Test Object Descrīption for an Object)
查看當前對象的描述,并償試在程序中找到其它具有相同描述的對象并查看它們的描述。
>>>如果你找到了可以將它們區別開來的一個或多個屬性,則修改倉庫中對象的相關屬性(如向描述中添加屬性等),以使QTP在運行時可以唯一識別它。
>>>如果它們的識別屬性完全相同,則在對象描述中為對象添加一個ordinal identifier(index或location)。
3. 找不到父對象(Parent not found)
識別對象時,會先識別它的父對象是否正確。如果遇到“Parent not found”的錯誤信息,請償試以下解決方法:
>>>修復出現問題的父對象的描述。參見1.4。
>>>在腳本中找到繼承關系不正確的實例,并修改為正確的繼承關系。例如1.8.1。
4. 無效的參數(Invalid arguments)
一個或多個方法的參數是無效的。
參數無效可能是參數類型錯誤,也可能是參數個數不正確。
根據以下建議,找到方法的正確語法:
>>>在Keyword模式,如果方法包括參數,則在Value欄會顯示該方法的參數提示。
>>>在Expert模式,如果方法包括參數,則當你插入方法然后按下Shift+Ctrl+Space鍵時,QTP會顯示該方法的參數的提示信息。(注:只有在Editor Options對話框的General頁簽中打開了Statement completion功能時才可以看到參數的提示信息。)
5. 不能識別item(Cannot identify item)
QTP不能識別方法參數中指定的列表或樹對象的item時,請確認指定的item是否存在于對象之中。
>>>如果item不存在,則刪除相關腳本步驟,或修改item。
>>>如果item存在,但被測程序中它的名字發生了改變,則修改item的名稱,或在腳本中使用item的index而不是名字(如“#4”)。
注意,不同的對象或方法,它們使用index的語法可能不同。
6. 對象的item不唯一(The object’s item is not unique)
在列表或樹對象中,可能有多個名字相同的item。
在這種情況下,可以指定item使用index(例如“#4”)。
7. 運行失敗(Test run failed)
測試運行失敗,還有可能是其它未知錯誤造成的。檢查出現錯誤時的腳本步驟。
如果錯誤出現在執行檢查點或輸出值時,請查閱關于檢查點與輸出值的幫助。
如果錯誤出現在使用外部文件時,如數據庫表、數據庫、環境變量文件、或關聯倉庫文件等,則檢查是否可以正常獲取并使用文件,或這些文件的存儲格式是否正確。
如果錯誤出現在完成某個腳本動作時,請參考QuickTest Object Model Reference幫助,以確認方法或函數的使用是否正確。
如果錯誤出現在執行一個標準的VBscrīpt語句時,參考Microsoft VBscrīpt Reference以獲得幫助。