2010-04-19 54 views
1

我想用MSFT提供的UI-Automation框架來測試一個WPF應用程序。有幾個編寫的powershell腳本調用創建的cmdlet來操縱應用程序的可視化控件。UI-Automation cmdlet找不到控件

在我的應用程序中有一個DropDown條目'DropDownEntry'。在我的小命令,我試圖做一些事情如下:

AutomationElement getItem = DropDown.FindFirst(TreeScope.Descendants, 
new AndCondition(
new PropertyCondition(AutomationElement.ControlTypeProperty,ControlType.ListItem), 
new PropertyCondition(AutomationElement.NameProperty, "DropDownEntry",PropertyConditionFlags.IgnoreCase))); 

上面給出的片段返回「空」在執行這實際上是說上面給出的邏輯是無法找到我的下拉條目。

有人可以告訴我爲什麼會發生這種情況嗎?我檢查了我的控件的名稱和值。一切似乎都是按順序進行的。我不知道爲什麼會發生這種情況。任何幫助將非常感激。

感謝

回答

2

由於它是一個DropDown控件,因此您正在自動執行,可能是通過UIAutomation無法使用子項,直到DropDown被下拉。

您需要從DropDown元素中獲取ExpandCollapse模式,然後調用其Expand方法。

我創建了一些擴展方法來幫助獲取模式。這裏有一個例子

public static class PatternExtensions 
{ 
    public static ExpandCollapsePattern GetExpandCollapsePattern(this AutomationElement element) 
    { 
     return element.GetPattern<ExpandCollapsePattern>(ExpandCollapsePattern.Pattern);  
    } 

    public static T GetPattern<T>(this AutomationElement element, AutomationPattern pattern) where T : class 
    { 
     object patternObject = null; 
     element.TryGetCurrentPattern(pattern, out patternObject); 

     return patternObject as T; 
    } 
} 

使用方法如下:

DropDown.GetExpandCollapsePattern().Expand() 

然後你就可以執行你的原代碼,找到子元素。

+0

@塞繆爾傑克 - 謝謝。這有助於 – 2010-04-21 12:05:38

1

如果你沒有準備好,您可能需要使用UISpy檢查你的應用程序來驗證屬性。

+0

謝謝jws。我想知道我應該尋找什麼樣的屬性?如果我正嘗試使用UI-Automation訪問的控件不顯示在Visual樹中,我應該提高標誌嗎?理論上UI-Automation可以訪問應用程序中的任何內容嗎? – 2010-04-20 01:20:01

+0

這取決於應用程序,但如果它使用標準的Windows控件構建,那麼所有的東西都應該可以通過UIAutomation訪問。例如,Firefox使用XUL和Gecko,並且不是UIAutomation可訪問的。如果您沒有看到可視樹中的下拉控件,那麼它不是UIAutomationElement。如果你沒有看到下拉菜單,那麼請看@塞繆爾傑克的答案。 – jaws 2010-04-20 13:56:33