2012-01-31 22 views
5

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

Póngase en contacto con el proveedor. – leppie

+0

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

+0

@leppie: sí, he publicado un mensaje en su foro, estoy esperando una respuesta – David

Respuesta

6

Sugiero realizar bucles directos a través de controles secundarios: de acuerdo con mi experiencia, la búsqueda de controles con crieteria de búsqueda complicada en la IU codificada suele ser lenta.

Editar:

Para mejorar el rendimiento es mejor retirar a los niños de la tabla de conteo y bucle a través de las filas. También para evitar excepción cuando la búsqueda de control sin número de fila puede utilizar FindMatchingControls método, como en lo siguiente:

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

Cuando campo de tabla se buscará directamente en la tabla se ahorrará tiempo para el recuento de los controles secundarios en la tabla. También la búsqueda sin for loop ahorrará tiempo para la búsqueda del campo para cada iteración del número de fila que no coincida.

Como el número de fila se itera a través de todos los valores disponibles en su extensión, no es un criterio de búsqueda esencial a largo plazo. Al mismo tiempo, cada iteración a través de un valor de número de fila invoca una solicitud de búsqueda de control adicional, eventualmente multiplicando el tiempo de ejecución del método por el número de filas en la grilla.

+0

Suponiendo que te refieres a usar table.GetChildren(), es incluso más lento para mí de esa manera :( – David

+1

Sí, ya lo había intentado, pero obtengo el siguiente error System.ArgumentException: no se especificó ninguna fila como contenedor de búsqueda para el control. Para buscar un control de celda usando 'ColumnIndex ', debe especificar la fila como un elemento contenedor o agregar' RowIndex 'a la propiedad de búsqueda de la celda. Nombre del parámetro: SearchProperties Por eso sigo usando las filas – David

+0

@David ¿Ha intentado buscar con solo la instancia de la fila? especificado - sin cierto número de fila? –

Cuestiones relacionadas