2012-01-13 19 views
5

我有以下結構的圖:如何UIAutomation確定UIAElement.isVisible()是否

GrandView 
-Parent View1 
-Parent View2 
--Child View1 
--Child View2 

子視圖佔用幾乎所有的Parent View2的界限,但仍有周圍的一些空間邊緣。如果點擊邊緣,我可以使用可訪問性檢查器在模擬器中選擇Parent View2。我還可以挖掘UIAutomation Parent View2如果我使用:

tapWithOptions({tapOffset:{x:0.15, y:0.95}}); 

但是,我到isVisible()調用總是返回0。我期望如果我可以點擊該元素,或者使用輔助功能檢查器選擇它,它應該返回1

UIAutomation如何確定UIAElement是否可見?

回答

0

如果是UIView,則應該驅動hidden屬性。如果它不是一個視圖,並且它是一個容器,它應該由accessibilityElementsHidden驅動。

一般來說,你不想使用這個UIAutomation。相反,無論你在視圖上做什麼 - 在這種情況下,輕敲() - 繼續執行,如果系統超時,讓系統發出錯誤。一般來說,這是您希望在腳本中遵循的模型,而不是先測試是否有可用的模型。 Sine UIAutomation是DOM腳本化UIAccessibility信息,當動畫視圖轉換等事情發生時,事情就會失去同步。有時腳本比UI動畫執行得更快,有時卻相反! waitForInvalid可能是您解決問題的捷徑。

Alex Vollmer的UIAutomation的tuneup.js庫使得編寫測試變得更容易,並且易於擴展。 https://github.com/alexvollmer/tuneup_js

+0

正如我的問題所暗示的,我看到它由'hidden'和'accessibilityElementsHidden'以外的東西驅動。我想在'isVisible()'屬性上斷言,以確保容器存在而不必檢查容器的內容,這可能會改變。 – 2012-01-28 06:16:38

0

對元素執行的每個操作都有超時。這是不是從蘋果文檔顯而易見的,但如果你看看:setTimeout,它告訴我們:

的超時值確定了對象分辨率的寬限期。如果表示UI元素的對象在寬限期內變得可用,則嘗試從該工具保留的信息中實例化該對象。

setTimeout本身只是改變了默認值(就像push和pop一樣)。你真正想要做的是在你的視圖上執行你的操作,如果它永遠不可用(缺省超時時間是5秒),則超時失敗。
WWDC 2010會議「使用儀器自動執行用戶界面測試」確實進入了這一點,它可以在ADC WWDC 2010頁面上找到,同時包含視頻和幻燈片。在你的情況下,你想要在你的視圖上執行tap()。如果由於某種原因,該視圖在5秒內不可用於UIAutomation,則應該看到一個異常。
實驗用做改變超時:

var oldTimeout = target.timeout(); target.pushTimeout(10);

代碼之前,和

target.popTimeout(oldTimeout);

後。

+0

但是,我不能在我的視圖上執行「tap()」。我只能執行'tapWithOptions()',正如我在我的問題中提到的那樣。但是,我不想「點擊」我的觀點,因爲這會啓動我不關心的操作。我只是想知道它是現在和可點擊的。 – 2012-01-31 06:47:07

+0

然後,不要點擊(),而要訪問像name()這樣的方法。再次,您正在等待該操作超時。你真正想要的是「這個視圖在這個超時期限內是否可用」。如果name()的調用超時,則不可用。如果您的視圖需要超過默認的5秒纔可用,請使用pushTimeout和popTimeout來延長超時時間。該tapWithOptions的工作原理並不令人意外,該視圖存在但尚未作爲其層次結構的一部分用於自動化(即對象分辨率尚未完成) – quellish 2012-01-31 21:09:49

+0

您是什麼意思「對象分辨率尚未完成」? – 2012-02-01 05:46:19