White — фреймворк для создания автотестов. У него приличный набор windows контролов и достаточно симпатичный API который позволяет легко реализовывать тестовые сценарии.
Для примера напишем тест, который будет проверять работу Notepad. Сценарий примерно такой:
- запускаем Notepad;
- в текстовое поле пишем «Привет, мир!»;
- сохраняем документ в текстовый файл;
- проверяем, что файл создан и что его содержимое эквивалентно введенному тексту.
Для начала нужно скачать UI Automation Verify - это утилита для автоматизированного тестирования которая позволяет легко и быстро находить элементы управления и работать с ними. При запуске утилита сканирует все открытые окна и строит карту контролов для каждого из них. В левой части утилиты находится панель со всеми найденными элементами, а в правой — их свойства.

Если какой-то элемент не найден — включаем «режим» Focus Tracking и добираемся нужного контрола. Все что встретится по пути — будет автоматически добавлено к уже существующей мапе.
Переходим к реализации. Создадим проект тестирования и установим White пакет, для этого открываем Package manager console (Alt+T+N+O) и выполняем команду Install-Package TestStack.White.
Создаем новый файл теста и пишем туда такой вот код:
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.IO;
using TestStack.White;
using TestStack.White.UIItems;
using TestStack.White.UIItems.Finders;
using TestStack.White.UIItems.MenuItems;
using TestStack.White.UIItems.WindowItems;
using TestStack.White.UIItems.WindowStripControls;
namespace WhiteTest
{
[TestClass]
public class NotepadeTest
{
[TestMethod]
public void SavingFileTest()
{
//Запускаем приложение
var notepad = Application.Launch("notepad");
//Находим в нем главное окно
var winMain = notepad.GetWindow("Untitled - Notepad");
//Находим в окне область ввода текста и пешем в нее "Hello, world!"
var textArea = winMain.Get<TextBox>(SearchCriteria.ByAutomationId("15"));
textArea.Text = "Hello, world!";
//еще вводить текст можно так: textArea.Enter("Hello, world!")
//На главном окне находим MenuBar
var menu = winMain.Get<MenuBar>(SearchCriteria.ByAutomationId("MenuBar"));
//Навигация по меню осуществляется методом MenuItem который принимает список подменю
var btnSaveAs = menu.MenuItem("File", "Save As...");
//Кликаем по кнопке "Save As..."
btnSaveAs.Click();
//Получаем модальное диалоговое окно "Save As"
var winSaveFileDialog = winMain.ModalWindow("Save As");
//В диалоговом окне находим поле для ввода имени файла и пешем туда "D:\\test.txt"
var tbFileName = winSaveFileDialog.MdiChild(SearchCriteria.ByAutomationId("1001"));
tbFileName.Enter("D:\\test.txt");
//Ищем кнопочку "Save" и кликаем на нее
var btnSave = winSaveFileDialog.Get<Button>(SearchCriteria.ByText("Save"));
btnSave.Click();
//Если файл уже существует, то может появиться окно подтверждения перезаписи файла
//если такое окно нашлось, то кликаем кнопку "Yes"
var winConfirmationDialog = winSaveFileDialog.ModalWindow("Confirm Save As");
if (winConfirmationDialog != null)
{
var btnYes = winConfirmationDialog.Get<Button>(SearchCriteria.ByText("Yes"));
btnYes.Click();
}
//Закрываем приложение
notepad.Close();
//Проверяем наличие файла и его содержимое
Assert.IsTrue(File.Exists("D:\\test.txt"));
Assert.AreEqual(File.ReadAllText("D:\\test.txt"), "Hello, world!");
}
}
}Если во время выполнения возникает ошибка NonComVisibleBaseClass, то лезаем в Debug настройки и отключаем эту опцию.

- Переходим в меню Debug->Exceptions...
- Раскрываем «Managed Debugging Assistants»
- Убираем галочку с опции NonComVisibleBaseClass Thrown.
- Нажимаем [Ok]
Для первого раза достаточно, дальше рассмотрим еще некоторые интересные примеры и решение проблем которые возникают в ходе работы с фреймворком.