5

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(); 
    } 
+0

Contattare il fornitore. – leppie

+0

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. –

+0

@leppie: sì, ho postato un messaggio sul loro forum, sto solo aspettando una risposta – David

risposta

6

Vorrei suggerire di eseguire il looping diretto attraverso i controlli figlio - in base alla mia esperienza, la ricerca di controlli con la crieteria di ricerca complicata in Coded UI spesso funziona lentamente.

Edit:

Per migliorare le prestazioni è meglio rimuovere i bambini della tabella di conteggio e scorrendo le righe. Anche per evitare un'eccezione quando trovare controllo senza numero di riga è possibile utilizzare FindMatchingControls metodo, come in seguito:

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; 
    } 

Quando campo della tabella viene ricercato direttamente nella tabella che farà risparmiare tempo per contare i controlli figlio nella tabella. Anche la ricerca senza ciclo for consente di risparmiare tempo per la ricerca del campo per ogni iterazione del numero di riga che non corrisponde.

Poiché il numero di riga viene ripetuto attraverso tutti i valori disponibili nel proprio interno, non è un criterio di ricerca essenziale a lungo termine. Nello stesso tempo, ogni iterazione attraverso un valore di numero di riga richiama una richiesta di ricerca di controllo aggiuntiva, moltiplicando infine il tempo di esecuzione del metodo per il numero di righe nella griglia.

+0

Supponendo che intendi usare table.GetChildren(), è anche Più lento per me in questo modo :( – David

+1

Sì, l'avevo già provato, ma ho ricevuto il seguente errore System.ArgumentException: nessuna riga è stata specificata come contenitore di ricerca per il controllo. Per cercare un controllo cella utilizzando 'ColumnIndex ', devi specificare la riga come elemento contenitore o aggiungere' RowIndex 'alla proprietà di ricerca della cella Nome parametro: SearchProperties Ecco perché sto ancora utilizzando le righe – David

+0

@David Hai provato a cercare con l'istanza di riga giusta specificato - senza un certo numero di riga? –