对WebElement列表进行排序以查找特定元素(Selenium WebDriver / Java)

时间:2017-12-10 13:03:52

标签: java selenium xpath

我希望以非常具体的方式搜索非常具体的WebElement。

WebElement看起来像这样:

<aw>
    <div class="class">
        <h1>
            <a class="class1">TEXT TO FIND 1</a> 
        </h1>
        <p>
            <a class="class2"> TEXT TO FIND 2 </a>
        </p>
    </div>
</aw>

"text to find"都可以写成"t e xt to fi nd"(这使得过时的contains())。 因此,我想要细分我需要在字符中搜索的两个字符串,然后搜索包含所有字符的元素,最大为1个字符容差。

这个^

的例子

getCorrectElement(String1,String2) - &gt;返回WebElement

  

搜索&#34;文字&#34;在(h1 / a)[String1]和&#34; cat&#34;在(p / a)[String2]

  • 将两个字符串拆分为字符数组

  • 列出包含"t";

  • 的所有元素
  • 获取包含"e";

  • 的该列表的所有条目
  • 重复直到你没有留下任何单词/找不到元素,

    if找不到任何元素,尝试查看是否有前一个元素(或者可能是字符组合(一如既往,我们有1个字符容差),例如找不到1 2 3 ,但我们有一个匹配的元素 2 3如果我们有类似的东西,请选择此元素(或者更好,将其添加到新列表中)。

  • 现在我们有一个仅包含WebElements的列表,其中包含&#34; text&#34; as(h1 / a) 我们将使用它来优化我们的搜索。

  • 我们使用刚刚制作的列表并执行与之前完全相同的过程。

  • 操作完成(找到包含&#34;文本&#34;(h1 / a)和&#34; cat&#34;(p / a)的元素,返回正确的WebElement

这意味着如果输入了"Cool Catto",但没有完全匹配它的元素,那么它将继续匹配其中大部分的下一个元素(最多1个字符容差)。

所以"Cool Catto" = "Col Catt""Cool Catto" = "C o o l Catt o"

我尝试将xpath搜索到text(),但是这个xpath表达式 a[contains(text(), ' text to find ')]/../../p/a[contains(text(),' text to find')],仅返回"text to find 2",而不是两者。

如果我使用[contains() and contains()],表达式会返回可能只匹配单个"text to find"的元素,而我需要的内容只匹配两者{。

另外,我很确定你不能做String-&gt; WebElement,所以这个方法总是错的

我该怎么办?还有其他办法吗? 我想到了地图,但我对这些地图没有多少经验。

1 个答案:

答案 0 :(得分:0)

性能会更差,但您可以返回可能元素的列表,然后在Java代码中执行更高级的过滤。我在我的例子中使用了C#,但Java等价物应该非常相似。

var element = webDriver
    // Find all elements that are a direct child of the parent element
    .FindElements(By.CssLocator("aw > div.class > *"))
    // Get the first element matching the criteria
    .FirstOrDefault(e => {
        // Simply remove spaces. Regex could also be used
        string.Equals(e.Text.Replace(" ", ""), "TEXTTOFIND");
    });

我说性能会更差,因为WebDriver必须查询/序列化更多的对象,如果很多对象会导致明显的延迟。这是我在CSS或jquery选择器不足时使用的模式。 [我们]有数百个测试需要几个小时才能运行,因此这些延迟是一个相当大的问题。