2011-05-13 101 views
2

我正在用Watin編寫應用程序。它很棒,但是對我的程序進行性能分析,超過50%的執行時間花費在元素列表中。通過WatiN中的元素進行緩慢迭代

例如: 的foreach(文本字段BT在browser.TextFields) {

是很慢的。

我似乎記得在WatiN看到有一個更快的方法來做這件事,但不幸的是我找不到該頁面。

訪問元素的數量似乎也很慢,例如; browser.CheckBoxes.Count

感謝您的任何提示, 克里斯

+0

它使用IE作爲內部引擎... – Xaqron 2011-05-13 02:23:54

回答

6

我想我可以更好地回答你,如果我對你正在做的事情有了更好的瞭解,但我可以分享一些關於WatiN到目前爲止學到的知識。

選擇器越具體,速度越快。避免使用「browser.Elements」,因爲這是非常通用的。我不確定它節省了多少,但是做了一些類似browser.Body.Elements的事情,將頭元素拋出了需要檢查的範圍,並且可以節省一些計算。

當我說「範圍」時,考慮到WatiN總是以整個DOM開始。你能想出一些方法將元素的範圍限制在頁面上主div的文本字段上嗎? WatiN返回Elements和ElementCollections,每個元素都可以有自己的ElementCollection。該分區可能有一個特定的ID,這樣你就可以像

var textFields = ie.Div("divId").TextFields; 

看起來是機會,更具體的,你可以使用LINQ來描述你想要的東西更清楚。例如,你可以寫這樣的:

我會進一步細化,通過減少的次數我做類似掃描採集:

ie.Body.TextFields.ToList(). 
    Foreach(tf => { 
    if(!string.IsNullOrWhiteSpace(tf.ClassName) && tf.ClassName.Contains("classname")) { 
     tf => tf.Value = "Your Text" 
    } 
    }); 

的「Find.By *」符還可以幫助華廷你想要更快的收集工作,並且更優雅的短手就是我上面寫道:

ie.Body.TextFields.Filter(Find.ByClass("class")).ToList().ForEach(tf => tf.Value = "Your Text"); 

而且作爲最後的忠告,this project可以讓你使用jQuery/CSS樣式選擇器找到元素。

因此,tl; dr:縮小您正在尋找的範圍並具體。

希望有所幫助。我正在尋找加快我自己測試的方法。

+0

感謝Dahv提供了一個非常詳細的答案。在我的情況下,我用一些技巧加快了我的測試速度大約10倍,有些類似於你的測試: – chris 2011-05-17 11:03:26

0

如果你真的需要通過所有文本字段進行迭代,沒有其他辦法。正如@Xaqron指出的那樣,這取決於IE。但也許你只需要遍歷例如文本字段。指定<div/>?先找到它,然後遍歷它的文本字段會更快。

0

感謝Dahv提供了一個非常詳細的答案。在我來說,我已經約10倍使用一些技巧,一些類似你們加快了我的測試:你和prostynick(在我的情況下,使用Form1.TextField等)

  • 煉油範圍
  • 在查看 字段之前,首先檢查browser.html是否與我的正則表達式匹配
  • 使用GehSoft.PRCE正則表達式包裝 - 它的本地代碼正則表達式 匹配比.NET的小乾草堆快得多。因此,要找到一個文本字段我會怎麼做:

    Gehtsoft.PCRE.Regex regexString = new Gehtsoft.PCRE.Regex("[Nn]ame"); 
         foreach (TextField bT in browser.TextFields) 
            { 
             //Skip if no match 
             if (!regexString.Execute(bT.Name).Success) continue; 
    
  • 我是循環的正則表達式的名單之前,那裏面,我是循環上的TextField。使TextFields循環的頂級循環提高了約3倍的速度。