Tengo una grilla (FlexGrid, de ComponentOne) en una aplicación Winform y estoy tratando de encontrar una celda en esa grilla, dado el índice de columna de la celda y su valor.CodedUI: ¿Por qué la búsqueda de una celda es tan lenta?
He escrito el siguiente método de extensión para recorrer la cuadrícula y encontrar esa celda.
Estoy probando ese método en una grilla que tiene 6 columnas y 64 filas. Mi código tardó 10 minutos en encontrar la celda correcta (que estaba en la última fila)
¿Hay alguna manera de acelerar mi algoritmo?
Nota: También he intentado establecer PlayBack.PlayBackSetting.SmartMatchOption a TopLevelWindow, pero no parece que cambiar nada ...
Gracias!
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();
}
Editar
he modificado mi método a ser como a continuación (por ejemplo. No consumo Winrow más), esto parece ser alrededor de 3 veces más rápido. Todavía necesita 7 segundos para encontrar una celda en una tabla con 3 filas y 6 columnas, así que todavía es bastante lento ...
Voy a marcar esta respuesta como aceptada más tarde, para dejar tiempo a otras personas para sugerir algo mejor
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();
}
Edición # 2: he intentado usar FindMatchingControls según la sugerencia de @ Andrii, y estoy cerca de allí, excepto que en el código de abajo índice de la columna de la celda (c.ColumnIndex) tiene el valor equivocado ..
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();
}
Póngase en contacto con el proveedor. – leppie
Estoy de acuerdo en que en la sección [UI Automation Testing] (http://social.msdn.microsoft.com/Forums/da/vsautotest/threads) de los foros de MSDN suelen proporcionar respuestas bastante amplias para las preguntas de UI codificadas. –
@leppie: sí, he publicado un mensaje en su foro, estoy esperando una respuesta – David