澄清点 3 的落地:允许 Agent 组合多种模态(截图/视觉、AX-tree、DOM、OCR、坐标定位、网络信号)来啃复杂页面与特殊情况(canvas、shadow DOM、iframe、纯视觉控件、异常态、反爬变形)。底座负责采集与打包多模态上下文,Agent 负责融合决策,成果回沉进定位器仓库惠及 0 Token 回放。
| 模态 | 擅长 | 盲区 |
|---|---|---|
| AX-tree | 语义/角色/可访问名,稳定 ref,抗样式漂移 |
canvas/自绘控件/无障碍缺失的页面看不见 |
| DOM | 精确结构、属性、shadow/iframe 边界 | 结构频繁变动、混淆 class、虚拟列表 |
| 截图(视觉) | 布局、图标、纯视觉控件、"看起来像按钮" | 无精确坐标语义、易受分辨率/主题影响 |
| OCR | 图片/canvas 内文字、验证提示 | 慢、易错、无结构 |
| 坐标定位 | 兜底点击"就在那个位置" | 脆、随布局漂移 |
| 网络信号 | 已知 XHR/接口、加载完成判定 | 不反映最终渲染 |
结论:复杂页面需要多模态交叉印证——例如"AX 说这里有个 combobox,截图显示是放大镜输入框,OCR 读到占位符『搜索』,三者一致 → 高置信定位"。
flowchart LR
subgraph BASE["底座 · 多模态感知(执行面)"]
SNAP["snapshot() 一次采集"]
SNAP --> AX["AX-tree(精简可交互子树)"]
SNAP --> DOM["DOM 摘要(含 shadow/iframe 展平)"]
SNAP --> SHOT["截图(整页/元素/裁剪)"]
SNAP --> OCR["按需 OCR(canvas/图片区域)"]
SNAP --> NET["网络/加载信号"]
SNAP --> GRID["坐标网格/包围盒"]
end
subgraph AGENT["外部 Agent · 融合决策(见 10)"]
FUSE["交叉印证 → 选元素/判成功/定策略"]
end
BASE -->|打包 multimodal_ctx| AGENT
AGENT -->|结构化: LocatorBundle/Decision| BASE
BASE --> SINK["回沉定位器仓库(见 03/07)"]
- 底座只感知不判断:一次
snapshot()产出对齐的多模态包(同一时刻、同一 DPR、带元素↔包围盒映射),避免"截图与 DOM 不同步"。 - Agent 融合:通过 Cognition Port 拿到多模态包做决策(10);返回结构化定位/判据。
- 按能力裁剪:若 Agent 无视觉能力,底座改发"AX + OCR 文本 + 坐标"文本化上下文(能力协商见 10 §5)。
flowchart TD
TARGET["要定位的元素"] --> A["AX 候选: role+name"]
TARGET --> B["DOM 候选: 属性/结构"]
TARGET --> C["视觉候选: 图标/形状/相对布局"]
TARGET --> D["OCR 候选: 区域文字"]
A & B & C & D --> FUSE["融合打分<br/>(一致性越高置信越高)"]
FUSE --> BUNDLE["多模态 LocatorBundle(按置信排序)"]
BUNDLE --> REPO["写入定位器仓库(07)"]
- 交叉印证打分:多模态指向同一元素 → 高置信;冲突 → 降置信并标注,供 Agent 复核。
- 回沉复用:融合出的
LocatorBundle写入定位器仓库(03 §6 / 07 §4),回放期 0 Token 直接用;仅当全部命中失败才再触发多模态自愈。 - 与坐标兜底的关系:坐标是
visual定位器的最后一跳,且以"相对容器包围盒"表达以抗整体布局漂移。
flowchart TD
CASE{"页面特殊情况"} --> C1["canvas/自绘控件"]
CASE --> C2["shadow DOM / iframe"]
CASE --> C3["纯视觉控件(图标无文字)"]
CASE --> C4["虚拟滚动/懒加载列表"]
CASE --> C5["动态弹窗/异常态/A-B 变体"]
CASE --> C6["疑似反爬变形/验证挑战"]
C1 --> S1["截图+OCR+坐标点击; 记录相对锚点"]
C2 --> S2["DOM 展平穿透 shadow; iframe 边界显式标注(注意 iframe 交互限制)"]
C3 --> S3["视觉模板/图标匹配 + 相对布局锚点"]
C4 --> S4["滚动加载 + 按 item 相对定位 + 去重"]
C5 --> S5["多模态判异常态 → 分支/等待/重试"]
C6 --> S6["区分‘可拟人通过’ vs ‘硬挑战’; 硬挑战升级人工(03/05)"]
| 情况 | 主用模态组合 | 策略要点 |
|---|---|---|
| canvas / 自绘控件 | 截图 + OCR + 坐标 | 无 DOM 语义,靠视觉+OCR 定位,记录相对锚点回沉 |
| shadow DOM / iframe | DOM 展平 + AX | 穿透 shadow;iframe 内容受限时显式标注边界、必要时切上下文 |
| 纯视觉控件 | 视觉模板 + 相对布局 | 图标无文字,用形状/位置锚点 + 邻近文本辅助 |
| 虚拟滚动列表 | AX/DOM + 滚动信号 | 边滚边抽、按相对位置定位、业务键去重(与 11 loop 呼应) |
| 动态弹窗/异常态 | 截图 + AX + 网络 | 多模态判定当前态,走 branch/wait/retry(07 控制流) |
| 反爬变形/挑战 | 截图 + 网络 | 先判"拟人可过"还是"硬挑战";硬挑战→升级人工(03 §8) |
多模态是 L1 本地自愈的能力来源(02 §5):
flowchart LR
FAIL["首选定位器 miss"] --> MMFUSE["L1: 多模态融合重定位(0 Token)"]
MMFUSE -->|命中| FIX["回写 + 韧性重排"]
MMFUSE -->|仍失败| ESCALATE["L2: 带多模态包回调 Agent(见 10)"]
- L1 就用多模态:不是只重试 CSS/XPath,而是调动 AX+视觉+OCR+坐标交叉找回元素——这让"0 Token 兜底"能覆盖更多漂移。
- L2 升级也带多模态:回调 Agent 时附上完整多模态包(10 §4 的
multimodal_ctx),Agent 决策质量更高。
- 分级采集:默认只采 AX+DOM(轻);截图/OCR 按需触发(复杂情况或自愈时),避免每步都重采。
- OCR 局部化:只对目标区域/ canvas 做 OCR,不整页跑。
- 快照缓存与失效:快照绑定"URL + 关键容器 AX hash",容器外变化不失效(与 02 §7 缓存键一致),减少重复采集。
- 回放优先零多模态:回放正常路径只用已固化的定位器(0 Token、无视觉开销);多模态是"特殊情况与自愈"的按需能力,不是每步默认。
- 底座一次
snapshot()产出对齐的多模态包(AX/DOM/截图/OCR/坐标/网络)。 - 底座只采集、Agent 融合决策,按 Agent 能力裁剪上下文(I-6/10)。
- 多模态融合定位带置信排序并回沉定位器仓库,回放期 0 Token 复用。
- 复杂页面处理册覆盖 canvas/shadow/iframe/纯视觉/虚拟列表/异常态/反爬。
- L1 自愈调动多模态;硬挑战正确升级人工。
- 分级采集 + 局部 OCR + 快照缓存,回放正常路径不引入多模态开销。