znlgis 博客

GIS开发与技术分享 — GDAL · GeoServer · PostGIS · QGIS · OpenLayers · Cesium · FreeCAD · NPOI

第08章 - 动作详解(四):浏览器操作

robotgo-flow 大量用于 Web 场景,因此专门封装了一组浏览器操作动作:open_url(打开网址)、refresh(刷新)、back(后退)、forward(前进)、switch_tab(切换标签页)。本章不仅讲这些动作的用法,还会揭示框架背后独特的「浏览器窗口定位」机制——这是理解为什么 robotgo-flow 能在浏览器中稳定工作的关键。

8.1 浏览器窗口定位机制

在讲具体动作前,必须先理解一个核心概念:robotgo-flow 会主动定位浏览器窗口

因为框架是通过「屏幕找图」来定位元素的,如果在整个屏幕范围内查找,可能会误匹配到浏览器之外的内容(比如桌面图标、其他窗口)。为此,引擎实现了 FindBrowserWindow 机制:

  1. 扫描系统进程,查找常见浏览器的可执行文件:chrome.exemsedge.exefirefox.exebrave.exeopera.exe
  2. 跳过尺寸过小(小于 400×300)的窗口,避免误认弹窗或小工具;
  3. 找到浏览器主窗口后,激活并最大化它,并记录窗口的位置与尺寸(windowX/Y/W/H)。

有了窗口坐标后,图像匹配就能「窗口内优先搜索」:只在浏览器窗口区域内找图,找不到才回退到全屏。这大幅提升了匹配的准确性(详见第 10 章)。

何时触发定位:工作流执行开始时会自动调用一次 FindBrowserWindowopen_url 操作后也会重新定位,确保导航到新页面后窗口坐标依然准确。

8.2 open_url:打开网址

open_url 用于在浏览器中打开一个网址:

- open_url: "https://example.com/login"

看似简单,但它的内部实现相当巧妙。引擎的 OpenURL 流程是:

  1. FindBrowserWindow() —— 定位并激活浏览器窗口;
  2. CopyToClipboard(url) —— 把 URL 写入系统剪贴板(robotgo.WriteAll);
  3. Ctrl+L —— 聚焦到浏览器地址栏;
  4. 从剪贴板粘贴(Ctrl+V)—— 把 URL 填入地址栏;
  5. Enter —— 回车导航;
  6. 等待页面加载(browser_page_load_delay);
  7. 再次 FindBrowserWindow() —— 导航后重新定位窗口。

为什么用「剪贴板 + 地址栏」而不是直接输入? 因为 URL 可能很长、含特殊字符,逐字输入慢且易错;通过剪贴板粘贴又快又可靠。而 Ctrl+L 是几乎所有浏览器通用的「聚焦地址栏」快捷键。

前置条件open_url 要求系统中已经打开了受支持的浏览器窗口。它不会帮你启动浏览器,而是操作已有的浏览器窗口。

8.3 refresh:刷新页面

refresh 刷新当前页面,值为布尔 true

- refresh: true

内部通过按 Ctrl+R 实现,随后等待 browser_refresh_delay 设定的时间,让页面重新加载。常用于数据更新后需要重新拉取的场景:

steps:
  - name: "刷新查看最新"
    actions:
      - refresh: true
      - wait: "templates/data_loaded.png"

8.4 back / forward:后退与前进

这两个动作对应浏览器的「后退」「前进」按钮:

- back: true      # 后退
- forward: true   # 前进
  • back:按 Alt+Left,随后等待 browser_navigation_delay
  • forward:按 Alt+Right,随后等待 browser_navigation_delay

它们让工作流可以在浏览历史中前后跳转,例如「进入详情页操作完,后退回列表页继续」:

steps:
  - name: "查看详情后返回"
    actions:
      - click: "templates/item_link.png"
      - wait: "templates/detail_page.png"
      # ... 在详情页做一些操作 ...
      - back: true
      - wait: "templates/list_page.png"

8.5 switch_tab:切换标签页

switch_tab 用于切换到指定编号的标签页,值为 1~9 的整数:

- switch_tab: 2    # 切换到第 2 个标签页

内部通过按 Ctrl+数字(如 Ctrl+2)实现——这是浏览器通用的标签页切换快捷键。注意浏览器约定:Ctrl+9 通常是「切换到最后一个标签」,而非第 9 个。

steps:
  - name: "在多标签间切换"
    actions:
      - switch_tab: 1
      - wait: "templates/tab1_content.png"
      # ... 操作第一个标签 ...
      - switch_tab: 2
      - wait: "templates/tab2_content.png"

8.6 浏览器延时设置回顾

第 4 章提到的三个浏览器延时设置,正是服务于本章的动作:

settings:
  browser_page_load_delay: 3    # open_url 后等待页面加载
  browser_refresh_delay: 3      # refresh 后等待
  browser_navigation_delay: 2   # back/forward 后等待

这些延时是「导航后的固定缓冲」。但要注意,它们只是保底缓冲——更可靠的做法是在导航动作后再跟一个 wait,用元素出现来精确判断页面是否就绪。二者配合使用最稳妥。

8.7 综合示例:多页面数据抓取

综合运用浏览器动作,实现一个「打开页面 → 抓取 → 翻页 → 再抓取」的流程骨架:

name: "多页数据处理"

settings:
  element_timeout: 15
  browser_page_load_delay: 3

steps:
  - name: "打开首页"
    actions:
      - open_url: "https://example.com/list?page=1"
      - wait: "templates/list_ready.png"
  - name: "处理第一页"
    actions:
      - click: "templates/first_row.png"
      - wait: "templates/detail.png"
      # ... 处理详情 ...
      - back: true
      - wait: "templates/list_ready.png"
  - name: "翻到第二页"
    actions:
      - click: "templates/next_page.png"
      - wait_gone: "templates/loading.png"
      - wait: "templates/list_ready.png"

8.8 跨平台注意事项

浏览器动作是 robotgo-flow 最依赖 Windows 平台的部分:

  • 浏览器窗口检测使用了 Windows 特有的进程/窗口 API(robotgo.FindIdsrobotgo.ActivePid);
  • 组合键使用了 altctrl 等修饰键,在 macOS 上通常应换成 cmd

因此,即便底层 robotgo 跨平台,这些浏览器动作目前也仅在 Windows 上验证可用。跨平台适配会在第 19 章讨论。

8.9 常见问题

问题 可能原因 解决方法
open_url 无效 没有已打开的浏览器窗口 先手动打开浏览器;框架不会自动启动浏览器
浏览器窗口未检测到 窗口最小化、被遮挡、多进程干扰 确保浏览器窗口可见、未被遮挡
地址栏没被聚焦 Ctrl+L 被占用或焦点不在浏览器 确认浏览器为活动窗口
切换标签跳错 Ctrl+9 是「最后一个标签」 注意浏览器标签快捷键约定
导航后立即操作失败 页面尚未加载完 在导航动作后加 wait 精确等待

8.10 小结

本章我们讲解了五个浏览器动作:open_url(剪贴板+地址栏方式打开网址)、refresh(Ctrl+R 刷新)、back/forward(Alt+方向键前进后退)、switch_tab(Ctrl+数字切换标签)。更重要的是,我们理解了背后的「浏览器窗口定位」机制——框架主动查找、激活、最大化浏览器窗口并记录坐标,从而实现「窗口内优先搜索」。我们也强调了浏览器动作对 Windows 平台的依赖,以及配合 wait 精确等待的最佳实践。下一章,我们讲解交互式动作与运行时变量注入。