Selenium如何用EC.element_to_be_clickable获取a标签替代sleep等待
Selenium 替换固定sleep的实现方案
前置依赖导入
你需要先确认已经导入所需依赖:
from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait
方案1:返回所有可点击的a标签元素
原生EC.element_to_be_clickable仅会返回第一个匹配的可点击元素,要获取全部符合条件的元素,自定义等待条件即可:
# 等待返回所有可点击的a标签 all_clickable_a = WebDriverWait(driver, 20).until( lambda driver: [ elem for elem in driver.find_elements(By.TAG_NAME, 'a') if elem.is_displayed() and elem.is_enabled() ] ) # 直接取下标点击 all_clickable_a[25].click()
该方法底层判断逻辑和element_to_be_clickable完全一致,筛选同时满足「可见」「启用」两个条件的a标签,20秒内筛选到非空列表就直接返回全部符合条件的元素,超时则抛出异常。
方案2:直接定位第25个可点击的a标签
如果不需要全量元素,直接等待目标位置元素加载完成即可,执行效率更高:
# Python 3.8+ 支持海象运算符的写法 target_elem = WebDriverWait(driver, 20).until( lambda driver: ( elem_list := [ elem for elem in driver.find_elements(By.TAG_NAME, 'a') if elem.is_displayed() and elem.is_enabled() ] )[25] if len(elem_list) >= 26 else False ) target_elem.click()
如果使用的是Python 3.8以下版本,用兼容写法即可:
# 低版本Python兼容写法 target_elem = WebDriverWait(driver, 20).until( lambda driver: [ elem for elem in driver.find_elements(By.TAG_NAME, 'a') if elem.is_displayed() and elem.is_enabled() ][25] if len([ elem for elem in driver.find_elements(By.TAG_NAME, 'a') if elem.is_displayed() and elem.is_enabled() ]) >= 26 else False ) target_elem.click()
注意:如果页面本身可点击的a标签总数量不足26个,等待逻辑会在20秒后抛出TimeoutException,你可以根据业务需求自行捕获处理异常。
内容的提问来源于stack exchange,提问作者Dew
相关产品推荐
相关产品推荐

