我希望以非常具体的方式搜索非常具体的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,所以这个方法总是错的
我该怎么办?还有其他办法吗? 我想到了地图,但我对这些地图没有多少经验。
答案 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选择器不足时使用的模式。 [我们]有数百个测试需要几个小时才能运行,因此这些延迟是一个相当大的问题。