使用 xpath 定位名称中带下划线的元素

Using xpath to locate element with an underline in the name

我正在尝试单击动态更改 ID 和 xpath 的网络元素。我没有看到任何其他信息可以直接用于在每次页面加载时唯一地标识元素。

这是元素的 Xpath:

.//*[@id='isc_SB']/table/tbody/tr/td

这将在每次页面加载时与 ID 一起更新。

这是同一元素的 HTML 代码:

<table width="74px" height="30px" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<td class="OBToolbarTextButtonFocusedOver" valign="center" nowrap="true" align="center" onfocus="isc_OBToolbarActionButton_3.()" tabindex="-1">
Pu
<u>b</u>
lish
</td>
</tr>
</tbody>
</table>

我想单击文本名为 "publish" 且 'u' 带有下划线的按​​钮

这是我尝试过但没有成功的方法:

尝试 1:

publish = //td[. = 'Pu<u>b</u>lish']

尝试 2:

publish = //td[contains(text(), 'lish')] 

尝试 3:

publish = .//*[@id='isc_S7']/table/tbody/tr/td # this is just an example to show id, xpath and everything is dynamic.

请协助。谢谢。

不确定您是否可以只使用 xpath 来完成它。作为解决方法,这可能会有所帮助

//td[contains(text(),'Pu')]/u[text()='b']

在 XPath 中,元素节点的字符串值定义为其所有后代文本节点的串联,因此如果您有一个

<td>Pu<u>b</u>lish</td>

然后你可以简单地匹配它

//td[. = 'Publish']

如果像您的问题一样,u 元素的两边都有换行符,那么您需要更有创意一些,例如

//td[normalize-space() = 'Pu b lish']

如果你想涵盖这两种情况,那么

//td[translate(normalize-space(), ' ', '') = 'Publish']

顺便说一句,您的尝试 2 无效的原因是 contains 期望它的两个参数都是字符串,但在您的示例中 text() 给您一组 两个个文本节点("Pu"和"lish"),将节点集转换为字符串意味着只取第一个的值集合中的节点按文档顺序并忽略其他节点。