Nous avons des tests d'interface utilisateur automatisés pour notre application WPF (.NET 4); ces tests utilisent les API UI Automation.WPF UI Automation - AutomationElement.FindFirst échoue lorsqu'il y a beaucoup d'éléments
Nous appelons AutomationElement.FindFirst pour trouver un élément cible, puis interagir avec lui.
Exemple (pseudo-code):
var nameEquals = new PropertyCondition(AutomationElement.NameProperty, "OurAppWindow");
var appWindow = DesktopWindow.FindFirst(TreeScope.Children, nameEquals);
// this succeeds
var idEquals = new PropertyCondition(AutomationElement.AutomationIdProperty, "ControlId");
var someItem = appWindow.FindFirst(TreeScope.Descendants, idEquals);
// this suceeds sometimes, and fails sometimes!
Le problème est, le appWindow.FindFirst
va parfois échouer et retourner nulle, même si l'élément est présent. J'ai écrit une fonction d'assistance qui parcourt manuellement l'arborescence de l'interface utilisateur et l'imprime, et l'élément avec l'ID correct est présent dans tous les cas.
Cela semble être lié au nombre d'autres éléments affichés dans la fenêtre. S'il n'y a pas d'autres éléments, cela réussit toujours, mais quand de nombreux autres éléments d'interface utilisateur complexes sont affichés à côté, la recherche échoue.
Il semble que nous atteignions une sorte de limite d'élément interne. Je ne trouve aucune limite d'élément documentée mentionnée pour les API d'automatisation - y a-t-il un moyen de contourner ce problème? Je pense que je devrais écrire ma propre implémentation de FindFirst
qui fait marcher l'arbre lui-même manuellement ... Autant que je sache, cela devrait fonctionner, parce que ma fonction d'utilitaire arbre-arbre fait exactement cela, et ça va, mais il semble que ce serait :-(inutile et lent
Toute aide serait grandement appréciée
Je travaille depuis quelques jours avec le framework UI Automation et c'est vraiment dommage que je trouve autant de bugs. Il est plein de bugs à tous les niveaux. Microsoft a fait un travail très bâclé. Mais les bogues semblent être du côté serveur du framework car cela fait une grande différence si vous automatisez une application Win32, WPF ou .NET Forms. En fonction du framework d'interface utilisateur sous-jacent, vous obtenez d'autres types de bogues. De plus, de nombreux contrôles ne sont pas supportés du tout ou la fonctionnalité est si basique que vous ne pouvez pas les automatiser. – Elmue