You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:32:41