UI Automation d'une StoreApp

Dans ce post, nous allons voir comment automatiser en C# une application lourde. Cela peut être utile pour tester de manière automatique l'interface utilisateur d'une application ou aussi pour réaliser des tâches en automatique où seule l'interface graphique est disponible.

Avant de rentrer dans le vif du sujet, nous allons avoir besoin de l'outil Inspect que vous pouvez installer avec l'installer de Visual Studio 2017. Pour savoir s'il est installé vous devez vous rendre dans ce répertoire: C:\Program Files (x86)\Windows Kits\10\bin

Faites une recherche sur le fichier inspect.exe, s'il est disponible vous pouvez avancer un peu, sinon vous devez lancer l'installer de Visual Studio 2017, modifier votre installation, cliquez sur Individual Components et sélectionnez Windows 10 SDK (10.0.16299.0) for UWP: C#, VB, JS, votre interface doit ressembler à ça normalement:

Si tout s'est bien passé, inspect.exe est maintenant disponible ici: C:\Program Files (x86)\Windows Kits\10\bin\10.0.16299.0\x64. Nous sommes prêts, nous pouvons attaquer le code!

Lancez Visual Studio et préparez-vous un programme console, il faut ensuite installer le package nuget suivant:

Install-Package FlaUI.UIA3

Nous allons faire faire à la calculatrice l'opération 2+2. Pour commencer nous devons trouver tous les identifiants pour chaque bouton et la textbox pour le résultat. Nous allons lancer à la main la calculatrice et inspect.exe et chercher les propriétés automationId et name dans Inspect.

Une fois que vous avez lancé inspect.exe, assurez-vous que l'option indiquée par la flèche 1 est activée, cette option permet d'entourer en jaune le composant survolé.

Ensuite sur la partie de droite vous avez les propriétés du composant survolé, celles qui nous intéressent sont Name (flèche 2) et AutomationId (flèche 3), c'est grâce à ces propriétés que nous pouvons identifier de manière unique un composant. Attention, la propriété Name n'est pas toujours unique, il faut toujours privilégier la propriété AutomationId quand celle-ci est disponible.

Je vous laisse noter sur un papier ces identifiants pour les boutons 2, +, = et la TextBox qui affiche le résultat.

Passons au code maintenant:

void Main()
{
	// On lance ici la calculatrice
	var app = Application.LaunchStoreApp("Microsoft.WindowsCalculator_8wekyb3d8bbwe!App");
	using (var automation = new UIA3Automation())
	{
		// On s'attache à la fenêtre principale
		var window = app.GetMainWindow(automation);

		// Depuis la fenêtre principale, nous cherchons dans l'arborescence de composants
		// Le bouton par la propriété Name
		var btn2 = window.FindFirstDescendant(c => c.ByName("Two")).AsButton();
		// Les autres composants par la propriété AutomationId
		var btnAdd = window.FindFirstDescendant(c => c.ByAutomationId("plusButton")).AsButton();
		var btnEqual = window.FindFirstDescendant(c => c.ByAutomationId("equalButton")).AsButton();
		var result = window.FindFirstDescendant(c => c.ByAutomationId("CalculatorResults")).AsTextBox();

		// On simule ici les clics sur les boutons
		btn2.Invoke();
		btnAdd.Invoke();
		btn2.Invoke();
		btnEqual.Invoke();
		
		// On introduit une petite pause avant de faire la capture d'écran
		Thread.Sleep(500);
		var screen = FlaUI.Core.Capture.Element(window);
		screen.ToFile(@"c:\dev\screen.png");
		
		// On récupère la partie numérique du résultat
		int actualResult = int.Parse(Regex.Replace(result.Name, "[^0-9]", String.Empty));
		Console.WriteLine($"Result == 4? { actualResult == 4 }");
	}
	// On ferme la calculatrice
	app.Close();
}

Voilà, vous avez une application pour démarrer l'automatisation de vos interfaces graphiques.

FlaUI fonctionne avec des application Winforms / WPF / Store. Si vous faites de l'automatisation d'application Winforms, vous devez utiliser le package FlaUI.UIA2.

Je vous invite à faire un tour sur le github du projet à cette adresse pour aller plus loin: https://github.com/Roemer/FlaUI/