簡體   English   中英

過時的 UI 自動化樹

[英]Outdated UI automation tree

我正在嘗試使用新的本機 Microsoft UI 自動化界面 3.0(在 VC++ 2010、Win7 中)編寫自動化測試儀應用程序。 被測應用程序 (AUT) 是一個 WPF 應用程序。

幾乎一切正常……我可以安裝事件處理程序,在樹中導航,使用各種條件搜索元素並使用它們的模式控制找到的元素。

但是昨天我發現了一種讓我感到絕望的行為:通過單擊主菜單按鈕之一切換其 GUI 主面板后,我的 AUT 的 UIA 樹根本沒有更新。

單擊主菜單按鈕后,我可以在 AUT 的 GUI 中看到新的小部件,但 UIA 樹仍然包含單擊主菜單按鈕之前已經存在的控件。 (過時的)UIA 樹仍然可以使用搜索功能或使用 walker 完全讀取,但當然不能寫入,因為小部件不再存在。

這看起來就像有一個過時的緩存......但是我根本不使用任何緩存 UIA 函數。 沒有任何。 絕不。 無處。

我無法以編程方式更新 UIA 樹……既不是通過調用任何 UIA 函數,也不是通過重新啟動測試應用程序,也不是通過來回切換 AUT 的 GUI。 這不會每次都發生。 有時在單擊主按鈕后,樹似乎是最新的,並且一切正常。 但是,大多數運行都失敗了。 只有一種(神秘的)方法可以可靠地更新 UIA 樹:使用inspect.exe。 當使用inspect.exe 工具簡要查看AUT 的UIA 子樹時,問題突然消失了,我的測試應用程序可以立即訪問實際的、更新的樹! 當然重啟AUT后問題又出現了。

檢查.exe 做什么來使 UIA 樹(另一個應用程序的!!!)更新? 如何在不使用任何緩存的情況下訪問消失的元素? 我錯過了什么?

我真的需要幫助。


好的,還有一些發現:

  1. UISpy.exe 能夠以與inspect.exe 相同的神秘方式刷新UIA 樹(這尤其奇怪,因為inspect.exe 使用與我相同的本機接口,但UISpy.exe 使用.NET 接口AFAIK)。 這意味着這是一種系統范圍和持久的 UIA 問題,而不是純粹的原生 UIA 問題。

  2. 如果我切換視圖之前沒有訪問樹,問題就不會發生。 即,如果我的測試應用程序在通過單擊主菜單按鈕切換視圖之前沒有訪問 AUT 的視圖,它會毫無問題地看到新的小部件。 這強烈表明本機 UIA API 存在一些緩存問題 - 即使我不知道這是如何發生的,因為我根本不緩存。 有人知道是否有一些內部緩存發生嗎?

我認為這可能是一個 API 錯誤。 然而,考慮到我目前使用 Microsoft Connect 的經驗,我有點迷失了那個展示者:-(

有人有什么想法嗎?


我還測試了 Snoop 工具。 使用 Snoop 並不能像 Inspect 和 UISpy 那樣暫時解決問題。 關於Inspect.exe,還有一個細節……折疊和展開AUT的子樹足以暫時治愈問題。

好的,更新這個。 UIA 只是看起來非常糟糕。 我發現讀取元素的內容數組和該數組的長度會更新隱藏的緩存。 我還有一個案例,選項卡的子樹沒有更新,但可以通過切換到另一個選項卡並返回來更新(在這種情況下,按模式讀取內容沒有幫助)。 這兩種情況都是可重復的,但我找不到任何方法來預測或預防它們。 此外,許多第三方 WPF 組件似乎都有問題。 我們最終放棄了使用那個 API。

我知道這個問題很老了,但我想出了Inspect.exe為其他應用程序刷新 UIA 樹的作用:查看選項菜單; 默認情況下,有一個標有SPI_SCREENREADER flag的項目。

在您的代碼中執行以下操作,您可能會得到一個新的 UIA 樹:

SystemParametersInfo( SPI_SETSCREENREADER, TRUE, NULL, SPIF_UPDATEINIFILE | SPIF_SENDCHANGE);

PostMessage( HWND_BROADCAST, WM_WININICHANGE, SPI_SETSCREENREADER, 0);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM