Не удается найти DataGrid в форме с использованием инфраструктуры белого пользовательского интерфейса

Несколько дней назад я получил требование создать автоматизированные тестовые примеры пользовательского интерфейса для моего приложения Windows (framework 2.0).

Я решил использовать Белый в качестве среды тестирования пользовательского интерфейса. Теперь все работает отлично, за исключением того, что я не могу найти элемент управления DataGrid, который отображает 3 записи (примечание: это не DataGridView), используя белую структуру.

Я использовал приложение VisualUIAVerify, чтобы убедиться, что DataGrid действительно находится в форме и имеет тип элемента пользовательского интерфейса «Таблица», и я определенно используя правильный AutomationId для элемента управления, но все равно не повезло.

Как упоминалось ранее, я могу найти все элементы управления в форме, кроме DataGrid. Я делаю что-то неправильно ? Или дело в том, что белый просто не поддерживает DataGrid.

Любая помощь будет отличной. Спасибо

Бобби


person Bobby    schedule 16.02.2012    source источник


Ответы (3)


В конце пришлось обновить мое приложение, чтобы использовать элемент управления DataGridView, а не использовать DataGrid. Похоже, это решило проблему, поскольку Уайт не поддерживает DataGrid.

person Bobby    schedule 17.02.2012

Мне нужен был доступ к dataGrid от White, и я не понял, почему White не будет работать (у меня есть исходный код, и если у меня есть время, чтобы покопаться в нем), однако я написал некоторый базовый код для извлечения данных сетки в множество. К счастью, структура White предоставляет доступ к AutomationElement.

Приведенный ниже код не оптимизирован ... он был собран в LinqPad!

// The first few lines use White
var application = Application.Attach("AppName");
var window = application.GetWindow("The Window Title");
var datagrid = window.Get<White.Core.UIItems.TableItems.Table>("dataGridAutomationId").AutomationElement;

// Now it's using UI Automation
var headerLine = datagrid.FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Header));
var cacheRequest = new CacheRequest { AutomationElementMode = AutomationElementMode.Full, TreeScope = TreeScope.Children };
cacheRequest.Add(AutomationElement.NameProperty);
cacheRequest.Add(ValuePattern.Pattern);
cacheRequest.Push();
var gridLines = datagrid.FindAll(TreeScope.Children, new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Custom));
cacheRequest.Pop();

Console.WriteLine (headerLine.Count + " columns");
Console.WriteLine (gridLines.Count + " rows");

var gridData = new string[headerLine.Count, gridLines.Count];

var headerIndex = 0;
foreach (AutomationElement header in headerLine)
{
  gridData[headerIndex++, 0] = header.Current.Name;
}

var rowIndex = 1;
foreach (AutomationElement row in gridLines)
{
  foreach (AutomationElement col in row.CachedChildren)
  {
    // Marry up data with headers (for some reason the orders were different
    // when viewing in something like UISpy so this makes sure it's correct
    headerIndex = 0;
    for (headerIndex = 0; headerIndex < headerLine.Count; headerIndex++)
    {
      if (gridData[headerIndex, 0] == col.Cached.Name)
        break;
    }

    gridData[headerIndex, rowIndex] = (col.GetCachedPattern(ValuePattern.Pattern) as ValuePattern).Current.Value;
  }
  rowIndex++;
}
person Phil    schedule 01.02.2013

Я не уверен, что у вас точно такая же проблема, как у меня, потому что у меня недостаточно вашего кода, но я боролся с той же проблемой с приложением WPF, где я пытался получить доступ к DataGrid, который на самом деле был написан как элемент GridView, который находился внутри ListView.

Решением моей проблемы было сказать Уайту, чтобы он получил элемент ListView (например, TestStack.White.UIItems.ListView), а не таблицу, тогда все сработало.

person LordWilmore    schedule 24.03.2016