在我的測試應用程序中,我不斷打開並重新打開表單。每次打開表格時,我都必須將表格中的所有元素都變爲AutomationElementCollection
,以便我可以對元素進行操作。但是,重複獲取這些元素似乎很昂貴(由於樹導航/上下文切換等)。如何(正確)緩存AutomationElements以供將來使用?
我試圖圍繞獲取元素的方法設置一個布爾值。如果該方法是第一次調用,它將正常運行,並將布爾值設置爲true。如果該方法被第二次調用,它將不會執行任何操作,因爲該數組已經被填充。
但是,當我試圖對數組中的任何AutomationElement
執行操作(第二次)時,這些元素似乎不可用。以某種方式關閉表單「禁用」這些元素?每次打開表單時,我是否必須找到這些元素,以便它們「新鮮」?
我看着CacheRequest
的方式,但這似乎只涉及訪問屬性/模式,而不是元素。
這裏是代碼/錯誤消息:
AutomationElement GAP;
AutomationElementcollection GAP1;
private bool initGAP1 = false;
public void initGAP()
{
if (!initGAP1)
{
int refnum = ...;
int refnum2 = ...;
AutomationElementCollection temp = MMChildren[refnum].FindAll(TreeScope.Children, findCondition);
GAP = temp.FindAll(TreeScope.Children, findCondition)[refnum2];
GAP1 = GAP.FindAll(TreeScope.Children, findCondition); //this contains the elements I want to operate on
initGAP1 = true;
}
}
System.Windows.Automation.ElementNotEnabledException:類型System.Windows.Automation.ElementNotEnabledException'引發的異常。
是的,這是準確的。每當您重新打開該窗口時,這是一套全新的AutomationElements。我第二次嘗試使用本地COM API的建議,它通常傾向於比託管API更好地執行。此外,請確保您的搜索算法的效率與獲得它們一樣高(例如,限制範圍,在適當情況下使用FindFirst而不是FindAll,儘可能使用緩存等)。 – Chaser324 2012-06-01 23:54:57