Blog de JP Gouigoux

29/06/2008

Microsoft UI Automation : déçu, encore une fois…

Filed under: .NET,UIAutomation — jpgouigoux @ 2:16
Tags: , , , ,

Que je vous expose mon problème, avant tout : ça fait presque dix ans que je cherche une méthode efficace pour tester des interfaces rapides. J’ai essayé des outils commerciaux (Mercury et consorts), des outils gratuits, des méthodes (instrumentation, scripting VSA, invocation sur hooks, etc.), des bidouilles ignobles (surcharger la librairie ManagedSpy de Ben Wulfe de Microsoft R&D, entre autres). J’ai posé le problème aux DevDays suite à la présentation de Rosario, harcelé des gens de Microsoft pour leur demander quand on aurait enfin un outil pour faire du test d’interface.

Et il y a deux jours, j’ai cru avoir enfin trouvé la voie. Un article de Programmez parlait de UI Automation, qui est un framework d’accessibilité, permettant de parcourir et de lire les contrôles de manière externe au programme cible. Ce framework est intégré à .NET 3.5. Je me renseigne un peu, trouve quelques liens intéressants, et me demande pourquoi mes recherches ne m’avaient pas fait trouvé cette technologie. J’ai pourtant passé un bon bout de temps à chercher ce qui se faisait en .NET, mais visiblement pas avec les bons mots clés.

Bref, je me mets à l’oeuvre en ouvrant Visual Studio 2008, et en rajoutant les références sur UIAutomationClient et UIAutomationTypes, et je reprends l’exemple trouvé sur http://blogs.developpeur.org/tom/archive/2007/07/25/wpf-wpf-ui-automation-rendez-vos-interfaces-graphiques-accessibles.aspx en me disant qu’il ne devrait pas être trop dur de l’étendre pour insérer du texte dans un notepad depuis une application console extérieure.

C’est là que les choses se corsent. J’ai d’abord la surprise de découvrir que UISpy ne fait pas partie du SDK 6.0. Voir à ce sujet http://blogs.msdn.com/windowssdk/archive/2008/02/18/where-is-uispy-exe.aspx. Ce n’est pas grave, je télécharge, j’installe le tout comme un 6.1, et je découvre la structure du notepad grâce à l’outil UISpy. Il y a un élément de type document, qui semble être le contrôle par défaut. Je lui associe un TextPattern, sur lequel un DocumentRange me donne accès à GetText(). Bizarre, il n’y a pas de SetText()…

Mon premier réflexe est de me dire que l’injection doit se faire avec un autre pattern que la lecture de texte. Je trouve un bon candidat, à savoir le InvokePattern, mais ça ne sert apparemment pas à ça, ou bien je n’ai pas compris comment ça fonctionne exactement. Avant de poursuivre plus loin, je me dis que je ferais mieux de me renseigner un peu plus sur le pourquoi de l’absence d’un SetText() dans le TextPattern. Et ce que je trouve sur http://msdn.microsoft.com/en-us/library/ms745158.aspx à la rubrique Security me confirme mes doutes : dixit l’article, « Microsoft UI Automation text providers supply read-only interfaces and do not provide the ability to change the existing text in a control ». Bref, c’est plié encore une fois pour l’automatisation des tests d’interface.

Au passage, la sécurité a bon dos : c’est tout à fait possible d’injecter des valeurs dans un contrôle en passant par les API Win32, ou même en utilisant ManagedSpy.dll (je tiens le code à disposition si quelqu’un est intéressé). Si on voulait simplement empêcher la nouvelle technologie de prendre ce risque, il était également possible de mettre en place un système autorisant la modification distante à condition qu’une autorisation ait été donnée par avance. Ca peut être fait avec un certificat, un token, n’importe quoi. Même si ça ne fonctionne pas avec des applications existantes et que ça force les applications cibles à rajouter une propriété quelconque dans leur code. Ou bien un setting quelque part dans la base de registre, n’importe.

Ma conclusion est la suivante. De deux choses l’une :

  1. Microsoft ne veut pas qu’on fasse de l’automatisation de tests automatisés d’interface avec ses outils. Il est également possible que les problèmes qu’on rencontre avec une approche ManagedSpy (impossibilité de sauter d’un handle de fenêtre principale à un handle de dialogue modal, etc.) existent toujours avec l’approche UI Automation (je ne serais d’ailleurs pas étonné que les deux approches utilisent le même principe, vu la proximité étonnante de UISpy.exe avec ManagedSpy.exe). Peut-être que c’est tout simplement impossible sous Windows…
  2. Je suis passé à côté d’un truc, et il est possible d’envoyer du texte dans un contrôle depuis UI Automation en utilisant un autre pattern. Je dois dire que ce cas-là me ravirait… Oui, je serais content de me faire traiter d’andouille par n’importe qui qui pourra m’apporter un code réalisant enfin ce que je veux faire depuis 10 ans que je bosse dans l’informatique.
Publicités

5 commentaires »

  1. […] un post précédent (Microsoft UI Automation : déçu, encore une fois…), j’avais expliqué ce qui, selon moi, faisait que le framework UI Automation ne permettait […]

    Ping par UI Automation : cent fois sur le métier remettez votre ouvrage… « Blog de JP Gouigoux — 12/08/2008 @ 8:27 | Réponse

  2. rick…

    excelent post, keep it coming…

    Rétrolien par rick — 30/10/2010 @ 11:48 | Réponse

  3. Hello JP,

    Ton aventure me rappel la mienne il y a deux mois de cela.
    Je me suis moi aussi confronté au problème des élément de type « Document »…
    La seule solution que j’ai trouvé pour insérer du texte dans cette saleté de contrôle est d’utiliser la commande .NET « System.Windows.Forms.SendKeys.SendWait » (après avoir pris soin de donner au contrôle le focus bien sur).

    C’est moche je sais… mais ça a le mérite de fonctionner !

    Est-ce que de ton côté tu as trouvé une solution plus propre ?

    Merci d’avance !

    Commentaire par Squall — 12/04/2012 @ 8:14 | Réponse

    • Bonjour,

      Malheureusement, je n’ai rien trouvé de mieux pour l’instant. Il me faut toutefois avouer que je n’ai plus beaucoup donné d’attention à ce sujet depuis pas mal de temps. Il faudra un jour que j’interroge quelqu’un de chez Microsoft qui connaîtrait bien UIAutomation, et qui pourrait me renseigner. Si je trouve du nouveau, je le rajouterai ici en commentaire.

      JP

      Commentaire par jpgouigoux — 15/04/2012 @ 8:57 | Réponse

      • Ok merci.

        De mon côté aussi, si j’ai l’occasion d’interroger quelqu’un de chez Microsoft sur se sujet, je posterais ma petite réponse ici.

        Squall.

        Commentaire par Squall — 16/04/2012 @ 9:09


RSS feed for comments on this post. TrackBack URI

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s

Créez un site Web ou un blog gratuitement sur WordPress.com.

%d blogueurs aiment cette page :