使用Selenium时find_elements仅获取首个元素的问题求助
问题分析与修复方案
核心问题点
商品名称定位使用全局XPATH,而非相对定位
循环中//div[2]/span/span是全局路径,每次都会匹配页面第一个符合条件的元素,而非当前raw_item下的子元素。需改为相对定位的.//div[2]/span/span,通过.限定查找范围为当前元素节点。商品列表等待逻辑不合理
原代码用EC.presence_of_element_located仅等待父容器存在,不确保所有商品加载完成。且父容器使用绝对XPATH,页面结构变动就会失效,建议直接等待所有商品元素,或用更稳定的选择器。滚动加载逻辑存在缺陷
按document.body.clientHeight滚动会直接跳转到页底,Walmart的滚动加载需要逐步触发;固定sleep时长不稳定,无法准确判断新内容是否加载完成。隐式等待与显式等待混用
同时启用driver.implicitly_wait()和WebDriverWait会导致等待时间不可控,建议仅保留显式等待。
修复后的代码
import time from selenium.webdriver.support import expected_conditions as EC from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait import undetected_chromedriver as uc url='https://www.walmart.com/search?q=lego&facet=retailer_type%3AWalmart' driver = uc.Chrome(enable_cdp_events=True) driver.maximize_window() driver.get(url) # 优化滚动加载:通过页面高度变化判断新内容加载完成 last_height = driver.execute_script("return document.body.scrollHeight") for _ in range(3): driver.execute_script("window.scrollTo(0, document.body.scrollHeight);") # 等待页面高度变化,确认新内容加载 WebDriverWait(driver, 10).until( lambda d: d.execute_script("return document.body.scrollHeight") > last_height ) last_height = driver.execute_script("return document.body.scrollHeight") time.sleep(1) # 直接等待所有商品元素加载完成,使用稳定的CSS选择器 items_list = WebDriverWait(driver, 10).until( EC.presence_of_all_elements_located((By.CSS_SELECTOR, '[data-testid="list-view"]')) ) for raw_item in items_list: # 使用相对XPATH定位当前商品下的名称 product_name = WebDriverWait(raw_item, 5).until( EC.presence_of_element_located((By.XPATH, ".//div[2]/span/span")) ).text.strip() print(product_name) driver.quit()
修复说明
- 商品名称定位改为相对路径,确保只在当前商品节点内查找;
- 用
EC.presence_of_all_elements_located直接等待所有商品加载,避免父容器定位的脆弱性; - 滚动逻辑改为通过页面高度变化判断新内容加载,比固定sleep更可靠;
- 移除隐式等待,统一使用显式等待,避免等待机制冲突。
内容的提问来源于stack exchange,提问作者dfcsdf
相关产品推荐
相关产品推荐

