Ho una griglia (FlexGrid, da ComponentOne) in un'applicazione Winform e sto cercando di trovare una cella in quella griglia, dato l'indice della colonna della cella e il suo valore.CodedUI: Perché la ricerca di una cella è così lenta?
Ho scritto il metodo di estensione qui sotto per scorrere la griglia e trovare quella cella.
Sto testando quel metodo su una griglia che ha 6 colonne e 64 righe. Ci sono voluti 10 minuti per il mio codice per trovare la cella corretta (che si trovava nell'ultima riga)
C'è un modo per accelerare il mio algoritmo?
Nota: Ho anche provato a installare PlayBack.PlayBackSetting.SmartMatchOption a TopLevelWindow, ma non sembra cambiare nulla ...
Grazie!
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();
}
Modifica
ho modificato il mio metodo di essere come di seguito (per es. Io non uso più Winrow), questo sembra essere intorno a 3 volte più veloce. Ha ancora bisogno di 7 secondi per trovare una cella in una tabella con 3 righe e 6 colonne, quindi è ancora piuttosto lento ...
Segnerò questa risposta come accettata più tardi, per lasciare il tempo ad altre persone di suggerire qualcosa di meglio
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();
}
Edit # 2: ho provato con FindMatchingControls come da @ suggerimento di Andrii, e io sono quasi arrivati, tranne che nel seguente codice indice di colonna della cella (c.ColumnIndex) ha il valore sbagliato ..
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();
}
Contattare il fornitore. – leppie
Concordo sul fatto che nella sezione [UI Automation Testing] (http://social.msdn.microsoft.com/Forums/da/vsautotest/threads) dei forum MSDN di solito forniscono risposte molto estese alle domande dell'interfaccia utente codificata. –
@leppie: sì, ho postato un messaggio sul loro forum, sto solo aspettando una risposta – David