5

Bir Winform uygulamasında bir kılavuzum (ComponentOne'dan FlexGrid) var ve hücrenin sütun dizini ve değeri göz önüne alındığında o ızgarada bir hücre bulmaya çalışıyorum.CodedUI: Neden bu kadar yavaş bir hücre arıyor?

Aşağıdaki uzantı yöntemini, kılavuzun içinden geçerek o hücreyi bulmak için yazdım.

Bu yöntemi 6 sütun ve 64 satır içeren bir ızgarada test ediyorum. Kodumun doğru hücreyi bulması 10 dakika sürdü (son satırdaydı)

Algoritmamı hızlandırabilmemin bir yolu var mı?

Not: ... Ben de TopLevelWindow için PlayBack.PlayBackSetting.SmartMatchOption ayarı denedim ama hiçbir şeyi değiştirmez görünmüyor

teşekkürler! Düzenleme

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

aşağıda gibi olmak benim yöntemi (örn. Artık Winrow kullanmayın) modifiye, bu daha hızlı 3x civarında olduğu görülmektedir. Hala 3 satır ve 6 sütun ile bir tabloda bir hücre bulmak için 7 saniye gerekiyor, bu yüzden hala oldukça yavaş ...

Diğer kişilerin önerebileceği zaman bırakmak için bu cevabı daha sonra kabul edildiği şekilde işaretleyeceğim daha iyi bir şey

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

Düzenleme # 2: Ben Andrii önerisi @ uyarınca FindMatchingControls kullanılarak denedim ve ben hücrenin sütun indeksi aşağıdaki kodda dışında neredeyse orada (c.ColumnIndex) değilim yanlış değere sahip ..

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

Satıcıyla iletişim kurun. – leppie

+0

MSDN forumlarının [UI Otomasyon Testi] (http://social.msdn.microsoft.com/Forums/da/vsautotest/threads) bölümünde genellikle Kodlanmış UI soruları için oldukça kapsamlı yanıtlar sağladığına katılıyorum. –

+0

@leppie: Evet, kendi forumunda bir ileti gönderdim, sadece bir cevap bekliyorum – David

cevap

6

Çocuğun kontrolleri aracılığıyla doğrudan döngü yapılmasını öneririm - kodlanmış kullanıcı arayüzünde karmaşık arama kriterleri olan kontrolleri arama deneyimime göre genellikle yavaş çalışır.

Düzenleme:

o sayma tablonun çocukları ve satırlar arasında döngü kaldırmak için daha iyidir performansını artırmak için. Satır numarası olmadan kontrolünü bulma Ayrıca aşağıdaki gibi, FindMatchingControls yöntemi kullanabilirsiniz istisna önlemek: Tablo alan tabloda doğrudan aranır zaman

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

Tabloda çocuk kontrolleri saymak için zaman kazandırır. Ayrıca, for döngüsü olmadan arama, eşleşmeyen satır numarasının her yinelemesi için alan araması için zamandan tasarruf edecektir.

Satır numarasının uzantıdaki tüm kullanılabilir değerler üzerinden yinelenmesi nedeniyle, uzun vadede önemli arama kriteri değildir. Aynı zamanda, bir satır numarası değeri boyunca her yineleme, ek kontrol arama isteğini çağırır - sonuçta yöntemin yürütme süresini, kılavuzdaki satır sayısı ile çarparak.

+0

Tablo.GetChildren() kullanarak kastettiğinizi varsayalım, Bu yolla bana daha yavaş :( – David

+1

Evet, zaten denedim, ancak şu hatayı alıyorum ama aşağıdaki hata alıyorum System.ArgumentException: Denetim için arama kutusu olarak hiçbir satır belirtilmedi. 'satır öğesini bir kapsayıcı öğe olarak belirtmeli veya hücrenin arama özelliğine' RowIndex 'eklemelisiniz Parametre adı: SearchProperties Bu yüzden hala satırları kullanıyorum – David

+0

@David Yalnızca satır örneğiyle arama yapmayı denediniz mi? Belirtilen - belirli satır numarası olmadan? –