Попытка найти конкретный WpfControl для использования в тестах закодированного пользовательского интерфейса

Я пытаюсь создать несколько закодированных тестов пользовательского интерфейса, которые будут использоваться много раз над «набором» элементов управления WPF. Я могу использовать построитель тестов Coded UI для создания каждого теста по отдельности, но я хочу создать «общий» случай, поскольку каждый тест очень похож с небольшими изменениями.

Чтобы создать этот общий случай, мне нужно иметь возможность найти (затем щелкнуть) элемент управления с заданным родителем (в данном случае WpfWindow; элемент управления, который я ищу, имеет несколько уровней глубины, но я хочу иметь возможность найти управление независимо от глубины). Мне удалось найти элемент управления, который я ищу, с помощью AutomationElement, но закодированному пользовательскому интерфейсу он, похоже, не нравится, и я не могу щелкнуть его после того, как нашел.

Я попытался использовать GetChildren() в родительском окне, а затем рекурсивно найти соответствующий элемент управления. Я использую SearchProperties для поиска Name и ControlType конкретного элемента управления WPF, который я ищу, но не похоже, что все имеет Name, и он терпит неудачу.

Я также пытался просто установить SearchProperties для определенного элемента управления, но он выдает исключение, говорящее, что его невозможно найти.

Какие-либо предложения? Правильно ли я делаю это, или я упускаю что-то фундаментальное?

Помимо этого: насколько «плохо» иметь аналогичные тесты закодированного пользовательского интерфейса, созданные с помощью построителя тестов закодированного пользовательского интерфейса? Я имею в виду, что кажется неправильным создавать 800 различных тестов с помощью Coded UI Test Builder, каждый из которых имеет одни и те же первые 5 шагов (с небольшими различиями в зависимости от того, где он выполняется).


person user2996787    schedule 15.11.2013    source источник


Ответы (2)


Я пересмотрел решение AutomationElement и смог выяснить часть щелчка.

public AutomationElement findControl(AutomationProperty propertyOfItem, string itemToSearchFor, System.Windows.Automation.ControlType controlType)
{
            Condition condition = new System.Windows.Automation.AndCondition(
                   new System.Windows.Automation.PropertyCondition(propertyOfItem, itemToSearchFor),
                   new System.Windows.Automation.PropertyCondition(AutomationElement.ControlTypeProperty, controlType));

            AutomationElement foundControl = AutomationElement.RootElement.FindFirst(TreeScope.Descendants | TreeScope.Children, condition);
            return foundControl;
}

Часть клика получает точку клика из AutomationElement и сохраняет ее в System.Windows.Point и на основе этого создает System.Drawing.Point. Затем вызывает Mouse.Click() в этой точке.

person user2996787    schedule 21.11.2013

Как мы справились с этим, записав элементы управления, но не шаги. Затем вы можете передать элемент управления, который отображается с полным parent-parent-parent . . . -родительское отображение в метод.

ControlB = genericControl(parentWindow,     
    "ControlType","Button","ControlName","Send");
TestOne(ControlB);
TestOne(ControlC);

public void TestOne(UITestControl control, string Value)
{ 
    //do stuff
    Mouse.Click(control);
    Assert.AreEqual(Value, control.GetProperty("InnerText"));
}

общий контроль:

public UITestControl genericControl(UITestControl parentWindow, String Property1, String Value1, String Property2, String Value2)
{
    UITestControl control = new UITestControl(parentWindow);
    control.TechnologyName = "MSAA";
    control.SearchProperties.Add(Property1, Value1, Property2, Value2);

    return control;
}

и Т. Д.

Если каждый шаг является общим, он должен работать.

ETA — у вас должны быть некоторые характеристики элемента управления, который вы хотите использовать. если вы не хотите использовать FindAllMatchingControls и перебирать все элементы управления или разные типы для фильтрации списка, вам необходимо иметь уникальную идентификационную информацию для каждого элемента управления.

person yonitdm    schedule 15.11.2013
comment
Я не совсем уверен, что это помогает. Да, это общее, но моя проблема на самом деле заключается в том, чтобы найти конкретный элемент управления, который я хочу. Проблема здесь заключается в том, чтобы передать управление public void TestOne(UITestControl control, string Value) - person user2996787; 15.11.2013
comment
Я понимаю что ты имеешь ввиду. Я предполагаю, что мой следующий вопрос заключается в том, как получить элемент управления с полным отображением parent-parent-parent...-parent, когда один или несколько родителей относятся к текущему запуску. Например, конец моего элемента управления выглядит так: ...UIBrowseTreeCustom.UITreeViewTree.UICNameTreeItem.UIItemTreeItem;, где CName относится к имени компьютера, на котором был создан закодированный тест пользовательского интерфейса. Я собираюсь попробовать что-нибудь, потом вернусь. - person user2996787; 15.11.2013
comment
Теперь мы в центре внимания!! В окне свойств объекта вы можете изменить свойство поиска на «Содержит» из «Равно», чтобы вы могли иметь имя = WindowParent123d для имени. Содержит (WindowParent), и он найдет совпадение. Вы также можете изменить/удалить заголовки окон для элемента управления. - person yonitdm; 18.11.2013