无法使用"包含"来访问元素。关键字(Selenium,Python)

时间:2017-06-29 07:11:46

标签: python selenium xpath selenium-webdriver automation

我尝试使用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]

任何人都可以帮我找出问题所在吗?

2 个答案:

答案 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')]