如果想避免錄制動作以向對象地圖(Object Map)中添加 TestObject 對象,我們可以采用 TestObject.find 方法 TestObject.find 方法是一個 Java™方法, RFT 使用它在運行時動態地在被測應用程序(Application Under Test)中定位 TestObject,其根據對象的屬性在運行時進行識別,可由腳本編寫人員在運行時動態調整對象識別屬性,因此其帶來了極大的靈活性。由于其未在 Object Map 中錄制任何對象,所以不能調用 waitForExistence() 方法來阻塞等待,我們可通過一個循環來實現,示例代碼如下:
while ( 等待時間值 ){ if( find(atDescendant(".class", "Html.Button") != null){ return; } sleep(1);} |
該方法將不斷識別指定對象 ( 能明顯區別開響應頁面與其他頁面的一個對象 ),直到識別成功或時間超時。
TestObject.find 方法是 RFT 提供給腳本開發人員的一個強大的接口,在開發可維護的腳本過程中不可避免的會用到該方法,而且其執行效率也得到了很大改進,下面給出了利用它在等待頁面下載時的一些優缺點。
優點:利用該方法我們將能充分利用 find 方法的動態性和可重用性。
缺點:由于 find 方法只能依賴于對象的屬性,而不會依賴于對象的層次結構來進行識別,所以即使我們找到了對象,也不能判斷當前頁面是否下載完畢。比如,頁面中的圖片資源會在其他元素下載完畢后再下載,所以如果此時對這些圖片進行操作的話將會出現異常。
![]() ![]() |
![]()
|
除了上述兩種方法,如果當前之存在一個瀏覽器窗口,則可以利用瀏覽器對象的 .readyState 狀態來進行判斷。
如果響應頁面中某個對象能被 RFT 識別(即該對象已下載成功)則該對象的 readyState 屬性值將會是”4”或”complete”。不同瀏覽器中 readyState 的值會不一樣,IE 中為 complete, FireFox 中為 4。(RFT 從 7.0 版本開始對 IE 及 FireFox 全部支持 )。
上面提到過 RFT 以樹型結構的方式來識別對象,越外層的對象所包含的頁面元素越多,因此我們可以利用瀏覽器對象的 readyState 值是否為”4”或”complete”來判斷當前頁面是否下載完畢。如果瀏覽器對象已下載成功,則頁面其他元素(即其所有子元素都已下載),或者可將 HtmlBrowser 對象錄入到 Object Map 中并調用 HtmlBrowser.waitForExistence() 方法 ( 不同的 HtmlBrowser 在 RFT 中并沒有區別,所以將其錄入到 Object Map 中可以達到重用的目的 ),可達到與上述方法同樣的效果。
while ( 等待時間值 ){ if( find(atDescendant(".class","Html.Browser"). getProperty(“readyState”).equals(“complete”)){ return; } sleep(1);} |
該方法利用 Test Object 的一個屬性值來進行判斷,在只存在一個瀏覽器對象的時候這個方法能很好的幫我們解決頁面等待問題。
下面對他的優缺點進行下比較。
優點:可準確的判斷頁面是否下載完畢,并且很容易做到重用。
缺點:由于該方法依賴于瀏覽器對象,而不能匹配頁面具體元素,所以很難做到唯一指定一個頁面。比如同時打開了多個瀏覽器頁面,或者在請求頁面和響應頁面之間有個等待頁面,這些情況下該方法不能很好的工作。
如前所述,方法一存在重用性問題,方法二不能準確判斷頁面是否下載完畢,而方法三在同時打開多個瀏覽器頁面時不能準確識別,因此單獨采用上述三種方法都不能很好地完成任務,不過我們可以結合方法二和方法三利用方法二中的 find 方法,可以指定響應頁面中的一個標識對象,這樣即使有多個頁面也能唯一確認響應頁面。同時利用方法三中瀏覽器對象的 readyState 狀態值來判斷當前頁面是否下載完畢,這樣的結合就能達到準確判斷響應頁面是否下載完畢的目的。
while(true){ if(getButton("Finish") != null && new BrowserTestObject(getButton("Finish"). getTopParent().getChildren()[0]). getProperty("readyState").equals("complete")){ return; } sleep(1);} |
在方法三種我們提到可用 Object Map 中錄入 HtmlBrowser 對象的方法來替代判斷瀏覽器對象 readyState 狀態的方法,但如果同時打開多個瀏覽器頁面,將無法區分開來。所以此處最好采用上述代碼中所列方法:判斷當前對象所在的瀏覽器的 readyState 狀態。
由于該方法完全采用了動態識別的方式,因此我們在程序中可以更好的來重用它,通過定義一個 Helper super class,在這個類中定義上述方法,需要調用該功能的類通過繼承這個 class 并將需要動態查找的對象作為參數傳遞給該 class 這種方式,我們能在代碼級得到更好的重用。
優點:該方法能準確的找到指定頁面并且能很好的判斷頁面是否下載完畢。而且利用了 find 方法來動態識別能很好的做到重用。
五、總結
自動化測試的頁面等待是一個常見的問題,本文介紹了 RFT 中常用的幾種解決辦法。每一種方法都有自己的優缺點,這些方法的差別也正體現了 RFT 中靜態與動態識別的差異,在具體的實踐過程中我們可以依據具體的應用類別來選擇合適的解決方案。
例如:在相似頁面重復很少的情況下,我們可以采用方法一,這樣可以充分利用 Object Map 的易用性及性能優勢在相似頁面重復較多,同時打開多個瀏覽器頁面,頁面響應比較快的時候可以采用方法二在只打開一個瀏覽器頁面的時候可以采用方法三在相似頁面重復較多,同時打開多個瀏覽器頁面,而且頁面響應比較慢的時候可以采用方法四。
文章來源于領測軟件測試網 http://www.k11sc111.com/