Selenium中find_element导致for循环中断问题求助
问题分析与解决
你的循环只执行一次就停止,核心原因有两个:
1. 浏览器实例被提前销毁
getItems函数里创建的browser对象,在函数返回元素列表后,会被Python的垃圾回收机制自动销毁(函数内的局部变量在执行完毕后失去引用)。这导致后续循环中操作item元素时,会抛出StaleElementReferenceException异常,直接终止循环——你没捕获异常,所以看起来像是循环只跑了一次。
2. 等待逻辑无效
WebDriverWait(browser, 10)只是创建了一个等待对象,但没有指定任何等待条件(比如等待元素加载完成),页面可能还没完全渲染就返回了元素列表,导致部分元素状态异常。
修复后的代码
import os from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def init_browser(): path_to_browser = os.path.abspath(os.getcwd()) + "\\driver\\chromedriver" service = Service(executable_path=path_to_browser) browser = webdriver.Chrome(service=service) return browser if __name__ == "__main__": url = "https://lamoda.ru/c/4153/default-women/?is_sale=1" # 改用更稳定的相对XPATH,避免绝对路径依赖页面结构 items_xpath = "//div[contains(@class, 'x-product-card__card')]" price_xpath = ".//span[contains(@class, 'x-product-card__price-new')]" browser = init_browser() browser.get(url) # 等待商品列表加载完成,直到至少有一个元素可见 WebDriverWait(browser, 10).until( EC.visibility_of_element_located((By.XPATH, items_xpath)) ) items = browser.find_elements(By.XPATH, items_xpath) print(f"共找到 {len(items)} 个商品") for idx, item in enumerate(items): try: print(f"索引: {idx}") # 等待当前商品的价格元素可见 price_elem = WebDriverWait(item, 5).until( EC.visibility_of_element_located((By.XPATH, price_xpath)) ) print(f"价格: {price_elem.text}") except Exception as e: print(f"处理索引 {idx} 时出错: {str(e)}") continue browser.quit()
关键优化点
- 浏览器实例生命周期管理:把浏览器初始化移到主逻辑中,循环结束后再手动关闭,确保元素操作时浏览器会话始终有效。
- 有效等待:使用
WebDriverWait配合expected_conditions等待元素加载完成,避免操作未渲染的元素。 - 稳定定位器:替换脆弱的绝对XPATH为基于class属性的相对路径,降低页面结构变化带来的定位失败风险。
- 异常捕获:循环内添加异常捕获,单个元素处理失败时不会终止整个循环。
内容的提问来源于stack exchange,提问作者0Z0SK0
相关产品推荐
相关产品推荐

