我正在用Watin写一个应用程序。它很棒,但是对我的程序进行了性能分析,超过50%的执行时间用于循环遍历元素列表。
例如: foreach(在browser.TextFields中的TextField bT) {
很慢。
我似乎记得在某个地方看到有更快的方式在WatiN中这样做,但不幸的是我再也找不到该页面了。
访问元素的数量似乎也很慢,例如; browser.CheckBoxes.Count
感谢您的任何提示, 克里斯
答案 0 :(得分:6)
我想如果我能更好地了解你想要做什么,我可以更好地回答你,但我可以分享一些关于我到目前为止用WatiN学到的东西的观察结果。
选择器越具体,事情就越快。避免使用“browser.Elements”,因为它非常通用。我不确定它是否节省了多少,但是像浏览器那样做.Body.Elements会将标题元素排除在要检查的范围之外,并且可能会节省一些计算。
当我说“范围”时,请考虑WatiN始终以整个DOM开头。您能想到将元素范围限制在页面主div内的文本字段的方法吗? WatiN返回Elements和ElementCollections,每个元素和ElementCollections可以有自己的ElementCollection。该div可能具有特定的ID,因此您可以执行类似
的操作var textFields = ie.Div("divId").TextFields;
寻找更具体的机会,您可以使用LINQ更清楚地描述您想要的内容。例如,你能写出类似的东西:
ie.Body.TextFields.
Where(tf => !string.IsNullOrWhiteSpace(tf.ClassName) && tf.ClassName.Contains("classname")).ToList().
Foreach(tf => tf.Value = "Your Text");
我会通过以下方式减少扫描集合的次数来进一步改进:
ie.Body.TextFields.ToList().
Foreach(tf => {
if(!string.IsNullOrWhiteSpace(tf.ClassName) && tf.ClassName.Contains("classname")) {
tf => tf.Value = "Your Text"
}
});
“Find.By *”说明符还可以帮助WatiN更快地对您想要的集合进行操作,并且对于我上面写的内容更加优雅:
ie.Body.TextFields.Filter(Find.ByClass("class")).ToList().ForEach(tf => tf.Value = "Your Text");
作为最后一条建议,this project允许您使用jQuery / CSS样式选择器查找元素。
所以, tl; dr:缩小您所寻找的范围,并具体说明。
希望有所帮助。我正在寻找加速自己测试的方法。
答案 1 :(得分:0)
如果您确实需要遍历所有文本字段,则没有其他方法。正如@Xaqron指出的那样,它取决于IE。但也许你只需要迭代例如文本字段。指定<div/>
?首先找到它,然后迭代它的文本字段会更快。
答案 2 :(得分:0)
感谢Dahv提供了一个非常详细的答案。在我的情况下,我使用了许多技巧加速了我的测试大约10倍,有些类似于你的:
使用GehSoft.PRCE RegEx包装器 - 其本机代码正则表达式 对于小型草垛而言,匹配远远快于.NET。所以要找到我要做的TextField:
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;
在我循环使用正则表达式列表之前,我正在循环使用TextFields。使TextFields循环顶部循环可将速度提高约3倍。