Python Selenium:在滚动元素内滚动直至找到目标元素的方法
解决方案:滚动可滚动Div至目标元素位置
方法一:直接让目标元素滚动到视图(推荐)
利用scrollIntoView()直接作用于目标元素,浏览器会自动滚动其所在的可滚动容器,让元素进入可见区域。配合显式等待处理元素加载延迟,避免定位失败。
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 定位可滚动容器 scrollableSectionXPATH = '//*[@id="root"]/div/div[2]/div[2]/div/div[2]/div' scrollableSection = context.driver.find_element(By.XPATH, scrollableSectionXPATH) # 修正目标元素XPath的引号嵌套问题(原代码会触发语法错误) element_xpath = '//form[@class="field-config"]/div[1]/div[1]/div[1]/div[1]' # 显式等待目标元素可被定位,最长等待10秒 target_element = WebDriverWait(context.driver, 10).until( EC.presence_of_element_located((By.XPATH, element_xpath)) ) # 让目标元素滚动到视图中,block参数控制元素对齐方式,behavior控制滚动动画 context.driver.execute_script( "arguments[0].scrollIntoView({behavior: 'auto', block: 'center'});", target_element )
block: 'center'可让元素居中显示,替换为'start'则让元素顶部对齐容器顶部behavior: 'smooth'实现平滑滚动,'auto'为即时滚动,可按需选择
方法二:循环滚动容器直到元素可见
针对动态加载内容的场景,循环滚动可滚动容器,每次滚动后检查目标元素是否可见,直到找到元素或滚动至容器底部。
from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC import time scrollableSectionXPATH = '//*[@id="root"]/div/div[2]/div[2]/div/div[2]/div' scrollableSection = context.driver.find_element(By.XPATH, scrollableSectionXPATH) element_xpath = '//form[@class="field-config"]/div[1]/div[1]/div[1]/div[1]' # 获取容器初始滚动高度 last_height = context.driver.execute_script("return arguments[0].scrollHeight", scrollableSection) while True: # 尝试定位并检查元素是否可见 try: target_element = context.driver.find_element(By.XPATH, element_xpath) if target_element.is_displayed(): context.driver.execute_script("arguments[0].scrollIntoView();", target_element) break except: pass # 滚动容器至当前底部 context.driver.execute_script("arguments[0].scrollTop = arguments[0].scrollHeight", scrollableSection) time.sleep(1) # 等待滚动后新内容加载 # 判断是否已滚动至容器底部 new_height = context.driver.execute_script("return arguments[0].scrollHeight", scrollableSection) if new_height == last_height: print("已滚动到底部,未找到目标元素") break last_height = new_height
- 若无需一次性滚到底部,可将
scrollTop = scrollHeight改为scrollTop += 500,实现每次滚动固定距离 - 可根据实际需求调整等待时间
time.sleep(1)的时长
内容的提问来源于stack exchange,提问作者Angel
相关产品推荐
相关产品推荐

