我有以下HTML代码,我需要检查表单元格中是否存在文本:
<div class="background-ljus" id="AutoText">
<table class="topAlignedCellContent">
<tbody>
<tr>
<td>X1</td>
</tr>
<tr>
<td>X2</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td>Y1</td>
<td>Y2</td>
</tr>
</tbody>
</table>
<table>
<tbody>
<tr>
<td>Z1</td>
<td>Z2</td>
</tr>
</tbody>
</table>
</div>
我已经解决了这个问题:
By locator = getLocator(CommonConst.XPATH, "*//div[@" + type + "='" + anyName + "']");
fluentWait(locator);
WebElement div = getDriver().findElement(locator);
List<WebElement> cells = div.findElements(By.tagName("td"));
for (WebElement cell : cells) {
if (cell.getText().contains(cellText)) {
foundit = true;
}
}
但我认为它有点慢,因为我需要多次这样做。 我试着用XPath做但没有运气。
"*//div[@id='AutoText']//td[contains[Text(), 'celltext']]"
"*//div[@id='AutoText']//table//tbody//tr[td//Text()[contains[., 'celltext']]"
任何人都有一个关于为什么我的XPath不起作用的建议?
答案 0 :(得分:6)
错:
*//div[@id='AutoText']//td[contains[Text(), 'celltext']]
*//div[@id='AutoText']//table//tbody//tr[td//Text()[contains[., 'celltext']]
正确(更短的替代方案):
//div[@id='AutoText']//td[contains(text(), 'celltext')]
//div[@id='AutoText']//td[contains(., 'celltext')]
//div[@id='AutoText']/table/tbody/tr[td//text()[contains(., 'celltext')]
//div[@id='AutoText']/table/tbody/tr[td[contains(., 'celltext')]]
contains()
是一个功能text()
需要小写//
注意
.
指的是&#34;此节点&#34;并且,当作为contains()
等字符串函数的参数给出时,相当于string(.)
。但是,这与text()
完全不同。
string(.)
都会创建当前节点内所有文本节点的串联。 text()
是node test,默认情况下仅选择直接子项。
换句话说,如果当前节点是<td>foo <b>bar</b> baz</td>
,contains(text(), 'bar')
实际上是假的。 (因为不同的原因contains(text(), 'baz')
也是如此。)
contains(., 'bar')
将返回true,contains(., 'baz')
也是如此。
仅当当前节点只包含单个文本节点时,text()
和.
才相同。大多数情况下,您需要使用.
代替text()
。相应地设置谓词。
答案 1 :(得分:0)
你的xpath是错误的。您应该使用text()
而不是Text()
。此外contains()
是一个圆括号而不是方括号的函数。试试这个 -
"//div[@id='AutoText']//td[contains(text(), 'celltext')]"
"//div[@id='AutoText']//td[contains(., 'celltext')]"
或者如果您希望显示包含文本的所有子元素,请使用.
代替text()
希望它有所帮助。
答案 2 :(得分:0)
您也可以使用动态xpath
//div[@id='AutoText']/table[1]//tbody/tr[1]/td
现在只需用i替换1并使用for循环来查看元素是否返回任何值