не может получить доступ к значениям ячеек из таблицы данных с помощью автоматизации пользовательского интерфейса (элемент автоматизации в c #) - PullRequest
0 голосов
/ 10 декабря 2018

Я реализовал настольное приложение, которое загружает XML в DataGridView.В настоящее время я пишу тесты автоматизации для своего приложения, которые включают тесты для сетки данных.Я использую UI Automation для достижения этой цели.

Я сталкиваюсь с проблемами с DataGridView, который включает в себя вызов фоновых событий сетки (например, CellClick или CellDoubleclick) и доступ к значениям из выбранных строк и утверждение их с соответствующими значениями в текстовых полях с CEllDoubleClickEvent для сетки.

Пожалуйста, обратитесь к изображению для лучшего понимания

Шаг 1 и 2: Загрузите и просмотрите XML в Grid View.

Шаг 3: CellDoublickEventили событие CellClick наступает при выборе строки в DataGridView.

Шаг 4: Соответствующие значения будут выбраны в текстовые поля.Идентификатор отображается с помощью SignalIndex, а значение с DefaultValue.(Примечание. Значения в текстовом поле преобразуются в HEX.)

Ниже приведен код:

// Loads the application window elements correspionding to the ProcessID
        var reloadApplication = loadElements(gridProcessID);

        // Finds and loads the elements for the DataGridView dgv 
        var selectGrid = reloadApplication.FindFirst(TreeScope.Children,
            new PropertyCondition(AutomationElement.AutomationIdProperty, "dgv"));

        // get to ROW X (here it's row #1 name is always "Row X")
        AutomationElement row = selectGrid.FindFirst(TreeScope.Children,
            new PropertyCondition(AutomationElement.NameProperty, "Row 0"));

        // get row header
        AutomationElement rowHeader = row.FindFirst(TreeScope.Children,
            new PropertyCondition(AutomationElement.ControlTypeProperty, ControlType.Header));


        // invoke it (select the whole line)
        InvokePattern invokeRow = rowHeader.GetCurrentPattern(InvokePattern.Pattern) as InvokePattern;
        invokeRow.Invoke();

    /// <summary>
    /// This method loads the elements for the given Process ID.
    /// </summary>
    /// <param name="intProcessID"></param>
    /// <returns></returns>
private AutomationElement loadElements(int intProcessID)
    {
        var rootElement = AutomationElement.RootElement;
        if (rootElement == null)
        {
            return null;
        }

        var propertyNameOfRoot = new PropertyCondition(AutomationElement.ProcessIdProperty, intProcessID);
        if (propertyNameOfRoot == null)
        {
            return null;
        }

        var tree = new TreeWalker(propertyNameOfRoot);
        if (tree == null)
        {
            return null;
        }

        AutomationElement elementTree = tree.GetFirstChild(rootElement);
        if (elementTree == null)
        {
            return null;
        }

        return elementTree;
    }

Приведенный выше код сначала получает элементы дерева для окна приложения и findfirst.получает дерево элементов для DataGridView.Во-вторых, он получает первую строку из сетки, а событие invoke выбирает строку в виде сетки. Пример того, что означал выбор строки .

Проблемы:

  1. Мне нужно вызывать события DataGridView, такие как CellClick, CellDoubleClick во время моего тестирования автоматизации с использованием автоматизации пользовательского интерфейса (чего я не знаю, как этого достичь).
  2. Мне нужно получить доступ к выбранным данным строки (SignalName: Send, SignalIndex: 4086, DefaultValue: 3) и подтвердить это с помощью заполненных текстовых полей [Пожалуйста, обратитесь к изображению 1 Шаг 3 и 4].

Пожалуйста, дайте мне знать, если кому-то нужна дополнительная информация.

Заранее спасибо.Надеюсь найти решение здесь.:)

...