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 提供
数据流向:浏览器/网络 → 页面对象 → 元素