返回博客
技术6 分钟阅读
Vision-first 与 CSS 选择器:为什么坐标点击更稳定
当页面结构变化时,选择器很容易失效。Vision 分析通过截图识别元素,而不是依赖脆弱的 DOM 路径,因此更稳定。
2026年4月8日反检测工作流中的选择器问题
CSS 选择器是自动化工具在页面上查找元素的默认方式。您编写一个路径,如 `button.submit-btn` 或 `#login-form input[name="email"]`,脚本就会点击或填充它。这在标记不变时有效——但在反检测工作流中,标记不断变化。
不同的浏览器配置文件可以看到不同的页面版本。A/B 测试、地理位置定向布局、同意横幅、机器人检测挑战和动态类名都会在会话之间改变 DOM。在配置文件 #1 中有效的选择器可能在配置文件 #12 中不存在。
为什么选择器比您想象的更容易破裂
- 动态类名——React、Next.js 和 Tailwind 等框架生成在构建之间变化的哈希或实用程序类。针对 `.css-1a2b3c` 的选择器在下一次部署后停止工作。
- A/B 测试——同一 URL 可以向不同的访问者提供完全不同的 DOM 结构。您的选择器假设一个变体;页面显示另一个。
- 同意和 cookie 横幅——这些覆盖层注入新元素、改变 z-index,有时会将整个页面包装在编写选择器时不存在的容器中。
- 机器人检测覆盖层——Cloudflare 挑战、DataDome 插页式广告和类似系统用自己的标记替换页面内容。当页面本身消失时,任何选择器调整都无法帮助。
- 区域和地理差异——RTL 布局、翻译的按钮文本和特定地区的 UI 组件都会改变 DOM 树。
在单浏览器脚本中,您一次一个地注意并修复这些问题。在 50 个配置文件的批次中,损坏的选择器在任何人发现之前会在数十个会话中无声地失败。
视觉优先交互如何工作
视觉优先意味着 AI 对页面进行屏幕截图并进行视觉分析——就像人类看屏幕一样。它不是在 DOM 中搜索特定选择器,而是通过外观识别元素:"页面中心的蓝色注册按钮"。
流程很直接:
- 对当前页面状态进行屏幕截图
- 将其发送到识别交互元素及其位置的视觉模型
- 为每个检测到的元素返回规范化的边界框(坐标)
- 使用这些坐标点击、悬停或交互——不需要 DOM 查找
// Vision-first click flow
await browser_parallel_navigate({ url: "https://target.example/signup" });
const grouped = await browser_parallel_vision_analyze_grouped();
// AI identifies elements visually across all active browsers
// Returns normalized bounding boxes for each element
await browser_parallel_click_normalized_box({ box: signUpButton.box });
坐标点击 vs 选择器点击
选择器点击说"在这个 DOM 路径找到元素并点击它"。坐标点击说"在屏幕上的这个位置点击"。当页面分散时,差异很重要。
基于选择器的方法
// Breaks if class name changes, element moves, or overlay appears
await page.click("button.btn-primary.submit-action");
// Breaks if form structure changes
await page.fill("#signup-form input[type=email]", "user@mail.com");
基于视觉的方法
// Works regardless of class names, IDs, or DOM structure
await browser_parallel_screenshot();
const analysis = await browser_parallel_vision_analyze_grouped();
// AI finds "Sign Up" button visually — same as a human would
await browser_parallel_click_normalized_box({ box: analysis.signUp.box });
视觉方法不关心类名、ID 或嵌套深度。如果按钮在屏幕上可见,就会被找到。这在反检测场景中特别强大,其中每个配置文件可能呈现略有不同的页面。
批量操作的分组分析
运行 20+ 个浏览器配置文件并行时,视觉分析需要高效。Ornold 使用分组分析——它从所有活跃会话获取屏幕截图,将它们作为批次发送到视觉模型,并在一次调用中返回每个会话的结果。
这很重要有两个原因:
- 效率——一个 API 调用处理所有会话,而不是 N 个单独的调用。无论批次大小如何,延迟大致保持不变。
- 分散处理——AI 看到每个会话的实际状态。如果配置文件 #7 有 CAPTCHA 覆盖层,而其他的显示表单,分组结果会反映这一点。您可以为每个会话分支逻辑,而不是假设所有页面看起来相同。
// Grouped vision analysis across all active browsers
const results = await browser_parallel_vision_analyze_grouped();
// results.groups shows which browsers are in which state
// e.g., 15 browsers on the form, 3 on CAPTCHA, 2 on error page
DOM 模式仍然获胜的时候
视觉分析并不总是正确的选择。基于 DOM 的交互(Ornold 的默认模式)对于具有稳定标记的结构化页面来说更快、免费且完全可靠。
在以下情况下使用 DOM 模式:
- 目标页面具有稳定、可预测的 HTML(例如,您自己的应用程序、知名平台)
- 您正在填充具有清晰输入字段和标签的表单
- 速度比弹性更重要——DOM 快照是即时的,视觉分析需要 1-3 秒
- 您想避免视觉信用成本
在以下情况下使用 Vision 模式:
- 页面在配置文件之间变化(A/B 测试、地理位置定向、动态布局)
- 您正在处理基于 canvas 的 UI、图像丰富的页面或自定义 web 组件
- 选择器不断破裂,维护成本很高
- 您需要验证页面实际上是什么样子(视觉 QA)
您可以同时启用两种模式。AI 代理会自动为每个操作选择最佳方法——简单表单填充使用 DOM,复杂或不可预测的页面使用视觉。
真实世界比较
以下是在 30 个 Linken Sphere 会话中运行注册流程时实际发生的情况:
基于选择器的自动化
- 30 个会话中的 25 个成功完成
- 3 个失败,因为同意横幅改变了表单布局
- 1 个失败,因为 Cloudflare 提供了插页式广告页面
- 1 个失败,因为网站在运行中部署了新版本,具有不同的类名
- 总计:83% 成功率。5 个会话需要手动干预。
基于视觉的自动化
- 30 个会话中的 29 个成功完成
- 1 个失败,因为页面未加载(网络超时——不是选择器问题)
- 同意横幅、布局移位和类名更改没有任何影响
- 总计:97% 成功率。超时需要一次重试。
随着批次大小的增加,差距会扩大。在 50+ 个配置文件处,基于选择器的自动化通常需要持续维护。基于视觉的自动化保持稳定,因为它适应屏幕上实际显示的内容。
在 Ornold 中设置 Vision 模式
将 AI 代理连接到 Ornold MCP 时启用 vision 模式。在仪表板向导中,在第 2 步选择"两种模式"以获取 DOM + Vision 工具。或手动添加标志:
# Claude Code — enable both DOM and Vision modes
claude mcp add --transport stdio ornold-browser -- npx ornold-mcp --token YOUR_TOKEN --mode both --linken-port 40080
# Codex — in config.toml
[mcp_servers.ornold-browser]
command = "npx"
args = ["ornold-mcp", "--token", "YOUR_TOKEN", "--mode", "both", "--linken-port", "40080"]
每个视觉分析成本 1 个信用。DOM 快照是免费的。启用"两种模式"后,AI 代理默认使用 DOM,仅在需要时切换到视觉。
关键要点
- CSS 选择器假设稳定的 DOM。在反检测工作流中,DOM 是任何东西但不稳定。
- 视觉优先交互通过外观而不是路径查找元素。它自动适应布局变化、覆盖层和 A/B 测试。
- 分组视觉分析处理批次分散——每个会话根据其实际状态进行分析。
- DOM 模式仍然是速度和成本的最佳默认值。当页面不可预测或选择器不断破裂时使用视觉。
- 两种模式可以共存。让 AI 代理为每个操作选择正确的工具。