通过WatiN中的元素缓慢迭代

时间:2011-05-13 01:22:23

标签: c# performance watin

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

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

很慢。

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

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

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

3 个答案:

答案 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倍,有些类似于你的:

  • 为您和prostynick精炼范围(在我的情况下使用Form1.TextField等)
  • 首先检查browser.html是否与我的正则表达式匹配,然后再查看是否 字段
  • 使用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倍。