2010-06-08 165 views
2

我們已經爲我們的WPF應用程序(.NET 4)進行了一些自動UI測試;這些測試使用UI Automation API。WPF UI自動化 - AutomationElement.FindFirst在有很多元素時失敗

我們稱AutomationElement.FindFirst找到一個目標元素,然後與它進行交互。

實施例(僞代碼):

var nameEquals = new PropertyCondition(AutomationElement.NameProperty, "OurAppWindow"); 
var appWindow = DesktopWindow.FindFirst(TreeScope.Children, nameEquals); 
// this succeeds 

var idEquals = new PropertyCondition(AutomationElement.AutomationIdProperty, "ControlId"); 
var someItem = appWindow.FindFirst(TreeScope.Descendants, idEquals); 
// this suceeds sometimes, and fails sometimes! 

的問題是,所述appWindow.FindFirst有時會失敗並返回null,即使當元件是存在的。我已經編寫了一個輔助函數,用於手動瀏覽UI自動化樹並將其打印出來,並且在所有情況下都存在具有正確ID的元素。

它似乎與窗口中還顯示了多少其他項目有關。如果沒有其他項目,那麼它總是成功的,但是當許多其他複雜的UI元素與其一起顯示時,則查找失敗。

看起來好像我們正在觸及某種內部元素限制。我找不到任何自動化API提到的任何文檔元素限制 - 是否有解決方法?我想我可能不得不寫我自己的實現FindFirst這是手動樹手動本身......據我可以告訴這應該工作,因爲我的樹型打印機實用程序功能正是這樣做,並沒有問題,但好像這將是不必要的,緩慢:-(

任何幫助,將不勝感激

+0

因爲有些UI自動化框架的日子,我現在工作,它真的很遺憾我發現有多少錯誤。它是所有級別上的錯誤的全部。微軟做了一個非常草率的工作。但是這些錯誤似乎在框架的服務器端,因爲如果你自動化一個Win32,WPF或.NET Forms應用程序,它會產生很大的不同。根據底層的UI框架,你會得到其他類型的錯誤。此外,許多控件根本不受支持,或者功能非常基礎,您無法自動執行它們。 – Elmue 2016-11-17 03:00:05

回答

2

做樹人工走路可能是解決這個問題的最好辦法。

而事實上,你可能會發現使用樹行走的實現FindFirst將會更快,因爲在大麻木的元素上使用FindFirst呃孩子。如果您在Reflector中查看AutomationElement.FindFirst的代碼,您會發現它的工作原理是將所有符合條件的孩子拉入自動化邊界,然後返回第一個孩子。相比之下,TreeWalker方法只會試圖拉動跨越邊界的單個第一個孩子。

+0

這就是我最終做的事,雖然我沒有使用任何UI自動化TreeWalkers,但我只是做了一個遞歸的'foreach(x.children中的孩子)'。它太慢了,所以我會考慮使用'TreeWalker'類,看看是否有幫助 – 2010-06-22 03:11:31

2

我在自動化的應用程序中遇到了同樣的問題。我有一個AdornerLayer上的自定義控件,我正在修改UI自動化樹,所以Adorner的AutomationElement作爲UI視覺子對象出現在它正在裝飾的控件上,而不是作爲應用程序根目錄的子項出現。

當我運行UI間諜時,我會在輸出窗口中看到一些錯誤,指出在導航樹時導致無效父項的事情。我在代碼中解決了一個錯誤,那就是我如何爲Adorner的AutomationElement自動化AutomationElement。一旦我解決了這個錯誤,UI Spy不再在輸出窗口中顯示錯誤,並且我不再從FindFirst方法調用中失敗。

如果原始海報仍然在監視這個問題,我會問UI間諜有任何問題導航通過您的應用程序?

+0

我在哪裏得到UISpy?我從來沒有能夠找到它的下載:-( – 2010-09-30 02:23:33

+0

你必須通過微軟作爲SDK的一部分下載它。試試這裏:http://www.microsoft.com/downloads/en/details.aspx? familyid = 4377F86D-C913-4B5C-B87E-EF72E5B4E065&displaylang = en根據某人你只需要選擇「.NET開發工具」,我從一個不同的完整的SDK下載中獲得了UISpy – RodKnee 2010-10-06 16:53:37

-1

我甚至堅持這個問題,但我只是沒有看到我的失敗。

var window = new System.Windows.Window(); 
window.Show(); 
window.Content = addControl; 
GetWindow(window.Name); 

我創建了一個窗口並添加了控件作爲窗口的內容。我的失敗是,我顯示了窗口,然後分配了內容。這甚至失敗。經過幾個小時的搜索,我改變它我的代碼:

var window = new System.Windows.Window(); 
window.Content = addControl; 
window.Show(); 
GetWindow(window.Name); 

...它的工作原理。

邁克爾

+0

真是太遺憾了!題! – Elmue 2016-11-17 02:54:51