Python Selenium如何使用相对XPath等待列表块内目标元素加载
错误原因
WebDriverWait.until() 要求传入可调用对象,你直接执行 x.find_elements() 拿到的是元素列表/单个WebElement对象,本身不具备可调用属性,因此触发 TypeError。你之前用绝对路径的写法可行,是因为 EC.element_to_be_clickable() 本身返回的是可调用的条件对象,符合参数要求。
相对XPath的实现方案
你可以用 lambda 封装基于当前列表块的相对查找逻辑,既满足可调用要求,也不需要写冗长的绝对路径:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 先获取所有列表块 blocks = driver.find_elements(By.XPATH, "//div[contains(@class, 'list')]") for block in blocks: # 滚动到当前块(用scrollIntoView比手动算坐标更稳妥,兼容页面缩放/动态布局) driver.execute_script("arguments[0].scrollIntoView({block: 'start'})", block) # 方案1:等待当前块内至少存在1个按钮元素(仅确认存在) WebDriverWait(driver, 5).until( lambda driver: block.find_elements(By.XPATH, ".//a[contains(@class, 'button')]") ) # 方案2:等待当前块内第一个按钮可点击(和你之前绝对路径的效果完全一致) WebDriverWait(driver, 5).until( lambda driver: EC.element_to_be_clickable( (By.XPATH, ".//a[contains(@class, 'button')]") )(block) )
补充说明
相对路径开头的 . 代表从当前定位的父元素(也就是循环里的每个block)下查找,完全不会依赖全局DOM层级,比绝对路径的兼容性好很多,页面结构微调也不会失效。
内容的提问来源于stack exchange,提问作者Gman
相关产品推荐
相关产品推荐

