Selenium使用following::input查找元素耗时过长,求解决办法
优化Selenium元素查找速度的解决方案
你的问题出在./following::input这个XPath表达式的特性上:following轴会遍历当前节点之后的所有节点(不管层级、位置),如果页面元素数量多,遍历过程会非常耗时。下面是几个实用的优化方案:
缩小查找范围
不要全局遍历后续所有节点,而是限定到当前元素所在的特定区块。比如如果当前元素之后的input都在某个父容器(比如class为content-block的div)里,可修改XPath为:element.find_elements(By.XPATH, './following::div[contains(@class,"content-block")][1]//input')先定位到目标区块再查找input,能大幅减少需要遍历的节点数。
替换为更高效的CSS选择器
CSS选择器在Selenium中的执行效率通常优于XPath轴查询。如果你的场景是查找当前元素之后的同级元素下的input,可使用兄弟选择器~结合后代选择器:# 查找当前元素之后所有同级节点下的input element.find_elements(By.CSS_SELECTOR, '~ * input')如果能明确input的特征(比如class、属性),直接指定特征会更快:
element.find_elements(By.CSS_SELECTOR, '~ * input.form-control')优化XPath表达式,避免全量遍历
放弃following轴,改用更具体的路径。比如只查找当前元素的后续兄弟节点下的input:element.find_elements(By.XPATH, './following-sibling::*//input')或者过滤掉隐藏元素,减少返回结果的同时也能加快遍历:
element.find_elements(By.XPATH, './following::input[not(@hidden) and not(contains(@style,"display:none"))]')确保页面加载稳定后再查找
在执行查找前,等待页面关键元素加载完成,避免在页面渲染过程中执行查询:from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 等待当前元素所在的父容器加载完成 WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.ID, 'parent-container-id'))) # 再执行查找 elements = element.find_elements(By.XPATH, './following::input')
内容的提问来源于stack exchange,提问作者DSM
相关产品推荐
相关产品推荐

