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

Selenium循环点击商品返回后报stale element reference错误如何解决

问题根源

你首次加载列表页时获取的products元素列表,绑定的是当时页面的DOM节点。调用driver.back()返回列表页后,浏览器重新渲染了页面,原有DOM节点全部销毁,之前保存的元素引用全部失效,所以第二次循环读取product.text时直接触发StaleElementReferenceException,这个问题和页面加载速度无关,加time.sleep无法解决。


方案1:按索引遍历,每次循环重新获取元素

保留你原有的「点击进入-返回」操作逻辑,调整遍历方式即可:

Path = "C:\\Program Files (x86)\\chromedriver.exe"
driver = webdriver.Chrome(Path)

driver.get("https://www.emag.ro/")

search_bar = driver.find_element_by_id("searchboxTrigger") 
search_bar.send_keys("laptopuri")
search_bar.send_keys(Keys.RETURN)

main = None
try:
    main = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "main-container"))
    )
    print("Page loaded,main retrived succesfully\n")
except:
    driver.quit()

# 先获取商品总数量
products = main.find_elements_by_css_selector("div.card-item.js-product-data")
product_count = len(products)

# 按索引遍历,每次循环都重新获取元素
for i in range(product_count):
    # 每次循环先重新定位main容器和商品列表
    main = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "main-container"))
    )
    products = main.find_elements_by_css_selector("div.card-item.js-product-data")
    product = products[i]

    raw_name = product.text
    raw_price = product.find_element_by_css_selector("p.product-new-price").text
    link = product.find_element_by_tag_name("a")

    link.click()

    spec_page = None
    try:
        spec_page = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, "col-md-12"))
        )
    except:
        driver.quit()

    print(spec_page)
    driver.back()

方案2:提前收集所有商品信息,逐个访问(更稳定)

不需要来回切换页面,避免重复获取元素的开销,稳定性更高:

Path = "C:\\Program Files (x86)\\chromedriver.exe"
driver = webdriver.Chrome(Path)

driver.get("https://www.emag.ro/")

search_bar = driver.find_element_by_id("searchboxTrigger") 
search_bar.send_keys("laptopuri")
search_bar.send_keys(Keys.RETURN)

main = None
try:
    main = WebDriverWait(driver, 10).until(
        EC.presence_of_element_located((By.ID, "main-container"))
    )
    print("Page loaded,main retrived succesfully\n")
except:
    driver.quit()

products = main.find_elements_by_css_selector("div.card-item.js-product-data")
# 提前把所有商品的信息存到列表里
product_info_list = []
for product in products:
    raw_name = product.text
    raw_price = product.find_element_by_css_selector("p.product-new-price").text
    link = product.find_element_by_tag_name("a").get_attribute("href")
    product_info_list.append({
        "name": raw_name,
        "price": raw_price,
        "link": link
    })

# 遍历存储好的信息直接访问详情页
for info in product_info_list:
    driver.get(info["link"])
    spec_page = None
    try:
        spec_page = WebDriverWait(driver, 10).until(
            EC.presence_of_element_located((By.CLASS_NAME, "col-md-12"))
        )
    except:
        driver.quit()
    print(spec_page)

内容的提问来源于stack exchange,提问作者Dragos Ciupe

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 21:09:03