基于包含文本的元素的XPath表达式

基于包含文本的元素的XPath表达式,xpath,selenium,Xpath,Selenium,我的点子快用完了。我已经根据包含的文本(“安全管理员”)为Selenium测试确定了一个div。不幸的是,这个div包含另外两个div。参见示例 <div class="rich-stglpanel-marker"> <div class="rich-stglpnl-marker" id="j_id194:j_id198:2:j_id199_switch_on" style="display: none"></div> <div clas

我的点子快用完了。我已经根据包含的文本(“安全管理员”)为Selenium测试确定了一个div。不幸的是,这个div包含另外两个div。参见示例

<div class="rich-stglpanel-marker">
    <div class="rich-stglpnl-marker" id="j_id194:j_id198:2:j_id199_switch_on" style="display: none"></div>
    <div class="rich-stglpnl-marker" id="j_id194:j_id198:2:j_id199_switch_off"></div>
    security administrator 
</div>
<div class="rich-stglpanel-marker">
    <div class="rich-stglpnl-marker" id="j_id194:j_id198:2:j_id199_switch_on" style="display: none"></div>
    <div class="rich-stglpnl-marker" id="j_id194:j_id198:2:j_id199_switch_off"></div>
    technical administrator 
</div>
... and so on
什么都不管用。有什么想法吗

提前谢谢。

试试这个


//div[@class='rich-stglpanel-marker']

试试这个:
//div[@class='rich-stglpanel-marker'和text()!=']

编辑

终于找到了

使用以下命令:
//div[@class='rich-stglpanel-marker'并规范化空间(div[last()]/following sibling::text())='security administrator']


我认为在这种情况下,文本“security administrator”被视为一个节点,而不是第一个div节点的唯一文本值,这就是为什么
//div/text()
会给您多个返回行,后跟您正在搜索的文本,以及为什么您不能应用类似
normalize-space()
的内容,
translate()
,甚至
contains()
div/text()
并接收结果。但是,由于文本节点没有名称,这使得它成为一个很难理解的XPath,因此导航到可能最近的同级节点是我能想到的唯一选项。

您能尝试以下方法吗:

//div[contains(.,'security administrator')]
System.out.println(driver.findElementByXPath("//div[contains(.,'security adm')]").getText()) 

给了我安全管理员

你真的很注意。:-)不幸的是,有几个div使用这个类。它们只在包含的文本中有所不同。您要拉哪个节点?具有“安全管理员”文本的父节点?来自该节点的什么信息?我需要“”来单击它。它们都共享该类,如下面所述。我认为这意味着您需要包含文本的父节点。你的想法行不通-(另外,技术管理员块有时可能在安全管理员之前。因此[0]也不起作用。当您发布问题时,请在第一次发布时尽可能详细,以便我们可以避免此问题:-)
//div[contains(.,'security administrator')]
System.out.println(driver.findElementByXPath("//div[contains(.,'security adm')]").getText())