Python Selenium如何通过find_elements_by_xpath遍历未知数量元素输入值
Python Selenium 按XPath匹配不定数量元素并顺序遍历输入实现
你不需要手动转写JS版本的异步逻辑,Python版本Selenium的API是同步的,写法更简洁:
find_elements(包括旧版find_elements_by_xpath)返回的元素列表,默认顺序就是页面DOM从上到下的排列顺序,完全满足从上到下遍历的要求- 方法会自动返回所有匹配到的元素,不管数量是1个还是上百个,不需要提前获取元素总数
推荐实现(Selenium 4+ 主流版本)
Selenium 4之后旧的find_elements_by_xpath已经被标记为废弃,统一用find_elements搭配定位器类型使用:
from selenium.webdriver.common.by import By # 替换为实际的目标元素XPath TARGET_XPATH = "//div[@class='input-item']/input" # 要输入的指定值 INPUT_VALUE = "待填充的内容" # 获取所有匹配的元素,默认从上到下排序 element_list = driver.find_elements(By.XPATH, TARGET_XPATH) for elem in element_list: # 跳过不可见、不可交互的元素,避免抛错 if not (elem.is_displayed() and elem.is_enabled()): continue # 需要清空原有默认值就加下一行,不需要可以删掉 elem.clear() elem.send_keys(INPUT_VALUE)
动态加载页面适配
如果目标元素是动态渲染、不是页面打开就直接加载完成的,可以搭配显式等待,避免拿到空元素列表:
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC wait = WebDriverWait(driver, 10) # 最长等待10秒 # 等所有匹配元素加载完成后再返回 element_list = wait.until( EC.presence_of_all_elements_located((By.XPATH, TARGET_XPATH)) ) # 后续遍历逻辑和上面一致 for elem in element_list: if elem.is_displayed() and elem.is_enabled(): elem.clear() elem.send_keys(INPUT_VALUE)
旧版本兼容(Selenium 3.x)
如果你用的是还没升级的Selenium 3版本,可以直接用旧API,逻辑完全一致:
element_list = driver.find_elements_by_xpath(TARGET_XPATH) for elem in element_list: if elem.is_displayed() and elem.is_enabled(): elem.send_keys(INPUT_VALUE)
你贴的JS示例里重复调用了两次
findElements查同一个XPath是冗余写法,不管是JS还是Python版本,第一次查询拿到元素列表后直接遍历即可,不需要重复查询。
内容的提问来源于stack exchange,提问作者Zane Baylon
相关产品推荐
相关产品推荐

