DrissionPage · 运行流程图(两条运行时路径) Chromium 栈 · 浏览器自动化(CDP) Session 栈 · 原生请求(requests) 入口 Chromium() 携带 ChromiumOptions 启动/连接配置 解析配置 handle_options 确定地址、端口、启动参数、代理等 连接 / 启动浏览器 ws_address 或已有调试端口 → CDP 直连 否则 connect_browser() 拉起/接管浏览器进程 建立 Driver(CDP WebSocket) 获取 browser_id → 单例缓存 _BROWSERS(同 id 复用) 浏览器初始化 注册事件处理 · 启动 Messenger 线程(收 CDP 事件) Target.setDiscoverTargets · 创建 DownloadManager 获取标签页 latest_tab / get_tab / new_tab 返回 ChromiumTab(ChromiumBase + SessionPage) 页面初始化 ChromiumBase 启用 Page/DOM 域 · Page.getFrameTree 收集 frame DOM.getDocument → resolveNode 取文档根 页面导航 page.get(url) 导航并等待加载/readyState 完成 元素定位 page(locator) find_by_syntax / find_by_any → wait_for_ele 轮询重试 返回 ChromiumElement / ShadowRoot 未找到则返回 NoneElement 占位 元素 / 页面操作 click / input / wait / set / scroll → CDP 或 JS 执行 退出 browser.quit() / 关闭浏览器 断开 WebSocket · 回收 Messenger 线程 入口 SessionPage() 携带 SessionOptions 会话配置 建立 requests.Session 配置 headers / 代理 / 超时 发起请求 page.get(url) / post _s_connect → 得到 Response(html / json) 元素定位 page(locator) lxml 解析响应 HTML → 返回 SessionElement 读取 / 操作 文本·属性·find → 本地解析(不发浏览器) 可选切换 d / s 模式 ChromiumTab 可切到 s 模式调用本栈逻辑 退出 session.close() 关闭 HTTP 会话连接 ChromiumTab.s 模式 后台机制:Messenger 线程(事件循环) Driver 持续接收 CDP 事件 → 匹配事件处理器回调 (页面加载、frame 导航、JS 弹窗、DOM 变化等) 图例 实线箭头 = 顺序执行 虚线 = 可选 / 混合调用 Chromium(CDP) 栈 Session(requests) 栈 启动后页面/元素能力由 _units 提供 数据流向:浏览器/网络 → 页面对象 → 元素