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

Selenium爬取商品详情报错:no such window: target window already closed

问题解决思路

核心问题分析

  1. XPath路径错误:
    • 你在all_products.find_elements里用了//开头的XPath,这会从整个文档根节点查找元素,而非限定在all_products容器内,虽表面获取到48个元素,但实际可能包含无效或重复的元素引用。
    • 循环内查找品牌元素时同样用了全局XPath,每次都会返回页面第一个匹配的元素,同时可能因意外触发页面跳转(比如误点到商品链接)导致窗口关闭。
  2. 静态等待不可靠:time.sleep(1)不足以确保页面完全加载完成,后续元素操作可能因元素未就绪引发异常。
  3. 元素引用失效:页面动态渲染过程中,部分商品元素可能因滚动、加载等操作变为过时引用,触发窗口或元素找不到的错误。

修正后的代码

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
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

DRIVER_PATH = '/home/svc/Downloads/chromedriver_linux64/chromedriver'

options = Options()
options.headless = False
options.add_argument("--window-size=1920,1200")
# 禁用可能导致窗口异常的特性
options.add_argument("--disable-popup-blocking")
options.add_argument("--disable-extensions")

driver = webdriver.Chrome(options=options, executable_path=DRIVER_PATH)
driver.get("https://www.douglas.at/de/c/koerper/koerperreinigung/duschgel/130101")

# 显式等待商品列表容器加载完成
wait = WebDriverWait(driver, 10)
all_products = wait.until(EC.presence_of_element_located((By.XPATH, "//div[contains(@class, 'product-grid__listing-content')]")))

# 使用相对路径查找容器内的所有商品元素
products = all_products.find_elements(By.XPATH, ".//div[contains(concat(' ', @class, ' '), ' product-grid-column ')]")
print("length of the list: ", len(products))

for index, product in enumerate(products):
    print("------------------ new product ----------------------------")
    # 滚动到当前商品元素位置,避免元素不可见或引用失效
    driver.execute_script("arguments[0].scrollIntoView({block: 'center'});", product)
    time.sleep(0.5)
    
    try:
        # 相对路径查找当前商品内的元素
        product_name = product.text.strip()
        brand_element = product.find_element(By.XPATH, ".//div[contains(@class, 'text top-brand')]")
        brand = brand_element.text.strip()
        
        print("商品名称:", product_name)
        print("品牌:", brand)
    except Exception as e:
        print(f"第{index+1}个商品获取失败: {str(e)}")
        continue

driver.quit()

关键修改点

  • XPath改为相对路径:所有基于父元素的查找都用.//开头,限定查找范围在当前元素内部,避免全局查找引发的错误。
  • 替换静态等待为显式等待:用WebDriverWait确保商品容器加载完成,提升代码稳定性。
  • 添加滚动操作:每次处理商品前滚动到元素位置,避免因元素在视窗外导致的引用失效或操作异常。
  • 增加异常捕获:单个商品获取失败时不中断整个循环,便于排查问题。
  • 额外配置Chrome选项:禁用弹窗和扩展,减少窗口异常关闭的可能性。

另外,确保你的chromedriver版本与Chrome浏览器版本(110.0.5481.177)完全匹配,版本不一致也可能引发各类窗口驱动错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 15:22:37