通过WatiN中的元素缓慢迭代

chr*_*ris 2 c# performance watin

我正在和Watin一起写一个应用程序.它很棒,但是对我的程序进行了性能分析,超过50%的执行时间用于循环遍历元素列表.

例如:foreach(在browser.TextFields中的TextField bT){

很慢.

我似乎记得在某个地方看到有更快的方式在WatiN中这样做,但不幸的是我再也找不到页面了.

访问元素的数量似乎也很慢,例如; browser.CheckBoxes.Count

谢谢你的任何提示,克里斯

小智 6

我想如果我能更好地了解你想要做什么,我可以更好地回答你,但我可以分享一些关于我到目前为止用WatiN学到的东西的观察结果.

选择器越具体,事情就越快.避免使用"browser.Elements",因为它非常通用.我不确定它是否节省了多少,但是像浏览器那样做.Body.Elements会将标题元素排除在要检查的范围之外,并且可能会节省一些计算.

当我说"范围"时,请考虑WatiN始终以整个DOM开头.您能想到将元素范围限制在页面主div内的文本字段的方法吗?WatiN返回Elements和ElementCollections,每个元素和ElementCollections可以有自己的ElementCollection.该div可能有一个特定的ID,所以你可以做类似的事情

var textFields = ie.Div("divId").TextFields;
Run Code Online (Sandbox Code Playgroud)

寻找更具体的机会,您可以使用LINQ更清楚地描述您想要的内容.例如,你能写下这样的东西:

ie.Body.TextFields.
  Where(tf => !string.IsNullOrWhiteSpace(tf.ClassName) && tf.ClassName.Contains("classname")).ToList().
  Foreach(tf => tf.Value = "Your Text");
Run Code Online (Sandbox Code Playgroud)

我会通过以下方式减少扫描集合的次数来进一步改进:

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

"Find.By*"说明符还可以帮助WatiN更快地对你想要的集合进行操作,并且对于我上面写的内容更加优雅:

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

作为最后一条建议,该项目允许您使用jQuery/CSS样式选择器查找元素.

所以,tl; dr:缩小你所寻找的范围,并具体说明.

希望有所帮助.我正在寻找加速自己测试的方法.