System.Windows.Automation


It has always been difficult to solve UI automation problems. There are many UI automation frameworks not only on the Internet but also internal at Microsoft. Choosing the right one that best fits your need could be difficult. Finally, there is an ultimate solution that’s shipped with .NET 3.0 or later: System.Windows.Automation. It supports automating WPF (Windows Presentation Foundation) applications and will probably support SilverLight applications in the future. Dr. James McCaffrey talked about how to use it at http://msdn.microsoft.com/en-us/magazine/cc163288.aspx. I took his approach and built an automation project. The difference is that I know all the values in the Windows Form Control Name property which identify the objects in the Windows Form application I want to automate. In the code, you will see new PropertyCondition(AutomationElement.AutomationIdProperty, “EndpointTextBox”) versus using AutomationElement.NameProperty. EndpointTextBox is the Control Name property in the Windows Form project I want to automate. 2 references are required to use the automation library: UIAutomationClient, UIAutomationTypes.


using System;


using System.Text;


using System.Windows.Automation;


using System.Diagnostics;


using System.Threading;


using System.Text.RegularExpressions;


using Microsoft.VisualStudio.TestTools.UnitTesting;


// Get the main form element from the desktop


Process ProductServiceCheckProc = Process.Start(FormUIAuto.ProductServiceCheckExePath);


AutomationElement desktop = AutomationElement.RootElement;


AutomationElement mainForm = null;


do


{


    mainForm = desktop.FindFirst(TreeScope.Children,


        new PropertyCondition(AutomationElement.NameProperty, “MDSClientForm”));


    Thread.Sleep(TimeSpan.FromSeconds(this.waitSecond));


}


while (mainForm == null);
// In the Windows Form project being automated, the TextBox.Name property is set to InputFileTextBox
AutomationElement inputFileTextBox = mainForm.FindFirst(TreeScope.Children,


new PropertyCondition(AutomationElement.AutomationIdProperty, “InputFileTextBox”));


Dr. James McCaffrey did not write about how to select a single item from a dropdown list Control. I thought the library would have this format: DropDownList.Select(desiredItem) but it turned out to be desiredItem.Select():


// Find the dropdown list of Name property createService
AutomationElement
endpointComboBox = mainForm.FindFirst(TreeScope.Descendants,


    new PropertyCondition(AutomationElement.AutomationIdProperty, “createService”));


SelectionPattern selectEndpointComboBox = (SelectionPattern)endpointComboBox.GetCurrentPattern(SelectionPattern.Pattern);
// The dropdown list can only select one item


Assert.IsFalse(selectEndpointComboBox.Current.CanSelectMultiple, “ComboBox can select multiple endpoints”);
// Find the item to select in the dropdown list
AutomationElement ItemInDropdown = endpointComboBox.FindFirst(TreeScope.Descendants, new PropertyCondition(AutomationElement.NameProperty, “desiredItem”));
// returns null if the item is not found


Assert.IsNotNull(ItemInDropdown, “Can’t find list item {0} in createService ComboBox”, EndpointName);


SelectionItemPattern ItemInDropdownSelectItem = (SelectionItemPattern) ItemInDropdown.GetCurrentPattern(SelectionItemPattern.Pattern);
// Simulate choosing the item in the dropdown list


ItemInDropdownSelectItem.Select();


It could be difficult to figure out how to automate some controls such as ErrorProvider Class, OpenFileDialog Class, and ToolTip Class. They might have something to do with writing a provider for those controls. If you know how to automate them, please leave a comment with the link to the article.

Comments (2)

  1. enpassant says:

    If you want to see a very different approach to UI development for C/C++ in a graphical environment, check out http://www.xvt.com XVT guides you through the development process from defining the architecture to laying out the interface to building the final application. Using the XVT libraries, you simply compile on all the platforms you need. With XVT, you can:

       * Drag & drop runtime objects to create relationships (hierarchy)

       * Quickly lay out the user interface

       * Customize screen layouts for different monitors

       * Manage object states using a simple tabbed dialog

       * Automatically preserve and regenerate the modifications you elect to make to the C++ code

       * Achieve native language performance without learning proprietary languages or different toolkits

       * Integrate existing or third-party development tools