精确运行合同
| 项目 | 要求 |
|---|---|
| SDK | 1.0.0 |
| Browser RPC | protocol 6,endpoint /rpc/v6 |
| Chromium core | 0075 |
| 语义合同 SHA-256 | 40DFB6DEDAA4CD9A1F56BCEBB019A08B1F57025A28069E79605945CA1FF60BE8 |
| Wire API | 41 个 namespaced 方法,每个 schema version 为 1 |
| 能力 | 11 个整数版本能力,均不低于 1 |
| 动作回执 | 22 个精确证据字段 |
| Trace | helixwright.trace.session schema 4 |
启动时严格校验协议、端点、内核合同、方法集合、逐方法 schema、能力版本和语义 hash。 任一不一致都会 fail closed,不会降级到另一套 wire 行为。
快速开始
import helixwright as hw
with hw.launch("https://example.com", name="example") as page:
page.locator("body").wait(timeout_ms=10_000)
print(page.url, page.title())
effect = page.get_by_role(
"link", name="More information..."
).click()
assert effect.ok
assert effect.dispatch_phase == "completed"
assert effect.receipt_confirmed
未传 reuse_profile_id 时,Desktop 创建新的服务端 profile;名称可不传。
指纹选择与 geo-follow 由服务端负责,通常调用者只需按需提供代理。
职责边界
Helix Browser Desktop
管理 profile、指纹、代理、内核、进程、automation session、lease 和 Local API job。
浏览器内核
负责目标解析、frame/shadow 路由、滚动、机械可操作性、可信输入、轨迹、最终复核、动作日志与回执。
Helixwright
提供类型化 facade、不可变 scope、就绪合同、动作结果、状态机、Trace/Authoring 与 Flow IR。
脚本
只描述业务状态、结构化定位、业务就绪和因果结果,不自行启动 Chromium 或伪造 DOM 事件。
定位与原子动作
email = page.get_by_label("Email")
if email.input_value() != "buyer@example.test":
email.fill("buyer@example.test")
effect = page.get_by_role("button", name="Continue").click()
fill() 替换值;type() 聚焦后追加真实按键输入。
普通 click() 已包含目标所属滚动、稳定性、遮挡、命中、最终 pointer-down
复核和可信轨迹,不应额外先滚动或猜坐标。
慢加载与业务就绪
ready = hw.ReadinessContract(
all_of=(
hw.ReadinessSignal.attribute(
"#submit", "data-hydrated", equals="true"
),
),
stable_frames=3,
quiet_ms=100,
)
effect = page.locator("#submit").click(
ready=ready,
timeout_ms=20_000,
)
“元素可见”不等于组件已就绪。业务条件与动作一起发送,在同一 document epoch 内评估, 并在派发前再次检查身份、几何与 hit-test。机械可操作性不能关闭。
不可变 Frame 与 Shadow DOM
payment = page.frame("iframe#payment")
payment.get_by_label("Card number").fill("4111111111111111")
effect = payment.get_by_role("button", name="Pay").click()
每个 Frame/Locator/Input/Probe 都携带自己的冻结 frame chain,不修改全局 frame cursor。 Shadow DOM 与 OOPIF 目标由内核在同一动作事务中解析;目标重渲染后必须重新绑定身份。
轨迹与低层手势
with hw.launch(
"https://example.com",
motion=hw.MotionProfile.careful(seed=20260714),
) as page:
gesture = page.input.gesture(timeout_ms=15_000)
gesture.move(120, 240).down().pause(80)
gesture.move(520, 240, duration_ms=1200).up()
effect = gesture.commit()
普通元素轨迹在最终 frame/target 绑定后由内核生成。高级调用者可一次性提交完整、平衡的 Gesture。回执包含 input sequence、motion/path digest、样本、持续时间、最大步长、 pointer continuity 和 scroll chain;画面光点不能替代这些证明。
事件驱动状态机
def submit(ctx):
return ctx.scope.locator("#submit").click(ready=ctx.ready)
machine = hw.StateMachine([
hw.State(
"form",
match=hw.Signature(
require_selectors=["#form", "#submit"],
absent_selectors=["#complete"],
),
ready=ready,
handler=submit,
expect=hw.OutcomeContract(
success_states=["done"],
progress=[hw.signals.DomChanged()],
no_effect="report",
),
),
hw.State(
"done",
match=hw.Signature(require_selectors=["#complete"]),
terminal=True,
),
])
result = machine.run(page, until="done")
每次 transition 都执行“单 epoch 分类 → 独立事件订阅 → 一个权威动作 → 因果 Outcome → 再分类”。未知、歧义、混合 epoch、外来回执、事件缺口、派发不确定、超时或震荡都会停止。
私有 Trace/Authoring
Trace/Authoring 在观测到时保留原始密码、代理账号密码、Cookie、Authorization、 表单、Storage、动作参数、请求/响应 headers 和 bodies。不会自动掩码或删值。
安全边界是 owner-only ACL、run 隔离与锁、原子写入、显式保留;manifest 固定声明
local_only=true、upload=false,不会自动上传证据。
$run = "evidence\authoring-run"
python -m helixwright author start --url "https://target.example" --run-dir $run
python -m helixwright author exec --run-dir $run --code "page.probe.forms()"
python -m helixwright author checkpoint --run-dir $run --label "form"
python -m helixwright author stop --run-dir $run
一个 controller 持续复用同一 browser/profile/session/page,Trace 在目标导航前启动。 截图只是补充证据,结构化状态、就绪、事件、动作 effect 和 receipt 才是主证据。
API 分层
| 命名空间 | 用途 |
|---|---|
helixwright | launch/attach、Page、Frame、Locator、Input、readiness、motion、effect、statechart |
helixwright.admin | Local API、profile、proxy、core、browser/session 管理 |
helixwright.expert | context/snapshot、Gesture、controller、Trace/probe、Flow IR、离线证据工具 |
helixwright.signals | 类型化、可序列化 Outcome signal |
helixwright.errors | 完整错误层级 |
AI 文档与校验
AI 应先读取 manifest,校验文档字节数和 SHA-256,再读取 always_read 文档和任务相关文档。
合同与文档 hashes 由同一个 manifest 生成器校验。