使用标签类下的selenium python单击元素

时间:2018-03-27 16:14:22

标签: python selenium-webdriver

我有一个我自动化的网页,我可以使用xpath或名称或ID点击任何其他元素,但是当我想要点击的元素在标签内时,这会变得有点棘手。这是一个例子,

<div class="dv-widget dv-deco-def dv-sz-med dv-map-sw">
<input name="l_maps" id="grp_perc" value="0" class="map_HD dv-radio-swr" type="radio">
<label for="grp_percentage" class="dv-radio-swl" onclick="">%</label>
<input name="l_maps" id="grp_count" value="1" class="map_HD dv-radio-swr" checked="" type="radio">
<label for="grp_multiply" class="dv-radio-swl" onclick="">*</label></div>

我需要单击带有文本%的无线电按钮,我尝试使用xpath和CSS和ID的几个选项,但似乎没有找到该标签下的元素。我需要帮助这些人。提前谢谢。

2 个答案:

答案 0 :(得分:0)

要点击带有文字的单选按钮,您可以使用以下任意一行代码:

  • 使用preceding

    driver.find_element_by_xpath("//label[@class='dv-radio-swl' and @for='grp_percentage']//preceding::input[1]").click()
    
  • 使用preceding-sibling

    driver.find_element_by_xpath("//label[@class='dv-radio-swl' and @for='grp_percentage']//preceding-sibling::input[1]").click()
    
  • 使用ancestor

    driver.find_element_by_xpath("//label[@class='dv-radio-swl' and @for='grp_percentage']//ancestor::input[1]").click()
    

更新

根据我提供的xpath的第一部分,它正确地将<label>元素标识为。查看快照:

label_xpath

现在,附加前面的会毫不错误地识别之前的<input>标记。见快照:

preceding_xpath

因此,无论如何我们的 xpath 是正确的。可能,您需要诱导服务员使元素可点击,如下所示:

WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//label[@class='dv-radio-swl' and @for='grp_percentage']//preceding::input[1]"))).click()

如果您仍然无法找到该元素,请检查 HTML ,如果该元素位于<iFrame>标记内,您会在How can I select a html element no matter what frame it is in in selenium?

答案 1 :(得分:0)

这是一种奇怪的情况。通常,for的{​​{1}}属性与其对应的LABEL的ID匹配,例如

INPUT

但在这种情况下,它并不匹配。我们可以很容易地解决它。您可以使用XPath搜索包含<input id="name" ... > <label for="name" ... > 文本的元素,然后找到前面的%

INPUT

如果您打算在其他地方使用此功能,我建议您将此功能放入功能并传入//label[.='%']/preceding-sibling::input 文字,例如%并将其输入定位器以点击匹配的LABEL