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

同一时刻运行Selenium/Chromedriver两次触发SessionNotCreatedException错误

同一秒触发两次Python截图脚本时出现SessionNotCreatedException错误

我有一段按需执行的Python代码,用于对本地部署的HTTPS网站截图,存在同一秒内被触发两次的可能。若两次执行间隔至少一秒,代码可正常运行数百次;但同一秒运行时,其中一次会抛出如下错误:

Traceback (most recent call last):
  File "/home/trading/python/screenshot_rsi.py", line 37, in <module>
    driver = webdriver.Chrome(options=options)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/chrome/webdriver.py", line 80, in __init__
    super().__init__(
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/chromium/webdriver.py", line 104, in __init__
    super().__init__(
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 286, in __init__
    self.start_session(capabilities, browser_profile)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 378, in start_session
    response = self.execute(Command.NEW_SESSION, parameters)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/webdriver.py", line 440, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.8/dist-packages/selenium/webdriver/remote/errorhandler.py", line 245, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.SessionNotCreatedException: Message: session not created: Chrome failed to start: exited normally.
  (chrome not reachable)
  (The process started from chrome location /snap/bin/chromium is no longer running, so ChromeDriver is assuming that Chrome has crashed.)
Stacktrace:
#0 0x56223f1c45e3 <unknown>
#1 0x56223ee870b7 <unknown>
#2 0x56223eebde55 <unknown>
#3 0x56223eebab81 <unknown>
#4 0x56223ef0547f <unknown>
#5 0x56223eefbcc3 <unknown>
#6 0x56223eec70e4 <unknown>
#7 0x56223eec80ae <unknown>
#8 0x56223f18ace1 <unknown>
#9 0x56223f18eb7e <unknown>
#10 0x56223f1784b5 <unknown>
#11 0x56223f18f7d6 <unknown>
#12 0x56223f15bdbf <unknown>
#13 0x56223f1b2748 <unknown>
#14 0x56223f1b2917 <unknown>
#15 0x56223f1c3773 <unknown>
#16 0x7f28612c1609 start_thread

已尝试的调试方法

  • 添加/移除配置选项
  • 使用独立的--profile-directory、--user-data-dir
  • 指定不同固定端口
  • 添加/移除driver.quit()
  • 创建两个脚本分别命名driver1和driver2

以上方法均无法解决问题。

当前使用的Python代码

import argparse
import random
import string
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from multiprocessing import Process

# Function to generate a random filename
def generate_random_filename():
    characters = string.ascii_uppercase + string.digits
    return ''.join(random.choice(characters) for _ in range(20))

# Parse command-line arguments
parser = argparse.ArgumentParser(description='Capture a screenshot of page.')
parser.add_argument('--time', type=str, required=True, help='The time.')
args = parser.parse_args()

min_port = 9000 
max_port = 9999
random_port = random.randint(min_port, max_port)

options = webdriver.ChromeOptions()
options.binary_location = '/snap/bin/chromium' 
options.add_argument("--user-data-dir=/tmp-chromium")
options.add_argument("--start-maximized")
options.add_argument(r'--profile-directory=Profile2')
options.add_argument('--no-sandbox')
options.add_argument("--disable-setuid-sandbox")
options.add_argument(f"--remote-debugging-port={random_port}")
options.add_argument('--headless=new')
options.add_argument('--disable-gpu')
options.add_argument('--hide-scrollbars')
driver = webdriver.Chrome(options=options)

driver.set_window_size(2200, 1200)
url = f"https://my.url/page?time={args.time}"
driver.get(url)

try:
    max_wait_time = 10  # Adjust this according to your needs
    WebDriverWait(driver, max_wait_time).until(
        EC.presence_of_element_located((By.CLASS_NAME, "cssSelector"))
    )
    screenshot_filename = generate_random_filename()
    screenshot_path = f"/var/www/html/screenshots/{screenshot_filename}.png"
    driver.save_screenshot(screenshot_path)
    print(screenshot_path)
except Exception as e:
    print(f"An error occurred: {e}")

版本信息

  • Chromium 119.0.6045.105 snap
  • ChromeDriver 119.0.6045.105

解决思路与方案

  1. 使用独立临时用户数据目录
    两个进程共用/tmp-chromium会触发文件锁冲突,应为每个进程生成唯一临时目录:

    import tempfile
    import shutil
    
    # 创建临时目录
    user_data_dir = tempfile.mkdtemp(prefix="chromium_")
    options.add_argument(f"--user-data-dir={user_data_dir}")
    
    # 脚本结束后清理目录
    try:
        # 截图逻辑...
    finally:
        if 'driver' in locals():
            driver.quit()
        shutil.rmtree(user_data_dir)
    
  2. 避免端口冲突
    随机端口仍有极小概率撞车,可取消指定--remote-debugging-port,让Chromium自动分配端口;或添加端口检测逻辑,确保使用未被占用的端口。

  3. 添加进程锁或启动延迟

    • 文件锁:用文件锁限制同一时间只有一个实例启动:
      import fcntl
      import time
      
      lock_file = open("/tmp/screenshot_lock", "w")
      try:
          fcntl.flock(lock_file, fcntl.LOCK_EX | fcntl.LOCK_NB)
          # 启动Chromium代码
      except BlockingIOError:
          time.sleep(0.5)
          # 重试或退出
      finally:
          lock_file.close()
      
    • 随机延迟:在脚本开头添加time.sleep(random.uniform(0, 0.5)),分散启动时间。
  4. 修复资源释放逻辑
    当前代码未调用driver.quit(),导致残留进程积累,应在finally块中确保关闭浏览器:

    try:
        # 截图逻辑
    except Exception as e:
        print(f"An error occurred: {e}")
    finally:
        if 'driver' in locals():
            driver.quit()
    
  5. 检查Snap权限限制
    Snap版本Chromium可能有沙箱限制,尝试改用Debian包安装的Chromium,或调整Snap权限:

    sudo snap install chromium --classic
    

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 15:48:11