CodedUI:为什么搜索单元格如此缓慢

本文关键字:缓慢 单元格 搜索 为什么 CodedUI | 更新日期: 2023-09-27 18:21:54

我在Winform应用程序中有一个网格(FlexGrid,来自ComponentOne),我正试图在该网格中找到一个单元格,给定该单元格的列索引及其值。

我已经编写了下面的扩展方法来循环遍历网格并找到那个单元格。

我正在一个有6列64行的网格上测试这个方法。我的代码花了10分钟才找到正确的单元格(位于最后一行)

有什么办法可以加快我的算法吗?

注意:我也尝试过将PlayBack.PlayBackSetting.SmartMatchOption设置为TopLevelWindow,但它似乎没有改变任何。。。

谢谢!

    public static WinCell FindCellByColumnAndValue(this WinTable table, int colIndex, string strCellValue)
    {
        int count = table.GetChildren().Count;
        for (int rowIndex = 0; rowIndex < count; rowIndex++)
        {
            WinRow row = new WinRow(table);
            WinCell cell = new WinCell(row);
            row.SearchProperties.Add(WinRow.PropertyNames.RowIndex, rowIndex.ToString());
            cell.SearchProperties.Add(WinCell.PropertyNames.ColumnIndex, colIndex.ToString());
            cell.SearchProperties.Add(WinCell.PropertyNames.Value, strCellValue);
            if (cell.Exists)
                return cell;
        }
        return new WinCell();
    }

编辑

我修改了我的方法如下(例如,我不再使用winrow),这似乎快了3倍左右。不过,在一个有3行6列的表中找到一个单元格仍然需要7秒,所以速度仍然很慢。。。

我稍后会将这个答案标记为已接受,以便给其他人留出时间来建议更好的

    public static WinCell FindCellByColumnAndValue(this WinTable table, int colIndex, string strCellValue, bool searchHeader = false)
    {
        Playback.PlaybackSettings.SmartMatchOptions = Microsoft.VisualStudio.TestTools.UITest.Extension.SmartMatchOptions.None;   
        int count = table.GetChildren().Count;
        for (int rowIndex = 0; rowIndex < count; rowIndex++)
        {
            WinCell cell = new WinCell(table);
            cell.SearchProperties.Add(WinRow.PropertyNames.RowIndex, rowIndex.ToString());
            cell.SearchProperties.Add(WinCell.PropertyNames.ColumnIndex, colIndex.ToString());

            cell.SearchProperties.Add(WinCell.PropertyNames.Value, strCellValue);
            if (cell.Exists)
                return cell;
        }
        return new WinCell();
    }

编辑#2:我已经按照@Andrii的建议尝试过使用FindMatchingControls,我几乎做到了,只是在单元格的列索引(c.ColumnIndex)下面的代码中有一个错误的值。。

    public static WinCell FindCellByColumnAndValue2(this WinTable table, int colIndex, string strCellValue, bool searchHeader = false)
    {
        WinRow row = new WinRow(table);
        //Filter rows containing the wanted value
        row.SearchProperties.Add(new PropertyExpression(WinRow.PropertyNames.Value, strCellValue, PropertyExpressionOperator.Contains));
        var rows = row.FindMatchingControls();
        foreach (var r in rows)
        {
            WinCell cell = new WinCell(r);
            cell.SearchProperties.Add(WinCell.PropertyNames.Value, strCellValue);
            //Filter cells with the wanted value in the current row
            var controls = cell.FindMatchingControls();
            foreach (var ctl in controls)
            {
                var c = ctl as WinCell;
                if (c.ColumnIndex == colIndex)//ERROR: The only cell in my table with the correct value returns a column index of 2, instead of 0 (being in the first cell)
                    return c;
            }
        }
        return new WinCell();
    }

CodedUI:为什么搜索单元格如此缓慢

我建议通过子控件执行直接循环-根据我的经验,在Coded UI中搜索具有复杂搜索条件的控件通常工作缓慢。

编辑:

若要提高性能,最好删除计数表的子项和在行之间循环。为了避免在查找没有行号的控件时出现异常,您可以使用FindMatchingControls方法,如以下所示:

    public static WinCell FindCellByColumnAndValue(this WinTable table, int colIndex, string strCellValue, bool searchHeader = false)
    {
        Playback.PlaybackSettings.SmartMatchOptions = Microsoft.VisualStudio.TestTools.UITest.Extension.SmartMatchOptions.None;
        WinCell cell = new WinCell(table);
        cell.SearchProperties.Add(WinCell.PropertyNames.ColumnIndex, colIndex.ToString());
        cell.SearchProperties.Add(WinCell.PropertyNames.Value, strCellValue);
        UITestControlCollection foundControls = cell.FindMatchingControls();
        if (foundControls.Count > 0)
        {
            cell = foundControls.List[0];
        }
        else
        {
            cell = null;
        }
        return cell;
    }

当直接在表中搜索表字段时,将节省计算表中子控件的时间。此外,在没有for循环的情况下进行搜索将为不匹配的行号的每次迭代节省字段搜索时间。

由于行号是通过扩展中的所有可用值进行迭代的,所以从长远来看,这不是必要的搜索标准。同时,通过一个行号值的每次迭代都会调用额外的控制搜索请求——最终将方法的执行时间乘以网格中的行数。