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

时间:2012-12-07 16:18:39

标签: 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 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[text()='security administrator']
//div[text()='security administrator ']
//div[text()='security administrator&nbsp;']
//div[text()='security administrator${nbsp}'] (this is a special hack from selenium)

没有任何作用。有什么想法吗?

提前致谢。

3 个答案:

答案 0 :(得分:5)

你可以试试这个:

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

给了我安全管理员

答案 1 :(得分:0)

试试这个

// DIV [@类= '富stglpanel-标记']

答案 2 :(得分:0)

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

修改

终于搞定了!

使用此://div[@class='rich-stglpanel-marker' and normalize-space(div[last()]/following-sibling::text())='security administrator']

我相信在这种情况下,文本“安全管理员”被视为一个节点,而不是第一个div节点的唯一文本值,这就是为什么//div/text()将为您提供多个返回行的原因根据您要搜索的文字,以及为什么您无法将normalize-space()translate()甚至contains()等内容应用于div/text()并获得结果。但是,由于文本节点没有名称,这使得它成为一个时髦的XPath,因此导航到最近的兄弟节点是我能想到的唯一选择。