2012-03-28 41 views
0

在我的測試應用程序中,我不斷打開並重新打開表單。每次打開表格時,我都必須將表格中的所有元素都變爲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'引發的異常。

回答

2

您需要重新獲取每個新窗口的自動化元素。正如我瞭解UI自動化框架,它爲您提供了調查運行窗口的方法。它將採用不同的技術收集信息,具體取決於目標應用程序使用的框架類型。在你的情況下,如果你創建和銷燬窗口的實例,它們被視爲不同的AutomationElement,因爲它們是不同的窗口(基本上它們在OS中有不同的窗口句柄)。即使底層控制代碼相同,它們也是針對操作系統的不同實例,因此也是UI自動化。

如果您遇到了您正在遭受性能影響的問題,可能需要考慮使用UI Automation COM API,而這在某些操作中速度要快得多。

+0

是的,這是準確的。每當您重新打開該窗口時,這是一套全新的AutomationElements。我第二次嘗試使用本地COM API的建議,它通常傾向於比託管API更好地執行。此外,請確保您的搜索算法的效率與獲得它們一樣高(例如,限制範圍,在適當情況下使用FindFirst而不是FindAll,儘可能使用緩存等)。 – Chaser324 2012-06-01 23:54:57

相關問題