2016-04-22 108 views
22
屬性

的Xcode(7.2和7.3) UI測試,我的測試有時會具有相當一般性錯誤:聲明失敗:UI測試失敗 - 未能取的元素

Assertion Failure: UI Testing Failure - Failure fetching attributes for element

我傾向於在元素上調用.hittable.tap()時出現此錯誤,但我無法說明原因。我已經檢查過我處理的元素都具有正確的可訪問性設置,並且它們所在的任何容器視圖都沒有啓用可訪問性。唉,這似乎不能解決問題。

控制檯日誌顯示:

UI Testing Failure - Failure fetching attributes for element <XCAccessibilityElement: 0x7e68ae50> pid: 89032, context: 4D9272C7-3024-4062-B0FA-E16EF426F17A, payload: { 
    pid = 89032; 
    "uid.elementID" = 1432; 
    "uid.elementOrHash" = 2125772976; 
}: Error Domain=XCTestManagerErrorDomain Code=13 "Error copying attributes -25202" UserInfo={NSLocalizedDescription=Error copying attributes -25202} 

我試着摸索和管理,發現它已經被記錄,但似乎沒有當前解決方案(radar link)甚至的Xcode 7.3。

似乎有時如果我重新啓動模擬器/設備,這個錯誤不會發生,但這不是一個好的解決方案。

+0

我也有那些。確保正確設置期望值,以便您的視圖層次結構達到您要測試的狀態。在測試異步事件時(即在網絡調用之後點擊一個提供反饋的按鈕),這一點非常重要。 –

+0

這是蘋果的錯誤,你也可以在蘋果的[鏈接](https://forums.developer.apple.com/thread/6437)中顯示。這裏有些人建議一些解決方案可能適合你。如果有任何解決方案對您不適用,請向Apple報告錯誤。在這種情況下,我們無法做到或找到任何解決方案。 – iMHitesh

+1

從Xcode 9開始,你可以使用'waitForExistence(timeout:TimeInterval)'來等待這個元素的存在 – onmyway133

回答

2

看起來自動化代碼有時候太快了,雖然可訪問性層次結構的快照有你的元素,但是你的查詢過快地移動到下一條指令,並且框架沒有機會按照您發送的tap()方法行事。我已經能夠通過使用Joe Masilotti的helper functions來等待元素首先被擊中,然後在點擊相關元素之前添加sleep(),從而最小化這個錯誤。 希望這有助於。

+3

是的,這也是我認爲它可能在一開始。但是,即使使用Joe的有用方法,並結合使用'sleep()'的討厭但自由的使用方法,我仍然會遇到這個問題。我認爲這是可訪問性快照如何引用其對象。我花了好幾個小時看着這個,看起來有時它會失去蹤跡,並且意外地引用了錯誤的底層UI元素。我已經通過記錄元素的內存地址並查看快照中的內容來檢查此問題,偶爾會發現它錯誤,這意味着tap()會在錯誤的元素上調用,因此會導致錯誤。 – Gordonium

+0

@Gordinium如果你想知道這個bug,請分享:) – Citronex

4

您可以暫時使用XCUICoordinate.tap()作爲替代。例如,將button.tap()替換爲button.coordinateWithNormalizedOffset(CGVector(dx: 0.5, dy: 0.5)).tap()

我遇到了同樣的問題,解決方法適用於我。

+0

不錯的。也會嘗試這一個。現在我在tap()之前使用了sleep(numberOfSeconds)。 –

3

我有這個問題。它出現在一次修復之後,所以我已經找出了可能導致這種情況的原因。

在我的應用程序中,我有'主'屏幕。它的內容從服務器返回並緩存在設備上。這個屏幕引導用戶到不同的'詳細'屏幕。每次用戶從詳細畫面返回時,在主畫面上調用viewDidAppeare方法。在這個方法主屏幕要求內容。爲了提供內容,'數據管理器'需要從數據庫中獲取數據,或者按照嚴格的順序從服務器2請求不同的實體,因此它使用dispatch_group。主屏幕接收來自dispatch_group_notify調用的關於新內容的通知,這就是爲什麼它是異步的。到時候,當執行dispatch_group_notify時,viewDidAppeare已完成,據我瞭解,應用程序會閒置一段時間。 UI測試引擎可能已經創建了可訪問性元素樹。

當這種情況發生和測試代碼調用tap主屏幕上的一些元素後,右視圖出現,舊的無障礙元素死亡存在(因爲視圖層次結構已更改爲時間),但tap方法要求與元素特別是當時不存在的elementID等。因此你有一個崩潰。

+0

'tl; dr'不要太快用相同的'accessibilityIdentifier'換出UI元素。如果您創建了一個按鈕來重用它,請不要替換它。這在Xcode 9中似乎更加嚴重。 – arsenius

1

我也遇到過這個問題。就我而言,服務器正在快速連續返回多個typeahead搜索查詢結果。目標元素會很快彈出,但在最終查詢之前並不一致。我通過XCTWaiter通過最初等待第一個查詢中元素的存在來解決此問題。然後進行睡眠以涵蓋所有查詢結果的時間,然後等待元素可以被擊中。不要使用hittable作爲第一個查詢結果,因爲這會失敗,因爲hittable也會檢查是否可以挖掘元素,但UI變化太快而無法挖掘元素。

如果您只是爲了測試目的或通過代碼庫觸發最終查詢,那將會更好。我還考慮過使用UIPasteboard來避免多個typeahead查詢,但據我所知,這不適用於XCTest。

0

我嘗試從http://masilotti.com/xctest-helpers/ waitForHittable(),但在我的情況下,我不得不使用睡眠(秒)之前攻絲。

另外,不要認爲喬馬斯洛蒂的方法是無用的。他們很棒,我已經添加了擴展XCTest和擴展XCUIElement。只是在我的應用程序主屏幕加載後,waitForHittable()僅在第一次點擊時無法工作。