2010-04-19 5 views
1

J'essaie de tester une application WPF à l'aide du framework UI-Automation fourni par MSFT. Quelques scripts PowerShell écrits invoquaient les cmdlets créées pour manipuler les contrôles visuels de l'application.La cmdlet UI-Automation ne trouve pas le contrôle

Il y a un DropDown dans mon application qui a une entrée 'DropDownEntry'. Dans mon cmdlet, je suis en train de faire quelque chose comme suit:

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

La donnée ci-dessus de la null 'retourne snippet lors de l'exécution qui signifie essentiellement que la logique donnée ci-dessus n'a pas pu trouver mon entrée déroulant. Quelqu'un peut-il me dire pourquoi cela pourrait se produire?

J'ai vérifié le nom de mon contrôle et les valeurs. Tout semble être en ordre. Je ne suis pas sûr de savoir pourquoi cela se produirait. Toute aide serait très appréciée.

Merci

Répondre

2

Étant donné qu'il s'agit d'un contrôle DropDown que vous automatisez, il se peut que les éléments enfants ne soient pas disponibles via UIAutomation tant que DropDown n'est pas déroulé.

Vous devez obtenir le modèle ExpandCollapse à partir de l'élément DropDown, puis appeler sa méthode Expand.

J'ai créé des méthodes d'extension pour aider à obtenir des motifs. Voici un exemple

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; 
    } 
} 

utiliser comme ceci:

DropDown.GetExpandCollapsePattern().Expand() 

Ensuite, vous pouvez exécuter votre code d'origine pour trouver l'élément enfant.

+0

@Samuel Jack - Merci. CA aide –

1

Si vous n'êtes pas déjà, vous pouvez vérifier votre application avec UISpy pour vérifier les propriétés.

+0

Merci jws. Je me demandais quel genre de propriétés devrais-je être à l'affût? Dois-je lever des drapeaux si le contrôle auquel j'essaye d'accéder en utilisant UI-Automation n'apparaît pas dans l'arborescence Visual? Tout ce qui est visible dans l'application n'est-il pas accessible en théorie par UI-Automation? –

+0

Cela dépend de l'application, mais si elle est construite avec des contrôles Windows standard, alors tout devrait être accessible avec UIAutomation. Firefox, par exemple, utilise XUL et Gecko, et n'est pas accessible à UIAutomation. Si vous ne voyez pas le contrôle déroulant dans l'arborescence visuelle, ce n'est pas un UIAutomationElement. Si vous ne voyez pas le dropdownentry, alors voyez la réponse de @Samuel Jack. – jaws

Questions connexes