Не удается найти DataGrid на форме, используя White UI Framework - PullRequest
1 голос
/ 17 февраля 2012

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

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

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

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

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

Бобби

Ответы [ 3 ]

1 голос
/ 01 февраля 2013

Мне нужен был доступ к dataGrid от White, и я не понял, почему White не сработает (у меня есть источник, и если у меня есть время и покопаюсь в нем), однако, я написал некоторый основной код для извлечения сеткиданные в массив.К счастью, White Framework предоставляет доступ к 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++;
}
1 голос
/ 17 февраля 2012

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

.
0 голосов
/ 24 марта 2016

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...