Python Selenium动态ID复选框定位求助:点击Workdays 10-11
问题:点击动态ID的复选框「Workdays 10-11」
我刚开始用Python学习Selenium,想要点击复选框「Workdays 10-11」。尝试过用Xpath,但标签里的ID每次执行都会变化;用类名也没效果,求可行的解决方案。
提供的HTML结构:
完整树结构:
<div id="EAACAAA_b3" xscroll="1" onmouseleave="hidetreepager(this.firstChild)" onmouseenter="showtreepager(this.firstChild,event.srcElement,event)" onmousemove="showtreepager(this.firstChild,event.srcElement,event)" style="width: 347px; height: 300px; overflow: auto;"> <div id="members_tree" treeid="members" mode="crittree" multiselect="true" autowidth="true" enabled="" class="xcriteriadropdown-members" onclick="clickcrittree(this,event)" singleselect="03344C6E"> <div class="treenoderoot" nodeid="0" state="1"> <span class="treetext"><span></span><img src="images/blank.gif" style="display:none"><img src="images/checkbox_checked.png" align="absmiddle" class="treestate"><a href="#">No selection</a></span> <div class="treechildren" style="display:block;padding-left:0px" id="ext-gen8"> <div class="treenode" nodeid="1" state="0" id="ext-gen10"> <div class="treetext"><img src="images/blank.gif" nalign="absmiddle"><img src="images/checkbox_unchecked.png" class="treestate" nalign="absmiddle"><a href="#">Workdays 10-11</a></div> </div> <div class="treenode" nodeid="2" state="0"> <div class="treetext"><img src="images/blank.gif" nalign="absmiddle"><img src="images/checkbox_unchecked.png" class="treestate" nalign="absmiddle"><a href="#">Workdays 08-10, 11-16</a></div> </div> <div class="treenode" nodeid="3" state="0"> <div class="treetext" id="ext-gen11"><img src="images/blank.gif" nalign="absmiddle"><img src="images/checkbox_unchecked.png" class="treestate" nalign="absmiddle"><a href="#">Workdays 00-08, 16-24</a></div> </div> <div class="treenode" nodeid="4" state="0" id="ext-gen9"> <div class="treetext" id="ext-gen7"><img src="images/blank.gif" nalign="absmiddle"><img src="images/checkbox_unchecked.png" class="treestate" nalign="absmiddle"><a href="#">Weekends and holidays</a></div> </div> </div> </div> </div> <img src="resource.ashx?resname=Misc_Down16&_dc=" 76d3ff65"" border="0" style="position: absolute; left: -5000px; top: -5000px;" id="ext-gen5"> <img src="resource.ashx?resname=Misc_Up16&_dc=" 76d3ff65"" border="0" style="position: absolute; left: -5000px; top: -5000px;" id="ext-gen6"> </div>
目标元素局部结构:
<div class="treenode" nodeid="1" state="0" id="ext-gen11"> <div class="treetext" id="ext-gen8"> <img src="images/blank.gif" nalign="absmiddle"> <img src="images/checkbox_unchecked.png" class="treestate" nalign="absmiddle" id="ext-gen7"> <a href="#" id="ext-gen12">Workdays 10-11</a> </div> </div>
解决方案
以下几种定位方式可避开动态ID的问题:
通过文本关联定位复选框
先找到显示「Workdays 10-11」的<a>标签,再定位它同级的复选框图片:from selenium.webdriver.common.by import By checkbox = driver.find_element(By.XPATH, "//a[text()='Workdays 10-11']/preceding-sibling::img[@class='treestate']") checkbox.click()通过固定nodeid属性定位
目标复选框所在的treenode节点有固定的nodeid="1",以此为锚点定位:checkbox = driver.find_element(By.XPATH, "//div[@nodeid='1']//img[@class='treestate']") checkbox.click()通过稳定父节点缩小范围
利用页面中稳定的members_tree父节点,再定位目标元素:checkbox = driver.find_element(By.XPATH, "//div[@id='members_tree']//a[text()='Workdays 10-11']/../img[@class='treestate']") checkbox.click()
优化建议:添加显式等待
如果页面加载有延迟,建议使用显式等待确保元素可点击,避免报错:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) checkbox = wait.until(EC.element_to_be_clickable((By.XPATH, "//a[text()='Workdays 10-11']/preceding-sibling::img[@class='treestate']"))) checkbox.click()
内容的提问来源于stack exchange,提问作者Vinayak kulkarni
相关产品推荐
相关产品推荐

