快速入门
安装
se-cli 以全局 CLI 的形式发布在 npm 上。它需要 Node.js 18+,并且你的机器上至少安装了 Chrome、Edge 或 Firefox 中的一种。
npm install -g @browsers-cli/se-cli
信息
驱动自动管理。 selenium-manager(随 selenium-webdriver 一起打包)会根据你的浏览器和平台下载正确的驱动二进制文件——无需手动配置。
你的第一个会话
核心循环是 open → snapshot → click → close。open 会启动一个持有 WebDriver 的长驻守护进程;snapshot 返回一个紧凑的 YAML 树;像 e1 这样的引用(ref)让你无需选择器即可对元素执行操作。
se-cli open https://example.com
se-cli snapshot
# - document:
# - heading "Example Domain" [level=1]
# - link "More information..." [ref=e1]
se-cli click e1
se-cli close
概念模型
se-cli 是一个短生命周期 CLI,通过行分隔的 JSON 与一个长生命周期守护进程通信。该守护进程持有 WebDriver 实例和引用注册表。以下四个概念驱动着其他一切:
┌─────────────────┐ Unix socket / Win pipe ┌──────────────────────┐
│ se-cli │ ─── line-delimited JSON ─▶ │ se-cli daemon │
│ (short-lived) │ ◀── single response ───── │ (holds WebDriver) │
└─────────────────┘ └──────────────────────┘
│
│ W3C WebDriver HTTP
▼
┌──────────┐
│ Browser │
│(Chrome/ │
│ Edge/FF) │
└──────────┘
CLI 进程
每个命令都会生成一个。发送一行 JSON,接收一个响应,然后退出。零模式开销——所有状态都由守护进程持有。
守护进程
在第一次 open 时启动。在多次 CLI 调用之间持续存在。持有 WebDriver 实例、快照树和引用注册表。
套接字 / 管道
通过 Unix 套接字(Linux/macOS)或 Windows 命名管道传输行分隔的 JSON。每个连接一个请求——没有长期存在的流。
引用注册表
可交互元素会获得 data-se-ref="eN" 属性。<cache>/ms-se-cli/daemon/ 中的 .session JSON 文件在 CLI 退出后仍然保留。
使用示例
真实世界的模式:表单自动化、并行会话、CDP 附加、Shell 脚本、查找与搜索,以及代码生成。
表单提交
se-cli open https://app.example.com/login
se-cli snapshot
# - textbox "Email" [ref=e1]
# - textbox "Password" [ref=e2]
# - button "Sign in" [ref=e3]
se-cli fill e1 "user@example.com"
se-cli fill e2 "password123"
se-cli click e3
se-cli snapshot
se-cli close
并行浏览器
# 两个会话,两个浏览器
se-cli -s=chrome open https://example.com \
--browser=chrome
se-cli -s=firefox open https://example.com \
--browser=firefox
se-cli -s=chrome title
se-cli -s=firefox title
se-cli -s=chrome close
se-cli -s=firefox close
CDP 附加
# 以调试模式启动 Chrome
google-chrome --remote-debugging-port=9222
# 附加到正在运行的浏览器
se-cli open --cdp=http://localhost:9222
se-cli snapshot
se-cli screenshot --filename=debug.png
se-cli close
Shell 脚本
# 使用 --raw 获取干净的输出
TITLE=$(se-cli --raw title)
URL=$(se-cli --raw url)
# 通过 eval 统计元素数量
COUNT=$(se-cli --raw eval \
"document.querySelectorAll('.item').length")
echo "Found $COUNT items on $TITLE"
# 面向管道的 JSON 输出
se-cli --json snapshot | jq '.refs[]'
查找与搜索
# 在快照中搜索文本
se-cli find "Submit"
# - button "Submit order" [ref=e7]
# 正则搜索
se-cli find --regex "price.*\\$[0-9]+"
# - text "price: $29.99" [ref=e12]
# 点击找到的元素
se-cli click e12
代码生成
$ se-cli fill e1 "hello@example.com"
### Ran Selenium code
await driver.findElement(
By.css('[data-se-ref="e1"]')
).sendKeys("hello@example.com");
# Copy directly into test files