无法使用UI自动化(C#中的automationelement)从datagridview访问单元格值

时间:2018-12-10 08:25:15

标签: c# automation ui-automation

我已经实现了一个桌面应用程序,该应用程序将xml加载到DataGridView上。当前,我正在为我的应用程序编写自动化测试,其中包括对datagridview的测试。我正在使用UI自动化来实现这一目标。

我遇到了DataGridView的问题,其中包括调用Grid的背景事件(例如CellClick或CellDoubleclick),并访问所选行中的值,并使用带有带有CEllDoubleClickEvent的文本框的相应值对其进行断言。

Please refer the image for better understanding

第1步和第2步:将XML加载并浏览到“网格视图”。

第3步:在您从DataGridView中选择行时,发生CellDoublickEvent或CellClick事件。

第4步:我们将相应的值提取到文本框中。 ID与SignalIndex映射,Value与DefaultValue映射。 (注意:文本框中的值将转换为十六进制。)

请在下面的代码中找到:

// 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事件在网格视图中选择该行。 Example of what selection of row meant

问题:

  1. 在使用UI Automation(我不确定如何实现)进行自动化测试期间,我需要调用诸如CellClick,CellDoubleClick之类的DataGridView事件。
  2. 我需要访问选定的行数据(SignalName:发送,SignalIndex:4086,DefaultValue:3),并使用填充的文本框进行断言[请参阅图像1步骤3和4]。

请让我知道是否有人需要更多信息。

先谢谢了。希望在这里找到解决方案。 :)

0 个答案:

没有答案