L’automatisation de test me titille à nouveau…
Dans 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 pas de faire de l’automatisation de test : le manque de possibilité d’écrire dans une zone de texte. En effet, je veux bien croire que certaines applications fonctionnent uniquement avec des boutons, mais moi je bosse sur des applications de gestion, qui sont utilisées par des secrétaires et des personnes qui instruisent des dossiers, et quand ils s’en tapent une centaine pas jour, ils ont usé le clavier…
Bref, je pensais avoir tiré une croix sur le sujet, et voilatipa qu’un nouvel article sort là-dessus, dans les flux RSS qui s’affiche au démarrage de Visual Studio. L’auteur n’est autre que Frédéric Queudret, qui était également l’auteur si je me rappelle bien d’un article dans Programmez! sur le même sujet. Je me dis qu’il y a peut-être du nouveau, et surtout une réponse à mon interrogation : dans mon post précédent, je finissais en disant que je serais heureux de me faire traiter d’andouille par quelqu’un qui peut me montrer que je suis passé à côté de la plaque, et je le pense vraiment.
Me voilà donc sur l’article cité, et l’exemple n’est pas avec le notepad comme dans les tutoriels que j’avais trouvé sur le sujet : chouette, ça veut dire que c’est du nouveau. Donc peut-être avec une réponse à ce fameux problème : comment entrer du texte ?
L’application traitée est la calculatrice. On va donc vérifier un calcul. Et donc avoir à entrer des données. Youpi, on chauffe !
Et bien non : c’est là tout l’avantage de cette application : il y a des boutons sur lesquels on tape pour rentrer du texte. Vous l’avez compris : le test automatisé pour vérifier que la calculatrice donne bien trois quand on tape 1 + 3 consiste à simuler le clic sur le bouton 1, puis sur le bouton +, etc.
Voyons les choses du bon côté : ça tend à prouver tout simplement ce que j’avais conclu l’autre fois, et je vois s’éloigner les chances de me faire traiter à juste titre d’andouille. Le mauvais côté des choses est que je suis toujours bredouille.
Il paraît que la CTP de Rosario prend en charge les tests automatisés. J’espère deux choses :
- que Microsoft aura étendu son UI Framework, ou au pire créé des hooks sur les contrôles pour pouvoir entrer du texte
- que les commerciaux de Microsoft seront un jour au courant de ce qui se passe dans leur application avant de l’apprendre par des blogs de personnes extérieures à leur société : j’ai demandé plusieurs fois au commercial France sur Visual Studio si il y allait avoir quelque chose là-dessus, et il n’était au courant de rien. Même chose aux TechDays.
En attendant, je vais envoyer de ce pas un petit mail à Frédéric Queudret en lui proposant de me traiter d’andouille, à condition qu’il me donne la solution à ce problème de 10 ans ! Si des gens lisent ce post, je m’engage à vous tenir au courant de sa réponse, et de ma quête sans fin sur ce sujet…
[Edit]
Comme je reporte ce post depuis mon ancienne plateforme de blog, je reprends les commentaires à la main.
Miboboio :
private void WriteToTextbox(AutomationElement Parent, string AutomationId,string Text)
{if (Parent != null)
{
//Find textbox
PropertyCondition idCond = new PropertyCondition(AutomationElement.AutomationIdProperty, AutomationId);
AutomationElement CurrentTextbox = Parent.FindFirst(TreeScope.Descendants, idCond);if (CurrentTextbox != null)
{try
{TextPattern txtPattern = CurrentTextbox.GetCurrentPattern(TextPattern.Pattern) as TextPattern;
// Once you have an instance of an AutomationElement,
// check if it supports the ValuePattern pattern.
object valuePattern = null;// Control does not support the ValuePattern pattern
// so use keyboard input to insert content.
//
// NOTE: Elements that support TextPattern
// do not support ValuePattern and TextPattern
// does not support setting the text of
// multi-line edit or document controls.
// For this reason, text input must be simulated
// using one of the following methods.
//
if (!CurrentTextbox.TryGetCurrentPattern(
ValuePattern.Pattern, out valuePattern))
{// Set focus for input functionality and begin.
CurrentTextbox.SetFocus();// Pause before sending keyboard input.
Thread.Sleep(100);// Delete existing content in the control and insert new content.
SendKeys.SendWait(« ^{HOME} »); // Move to start of control
SendKeys.SendWait(« ^+{END} »); // Select everything
SendKeys.SendWait(« {DEL} »); // Delete selection
SendKeys.SendWait(Text);
}
// Control supports the ValuePattern pattern so we can
// use the SetValue method to insert content.
else
{// Set focus for input functionality and begin.
CurrentTextbox.SetFocus();((ValuePattern)valuePattern).SetValue(Text);
}}
catch (Exception ex)
{Assert.Fail(ex.Message);
}
}
}
else
{
Assert.Fail(« parent is null »);
}
}