我尝试使用contains关键字访问以下元素,但每次都失败:
<div class="country_item " data-region="4">
<label class="chk-label-active" for="country_255">Bulgaria</label>
<div class="jcf-class-save-checkbox chk-area chk-checked">
<span/>
</div>
<input id="country_255" class="save-checkbox jcf-hidden" data-allowlist="378,438,183" name="jform[country][]" value="255" data-currency="2" data-bond_count="19" checked="checked" type="checkbox"/>
</div>
我试过了:
1. //*[contains(text(), 'Bulgaria')])
2. //*[@id='country']/div[15][@label='Bulgaria']
(它是一个国家和保加利亚的名单在div [15]
任何人都可以帮我找出问题所在吗?
答案 0 :(得分:0)
//*[contains(text(), 'Bulgaria')])
要打破这种局面,
*
是一个匹配任何元素(即标记)的选择器 - 它返回一个节点集。[]
是对该节点集中的每个单独节点进行操作的条件。如果它操作的任何单个节点与括号内的条件匹配,则匹配。text()
是一个选择器,它匹配作为上下文节点的子节点的所有文本节点 - 它返回一个节点集。contains
是一个对字符串进行操作的函数。如果传递了节点集,则通过返回节点集中节点的字符串值将节点集转换为字符串,该节点集是文档顺序中的第一个节点集。因此,它只能匹配元素中的第一个文本节点 - 即BLAH BLAH BLAH。由于这不匹配,因此您不会得到结果。您需要将此更改为
//*[text()[contains(.,'Bulgaria')]]
*
是一个匹配任何元素(即标记)的选择器 - 它返回一个节点集。[]
是对该节点集中的每个单独节点进行操作的条件 - 此处它对文档中的每个元素进行操作。text()
是一个选择器,它匹配作为上下文节点的子节点的所有文本节点 - 它返回一个节点集。[]
是一个条件,对该节点集中的每个节点进行操作 - 这里是每个单独的文本节点。每个单独的文本节点都是括号中任何路径的起点,也可以明确地称为。在括号内。如果它操作的任何单个节点与括号内的条件匹配,则匹配。contains
是一个对字符串进行操作的函数。这里传递一个单独的文本节点(.)
。由于它会单独传递<Comment>
标记中的第二个文本节点,因此会看到'Bulgaria'
字符串并且能够匹配它。答案 1 :(得分:0)
您可以尝试以下Xpath选项:
//label[contains(.,'Bulgaria')]
//label[contains(text(),'Bulgaria')]
//div[contains(@class,'country_item')]/label[contains(.,'Bulgaria')]