我正在用Watin編寫應用程序。它很棒,但是對我的程序進行性能分析,超過50%的執行時間花費在元素列表中。通過WatiN中的元素進行緩慢迭代
例如: 的foreach(文本字段BT在browser.TextFields) {
是很慢的。
我似乎記得在WatiN看到有一個更快的方法來做這件事,但不幸的是我找不到該頁面。
訪問元素的數量似乎也很慢,例如; browser.CheckBoxes.Count
感謝您的任何提示, 克里斯
我正在用Watin編寫應用程序。它很棒,但是對我的程序進行性能分析,超過50%的執行時間花費在元素列表中。通過WatiN中的元素進行緩慢迭代
例如: 的foreach(文本字段BT在browser.TextFields) {
是很慢的。
我似乎記得在WatiN看到有一個更快的方法來做這件事,但不幸的是我找不到該頁面。
訪問元素的數量似乎也很慢,例如; browser.CheckBoxes.Count
感謝您的任何提示, 克里斯
我想我可以更好地回答你,如果我對你正在做的事情有了更好的瞭解,但我可以分享一些關於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:縮小您正在尋找的範圍並具體。
希望有所幫助。我正在尋找加快我自己測試的方法。
感謝Dahv提供了一個非常詳細的答案。在我的情況下,我用一些技巧加快了我的測試速度大約10倍,有些類似於你的測試: – chris 2011-05-17 11:03:26
如果你真的需要通過所有文本字段進行迭代,沒有其他辦法。正如@Xaqron指出的那樣,這取決於IE。但也許你只需要遍歷例如文本字段。指定<div/>
?先找到它,然後遍歷它的文本字段會更快。
感謝Dahv提供了一個非常詳細的答案。在我來說,我已經約10倍使用一些技巧,一些類似你們加快了我的測試:你和prostynick(在我的情況下,使用Form1.TextField等)
使用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倍的速度。
它使用IE作爲內部引擎... – Xaqron 2011-05-13 02:23:54