查找具有以下内容的元素:特定属性和具有特定文本的子元素

时间:2012-12-10 09:41:45

标签: xpath watir-webdriver

对于下面的代码示例,我需要检查是否存在类型=“a”且具有文本“3”作为子项的td的tr:

<table>
    <tr type="a">
     <td>1</td>
    </tr>
    <tr type="b">
     <td>1</td>
    </tr>
    <tr type="a">
     <td>3</td>
    </tr>
</table>

试过这个:

    b.tr( :xpath =>"//tr[@type='a']").td( :text =>'3').exists?

但它不起作用(xpath表达式只返回现有2的第一个tr。)

有什么想法吗? 是否存在xpath表达式,如果我需要tr存在,它将返回true?

4 个答案:

答案 0 :(得分:1)

使用

boolean(/*/tr[@type='a']/td[. = 3])

当存在true(),其字符串值等于数字3,且父td字符串值为{{1}时,此XPath表达式的计算结果为tr。属性为“a”,其中(type)是XML文档顶部元素的子元素。

否则XPath表达式的计算结果为tr

答案 1 :(得分:1)

或者,这也可以在没有xpath的情况下完成:

b.trs.count{ |tr|
  tr.attribute_value('type') == 'a' and tr.td(:text, '3').present? 
} > 0

稍微冗长一点,但我认为它比xpath更容易阅读。

答案 2 :(得分:0)

b.tr(:xpath =>"//tr[@type='a']", :index => 1).td(:text =>'3').exists?

b.tr(:xpath =>"(//tr[@type='a'])[2]").td(:text =>'3').exists?

答案 3 :(得分:0)

我不确定这是否有帮助,但是此代码返回xpath表达式返回的元素数量,因此您可以检查计数是否为0然后不匹配,否则它将返回匹配数:

var doc = document.evaluate("//table/tbody/tr[@type='a']/td[text()=1]",document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
doc.snapshotLength

var doc = document.evaluate("//table[@id='tableId']/tbody/tr[@type='a']/td[text()=1]",document,null,XPathResult.ORDERED_NODE_SNAPSHOT_TYPE,null);
doc.snapshotLength

如果您的桌子有id。

希望这会有所帮助。