2011-08-05 5 views
2

J'essaie actuellement d'automatiser une application Windows Forms en utilisant Microsoft UI Automation Library et C#, mais j'ai de gros problèmes concernant les performances. L'identification des éléments individuels en utilisant un PropertyCondition ou une itération sur tous les éléments d'une fenêtre prend très longtemps (jusqu'à 4 minutes). Dès que j'ai un AutomationElement, tout va bien (par exemple GetCurrentPropertyValue réagit dans les 100ms).Mauvaises performances de Microsoft UI Automation Library

La mauvaise performance s'applique uniquement à une application. Je n'ai pas accès à la source mais si quelque chose doit être changé ou vérifié, je peux parler au programmeur responsable. Pour autant que je sache, certains événements (par exemple peinture) ont été écrasés pour l'application. Une fenêtre typique de l'application contient environ ~ 100 éléments qui sont trouvés par la méthode FindAll.

J'ai également essayé l'interface COM de la bibliothèque d'automatisation de l'interface utilisateur, qui est environ deux fois plus rapide, mais cela ne résout pas vraiment le problème.

Quelqu'un a-t-il une idée pour résoudre ce problème ou a-t-il eu un comportement similaire?

Répondre

1

Nous avons trouvé la réponse lorsque nous avons regardé de plus près la boucle principale. Dans la plupart des cas Application.Run est utilisé pour démarrer la fenêtre principale et lancez l'application, mais pour une raison quelconque le code suivant a été utilisé:

[...]  
    MainForm.Show(); 
    while DoStop == false 
    { 
     System.Threading.Thread.Sleep(10); 
     Application.DoEvents(); 
    } 
[...] 

Comme l'interface utilisateur Microsoft Library automatisation utilise des messages de fenêtre, tous les System.Threading .Thread.Sleep (10); résume et fait la détection d'objet devenir vraiment lent. Cela ne se produit pas si Application.Run est utilisé.

+2

Donc, si vous le comprenez correctement, les mauvaises performances étaient essentiellement liées à une application mal écrite sous test, et non au cadre d'automatisation de l'interface utilisateur lui-même? – tomalone

+0

Est-ce le code Thread.Sleep sur l'interface utilisateur qui utilise l'automatisation? Ou l'application qui effectue l'automatisation? Par ailleurs, quelles sont les chances qu'un post SO de 4 ans reçoive ses 2 premiers commentaires dans les 2 jours les uns des autres? –

+1

@Tobias: Celui qui a écrit ce code avec Thread.Sleep était complètement idiot. Malheureusement, votre réponse n'aide pas tous les autres qui observent que UI Automation est extrêmement lent. Même sans ce type d'erreur de programmation stupide dans l'application automatisée, vous trouverez que l'UIA est un gros tas de merde. Il y a beaucoup de bugs, beaucoup de fonctionnalités manquent, ce n'est pas thread-safe et c'est extrêmement lent. – Elmue

Questions connexes