All checks were successful
技能自动化发布 / release (push) Successful in 15s
基于 skill-template 脚手架开发,包含: - 5 张业务表(教职工、请假政策、考勤日历、请假记录、假期余额) - 请假核算引擎(扣薪计算、审批层级判定、年假抵扣) - CLI 入口(import-employees / calculate-leave / render-html) - HTML 审批与扣薪报告生成 - 示例数据与完整测试套件(295 tests passed)
4.7 KiB
4.7 KiB
浏览器 RPA 元素拾取与定位标准
先读
RPA_ELEMENT_LOCATING.md。本文只定义浏览器端的拾取、定位、验证和常见陷阱;账号、Profile、HITL 和录屏仍以RPA.md为准。
目录
- 拾取工具
- 拾取步骤
- 定位优先级
- 特殊上下文
- 验证标准
- 禁止模式
- example 路由
1. 拾取工具
优先使用 Playwright Inspector / Codegen 的 Pick Locator,辅以 Chrome/Edge DevTools:
- Pick Locator:点选页面元素,获取 role/label/text/testid 等候选定位器。
- DevTools Elements:确认真实 DOM、属性、父容器、iframe 和 Shadow DOM。
- Playwright trace/screenshot:复核动作发生时的页面状态。
检查器只负责给出候选。复制到生产代码前必须人工确认作用域、唯一性和稳定性。
2. 拾取步骤
- 使用真实
profile_dir和有头浏览器打开目标页面。 - 手工进入发生动作的准确页面、标签页和弹窗状态。
- 用 Pick Locator 点选元素,先记录建议 locator。
- 在 DevTools 中确认:
- accessible role/name
- label、placeholder、可见文本
- 稳定 id/name
data-testid(仅目标系统已提供或自有系统可维护时)- 所在 iframe、dialog、表格行或卡片
- 先定位业务容器,再在容器内定位动作元素。
- 运行
count();关键动作期望1。 - 验证
visible、enabled、必要时editable/checked。 - 执行动作并断言 URL、业务容器、成功提示、单号或状态变化。
- 刷新页面、关闭重开浏览器后复测。
3. 定位优先级
从高到低:
get_by_role(role, name=...)get_by_label(...)- 自有系统的稳定
get_by_test_id(...) get_by_placeholder(...)、get_by_alt_text(...)、get_by_title(...)- 稳定业务文本,优先用于非交互元素或父容器
- 稳定
id/name/ 短 CSS - 容器 +
filter(has_text=...)/has=... - 短 XPath
- 已验证的顺序定位
示例:
dialog = page.get_by_role("dialog", name="订单确认")
submit = dialog.get_by_role("button", name="确认提交")
if await submit.count() != 1:
raise RuntimeError("ERROR:ELEMENT_AMBIGUOUS submit_button")
await submit.wait_for(state="visible")
await submit.click()
await page.get_by_text("提交成功", exact=True).wait_for(state="visible")
列表与重复按钮
不要直接选择全页第一个“添加”:
row = page.get_by_role("row").filter(has_text="客户A")
button = row.get_by_role("button", name="添加")
如果业务键不唯一,先停止并要求补充输入,不要用 .first 猜。
4. 特殊上下文
iframe
先确认元素属于哪个 iframe,再使用 frame_locator。不得因为主页面找不到就改用坐标。
新标签页和弹窗
点击前注册 popup/new page 等待;取得新 Page 后再定位。关闭弹窗不等于业务成功。
Shadow DOM
Playwright CSS locator 默认可穿透 open Shadow DOM;XPath 不穿透。closed Shadow DOM 无法正常读取时,评估目标应用是否提供可访问性属性,不能注入破解。
动态列表
等待列表完成加载后再读取;locator.all() 不会等待动态列表稳定。滚动或刷新后重新获取 locator。
Canvas
先确认是否存在可访问性节点或外层业务控件。完全无 DOM 时才进入局部图像方案,并记录分辨率、缩放和识别区域。
5. 验证标准
- locator 在真实目标页面匹配数量符合元素清单。
- 不因语言、窗口宽度、列表顺序或一次刷新就指向不同业务对象。
- 动作前检查可见、可用;动作后等待真实业务状态。
- 登录态至少结合两个证据:例如稳定用户菜单 + 登录按钮不存在,不能只看单个哈希 class。
- 真实和仿真站明确区分:仿真可以使用
fill()加速测试;真实生产输入遵守项目拟人节奏。
6. 禁止模式
- 用全页所有
input的尺寸和位置猜搜索框。 - 用
.first绕过严格模式。 - 从 DevTools 复制深层
nth-child或绝对 XPath。 - 只等 URL 含
search就判定结果成功。 - 页面结构变化后动态生成 selector 并继续提交。
- 为方便测试给第三方网站注入 testid。
7. example 路由
- 真实网站、登录/HITL/滚动:
../examples/real_browser_rpa/README.md - 自有 sandbox、表单和 adapter:
../examples/simulator_browser_rpa/README.md
复制 example 前先完成目标站元素清单;example 中的任何 URL、selector 和业务字段都不得跨平台照抄。