Using The Microsoft UI Automation Library to Drive UI Automation

03 Apr

The UI Automation Library is included in the .NET Framework 3.0. The concept seems to be straightforward. Every UI control is an “AutomationElement” which can be found through searching from the Parent “AutomationElement”. The top AutomationElement is defined as the “RootElement”, which is the Desktop. Another way to get the AutomationElement Object to a given Window is by starting a “Process”, and then using the Process MainWindowHandle to get the AutomationElement object.

The code shown below is basically a test that Invoke Notepad, Enters an input text, and then it compares with the text which is read from Text property of the Notepad Text Field, and then closes Notepad without saving.

using System;
using System.Windows.Automation;
using System.Diagnostics;
using System.Threading;
using System.Collections.Generic;
using System.Text;

namespace UIAuto_01
class Program
static void Main(string[] args)
Console.WriteLine("Starting Notepad!!!");

// #1 Start Notepad
Process notepadProcess = Process.Start("notepad.exe");
AutomationElement aeDesktop = AutomationElement.RootElement;

// #2 Find Notepad
AutomationElement aeNotepad = AutomationElement.FromHandle(notepadProcess.MainWindowHandle);

if (null == aeNotepad)
throw new Exception("Notepad not found!");
Console.WriteLine("Found Notepad !!!!");

// #3 Find Notepad Text Field Control
AutomationElementCollection aeAllTextBoxes =
new PropertyCondition(AutomationElement.ControlTypeProperty,

if (0 == aeAllTextBoxes.Count)
throw new Exception("Notepad Edit field not found!!");

Console.WriteLine("Found Notepad Edit Field!!!!");

AutomationElement aeNotepadDoc = aeAllTextBoxes[0];

// #4 Type the input value
string InputValue = "Hello World!";

// #5 Get the Text from the Text Field
TextPattern tpNotepadDoc = (TextPattern)aeNotepadDoc.GetCurrentPattern(TextPattern.Pattern);
string ActualValue = tpNotepadDoc.DocumentRange.GetText(-1).Trim();

// #6 Compare input and actual
if (ActualValue == InputValue)
Console.WriteLine("Test Passed!");
Console.WriteLine("Test Failed: Expected={0} Actual={1}", InputValue, ActualValue);

// #7 Now close Notepad
WindowPattern wpNotepad = (WindowPattern)aeNotepad.GetCurrentPattern(WindowPattern.Pattern);

// #8 Find The Save, Don't Save, Cancel Dailog
AutomationElement aeSaveDailog = findElement(aeNotepad, "Notepad", 10);
if (null == aeSaveDailog)
throw new Exception("Notepad Save dailog was not found!");

// #9 Find the "Don't Save" button and Click it
AutomationElement aeDontSaveBtn = findElement(aeSaveDailog, "Don't Save", 10);
if (null == aeDontSaveBtn)
throw new Exception("Notepad Don't Save Button was not found!");
InvokePattern ipDontSaveBtn = (InvokePattern)aeDontSaveBtn.GetCurrentPattern(InvokePattern.Pattern);

// #10 Done

// Returns a Automation Element based on the parent AutomationElement, and caption.
private static AutomationElement findElement(AutomationElement parent, string caption, int timeout)
AutomationElement aeNew = null;
int numWaits = 0;
aeNew = parent.FindFirst(TreeScope.Children,
new PropertyCondition(AutomationElement.NameProperty, caption)
} while (aeNew == null && numWaits < timeout);
return (aeNew);


2 responses to “Using The Microsoft UI Automation Library to Drive UI Automation

  1. Anonymous

    May 21, 2008 at 12:10 pm

    Thank u Mr. Issam for this post.Good luckRedouane :<

  2. Anonymous

    November 11, 2009 at 10:15 pm

    I found this site using [url=][/url] And i want to thank you for your work. You have done really very good site. Great work, great site! Thank you!Sorry for offtopic


Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: