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

Selenium无头浏览器连接故障求助:无法连接DevTools及连接拒绝问题

解决无头模式下Selenium长时运行的连接中断问题

问题梳理

  • Firefox驱动报错:
    urllib3.exceptions.MaxRetryError: HTTPConnectionPool(host='localhost', port=58161): Max retries exceeded with url: /session/1aa9d459-8770-41ec-a25b-a1a9be8f7d2b/elements (Caused by NewConnectionError('<urllib3.connection.HTTPConnection object at 0x1817268d0>: Failed to establish a new connection: [Errno 61] Connection refused'))
    
  • Chrome驱动报错:
    disconnected: Unable to receive message from renderer
      (failed to check if window was closed: disconnected: not connected to DevTools)
    

已排除页面元素过多、长时间无交互的情况,尝试捕获WebDriverException重启驱动但脚本仍终止。

核心解决方案

1. 完善异常捕获范围

现有代码仅捕获WebDriverException,但实际报错可能属于更细分的异常(比如Chrome的NoSuchWindowException、Firefox的连接类错误),需扩大捕获范围并确保重启逻辑在异常块内正确执行。

示例代码(Chrome版):

from selenium import webdriver
from selenium.common.exceptions import WebDriverException, NoSuchWindowException

def restart_chrome_driver(current_url=None):
    # 初始化Chrome配置
    options = webdriver.ChromeOptions()
    options.add_argument('--headless=new')  # 新版无头模式稳定性更强
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-dev-shm-usage')
    options.add_argument('--disable-gpu')
    options.add_argument('--disable-extensions')
    options.add_argument('--disable-plugins-discovery')
    options.add_experimental_option('excludeSwitches', ['enable-logging'])
    
    driver = webdriver.Chrome(options=options)
    if current_url:
        driver.get(current_url)
    return driver

# 主逻辑示例
driver = restart_chrome_driver()
try:
    # 长时运行的业务逻辑,比如循环执行任务
    while True:
        # 业务操作:点击、输入等
        driver.find_element("id", "target-element").click()
        # ... 其他操作
except (WebDriverException, NoSuchWindowException, Exception) as e:
    print(f"捕获异常: {str(e)}")
    print("重启驱动...")
    # 尝试获取当前URL并关闭旧驱动
    current_url = None
    try:
        current_url = driver.current_url
        driver.quit()
    except:
        pass
    # 重启驱动并恢复页面
    driver = restart_chrome_driver(current_url)
    # 可在此添加标志位,让循环继续执行后续任务

2. 优化无头模式配置

  • Chrome改用--headless=new参数,旧版无头模式与正常浏览器行为差异大,稳定性不足;
  • 添加--disable-extensions、--disable-plugins-discovery参数,减少插件或扩展导致的进程崩溃;
  • 可选开启--remote-debugging-port=9222,方便极端情况下尝试重连(但重启驱动更可靠)。

3. 彻底清理残留驱动进程

每次重启前必须杀死残留的浏览器和驱动进程,避免端口占用或资源泄漏:

import psutil

def kill_driver_processes():
    target_procs = ['chromedriver', 'geckodriver', 'chrome', 'firefox']
    for proc in psutil.process_iter(['name']):
        try:
            if proc.name() in target_procs:
                proc.kill()
        except (psutil.NoSuchProcess, psutil.AccessDenied):
            pass

# 在重启驱动前调用
kill_driver_processes()

4. 增加操作重试与间隔

对单个页面操作添加重试逻辑,避免单次失败直接触发重启;同时添加短暂等待,降低浏览器进程负载:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

def safe_click(driver, locator, retry=2):
    for _ in range(retry):
        try:
            element = WebDriverWait(driver, 10).until(EC.element_to_be_clickable(locator))
            element.click()
            return True
        except:
            continue
    return False

# 使用示例
if not safe_click(driver, ("id", "target-element")):
    # 触发驱动重启逻辑
    pass

5. 定期清理缓存

长时间运行后浏览器缓存会占用内存,定期清理可降低崩溃概率:

# 每隔N次操作执行一次
driver.delete_all_cookies()
driver.execute_script("window.localStorage.clear();")
driver.execute_script("window.sessionStorage.clear();")

关键注意事项

  • 确保重启后的driver被正确赋值到全局或后续逻辑可访问的变量中;
  • 记录重启时的任务进度(如当前迭代次数、操作步骤),避免重启后丢失状态;
  • 避免在异常处理块外直接操作已失效的driver实例。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 18:13:33