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

Flask与Selenium集成时出现Invalid Session ID错误求助

解决Flask调用Selenium时出现的Invalid Session ID错误

问题根源

核心问题是Selenium实例初始化时机与Flask运行环境不兼容:在Flask启动前就创建了RoomBooker实例(即Selenium驱动会话),但当Flask处理请求时,这个提前创建的会话可能已失效,或因进程/上下文隔离导致无法正常复用。

解决方案

1. 延迟初始化Selenium实例

不在Flask启动前提前创建RoomBooker,改为首次处理请求时初始化,且每次使用前验证会话有效性:

修改RoomScheduler类,实现延迟加载和会话校验:

class RoomScheduler:
    def __init__(self):
        self.booker = None

    def _get_valid_booker(self):
        # 检查booker是否存在,或会话是否有效
        if self.booker is None or not self._is_session_active():
            # 重新创建Selenium实例
            self.booker = RoomBooker()
        return self.booker

    def _is_session_active(self):
        try:
            # 通过简单操作验证会话是否有效
            self.booker.driver.current_url
            return True
        except Exception:
            # 捕获Invalid Session ID或其他会话失效异常
            return False

    def valid_task(self):
        # 获取有效的booker实例
        booker = self._get_valid_booker()
        # 执行登录等交互操作
        # ...
        return "任务执行完成"

2. 调整Flask中实例的创建时机

将RoomScheduler的初始化移到if __name__ == '__main__'块内,避免在模块导入阶段提前创建Selenium实例:

if __name__ == '__main__':
    signal.signal(signal.SIGINT, keyboard_interrupt_handler)
    logging.basicConfig(filename='app.log', level=logging.INFO,filemode='w', format='%(asctime)s - %(levelname)s - %(message)s')
    logger = logging.getLogger('werkzeug')
    handler = logging.StreamHandler()
    logger.addHandler(handler)
    
    # 延迟初始化scheduler,避免提前创建Selenium实例
    scheduler = RoomScheduler(booker=None)
    scheduler.process_file()
    
    host = host  
    port = 5000  
    url = f'http://{host}:{port}/'
    webbrowser.open(url) 
    app.run(host=host, port=port, debug=False, use_reloader=False)  

3. 优化Selenium类的会话管理

在RoomBooker类中添加会话销毁逻辑,确保程序退出时正确关闭驱动:

class RoomBooker:
    def __init__(self):
        self.logged_in = False
        self.service = Service(executable_path=r"./chromedriver/chromedriver.exe")
        self.options = webdriver.ChromeOptions()
        # 建议关闭detach,避免会话游离
        # self.options.add_experimental_option("detach", True)
        self.driver = webdriver.Chrome(service=self.service, options=self.options)
        self.driver.get("url")

    def close(self):
        try:
            self.driver.quit()
        except Exception:
            pass

然后在Flask的退出信号处理中调用关闭方法:

def keyboard_interrupt_handler(signal_num, frame):
    if scheduler.booker:
        scheduler.booker.close()
    exit(0)

关键说明

  • 提前初始化的Selenium会话可能因闲置超时、进程上下文变化等原因失效,延迟初始化能确保每次请求使用有效会话。
  • 会话有效性校验可自动处理会话过期情况,无需手动重启服务。
  • 关闭detach=True选项,避免浏览器与驱动解除关联导致的会话管理混乱。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 05:30:00