我有一个我自动化的网页,我可以使用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的几个选项,但似乎没有找到该标签下的元素。我需要帮助这些人。提前谢谢。
答案 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>
元素标识为%。查看快照:
现在,附加前面的会毫不错误地识别之前的<input>
标记。见快照:
因此,无论如何我们的 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
。