opensteer
Compare original and translation side by side
🇺🇸
Original
English🇨🇳
Translation
ChineseOpensteer
Opensteer
Opensteer gives AI agents a real Chromium browser — local or cloud. Use it when normal code is not enough because the task depends on a live browser session.
Default workflow:
- CLI to explore the site and discover behavior.
- Save stable targets with .
persist - SDK to write the final reusable TypeScript.
Do not stop at manual exploration if the user needs automation.
Opensteer为AI Agent提供真实的Chromium浏览器支持,可本地运行也可云端运行。当任务依赖活跃的浏览器会话,普通代码无法满足需求时可以使用它。
默认工作流程:
- 通过CLI探查站点,摸清运行逻辑。
- 使用保存稳定的目标元素。
persist - 使用SDK编写最终可复用的TypeScript代码。
如果用户需要自动化能力,不要停留在手动探查阶段。
Setup
安装
Install the Opensteer skill so the coding agent can use it:
bash
opensteer skills installThis registers the skill with the agent's tool system. Only needed once per environment.
安装Opensteer skill,以便编码Agent可以使用它:
bash
opensteer skills install这条命令会将skill注册到Agent的工具系统中,每个环境仅需执行一次。
When To Use
适用场景
- Real browser session needed (clicks, forms, DOM extraction, navigation).
- Cookies, localStorage, sessionStorage, or auth state involved.
- Reverse-engineering a site API from real browser traffic.
- Browser-backed instead of plain Node HTTP.
fetch() - Coordinate-based interaction (canvas, WebGL, hard-to-target UI).
- Need to reuse a real user's logged-in browser profile.
If the user wants to manually drive a browser and record the flow, use the skill instead.
recorder- 需要真实浏览器会话(点击、表单操作、DOM提取、页面导航)。
- 涉及Cookies、localStorage、sessionStorage或身份认证状态。
- 从真实浏览器流量中逆向分析站点API。
- 需要基于浏览器的而非普通Node HTTP请求。
fetch() - 基于坐标的交互(canvas、WebGL、难以定位的UI元素)。
- 需要复用真实用户已登录的浏览器配置文件。
如果用户想要手动操作浏览器并录制操作流程,请改用 skill。
recorderCore Rules
核心规则
- Always use a workspace for stateful commands: or
--workspace <id>.OPENSTEER_WORKSPACE - Re-snapshot after navigation or big UI changes before reusing element numbers.
- CLI to discover, SDK for the final implementation.
- Use for stable reusable targets and extraction payloads.
persist - Use for SDK code and API experiments. Use
execonly for page-context JavaScript.evaluate - If fails with auth errors, inspect
fetch(),state(), andcookies()before changing transport.storage() - Keep output simple. Prefer ordinary TypeScript with , no extra abstraction.
Opensteer - Close the browser when done. Do not leave headed browsers running. Use or SDK cleanup when the session does not need to stay open.
opensteer browser delete --workspace <id>
- 执行有状态的命令时始终使用工作空间:或
--workspace <id>环境变量。OPENSTEER_WORKSPACE - 在导航或发生较大UI变更后,重新生成快照再复用元素编号。
- 使用CLI做探查,使用SDK做最终实现。
- 使用保存稳定的可复用目标和提取 payload。
persist - 使用运行SDK代码和做API实验,仅在需要页面上下文的JavaScript时使用
exec。evaluate - 如果出现身份认证错误,修改传输方式前先检查
fetch()、state()和cookies()。storage() - 保持输出简洁,优先使用基于的普通TypeScript代码,不要额外封装抽象层。
Opensteer - 使用完毕后关闭浏览器,不要保持有头浏览器运行。当会话不需要保持开启时,使用或SDK的清理方法关闭。
opensteer browser delete --workspace <id>
Choose A Path
功能路径选择
What does the task need?
├─ Click, type, navigate, extract visible data → DOM path
├─ Find or replay a site API → Network path
├─ Analyze, deobfuscate, or sandbox page JavaScript → Scripts analysis
├─ Canvas, WebGL, or hard-to-target UI → Computer-use
├─ Work with multiple tabs or popups → Tab management
├─ Set up browser profile, clone, or attach → Browser sessions
├─ Run browser in the cloud → Cloud mode
├─ Watch what a headless browser is doing → Local view
└─ Unsure → start by capturing network traffic任务需要什么功能?
├─ 点击、输入、导航、提取可见数据 → DOM操作路径
├─ 查找或重放站点API → 网络操作路径
├─ 分析、反混淆或沙箱运行页面JavaScript → 脚本分析
├─ Canvas、WebGL或难以定位的UI → 计算机交互
├─ 处理多个标签页或弹窗 → 标签页管理
├─ 设置浏览器配置文件、克隆或挂载已有浏览器 → 浏览器会话
├─ 在云端运行浏览器 → 云端模式
├─ 查看无头浏览器的运行状态 → 本地视图
└─ 不确定 → 从捕获网络流量开始DOM Path
DOM操作路径
Use this when the goal is clicking, typing, navigating, or extracting visible data.
当目标是点击、输入、导航或提取可见数据时使用该路径。
CLI exploration
CLI探查
bash
opensteer open https://example.com --workspace demo
opensteer snapshot action --workspace demo
opensteer input 5 "laptop" --workspace demo --press-enter --persist "search input"
opensteer click 7 --workspace demo --persist "search button"
opensteer snapshot extraction --workspace demo
opensteer extract '{"items":[{"name":{"element":13},"price":{"element":14}}]}' \
--workspace demo \
--persist "search results"Element numbers come from markers in the snapshot HTML.
c="N"bash
opensteer open https://example.com --workspace demo
opensteer snapshot action --workspace demo
opensteer input 5 "laptop" --workspace demo --press-enter --persist "search input"
opensteer click 7 --workspace demo --persist "search button"
opensteer snapshot extraction --workspace demo
opensteer extract '{"items":[{"name":{"element":13},"price":{"element":14}}]}' \
--workspace demo \
--persist "search results"元素编号来自快照HTML中的标记。
c="N"SDK implementation
SDK实现
ts
import { Opensteer } from "opensteer";
const opensteer = new Opensteer({ workspace: "demo", rootDir: process.cwd() });
await opensteer.open("https://example.com");
await opensteer.input({ persist: "search input", text: "laptop", pressEnter: true });
await opensteer.click({ persist: "search button" });
const data = await opensteer.extract({ persist: "search results" });Use in SDK code only when a stable CSS selector is cleaner than .
selectorpersistts
import { Opensteer } from "opensteer";
const opensteer = new Opensteer({ workspace: "demo", rootDir: process.cwd() });
await opensteer.open("https://example.com");
await opensteer.input({ persist: "search input", text: "laptop", pressEnter: true });
await opensteer.click({ persist: "search button" });
const data = await opensteer.extract({ persist: "search results" });仅当稳定的CSS选择器比更简洁时,才在SDK代码中使用。
persistselectorNetwork Path
网络操作路径
Use this when the goal is to find or replay a site API.
当目标是查找或重放站点API时使用该路径。
CLI exploration
CLI探查
bash
opensteer open https://example.com --workspace demo
opensteer goto https://example.com/search --workspace demo --capture-network page-load
opensteer input 5 "laptop" --workspace demo --press-enter --capture-network search
opensteer network query --workspace demo --capture search --json
opensteer network detail rec_123 --workspace demo --probeUse to learn which transport works.
network detail --probebash
opensteer open https://example.com --workspace demo
opensteer goto https://example.com/search --workspace demo --capture-network page-load
opensteer input 5 "laptop" --workspace demo --press-enter --capture-network search
opensteer network query --workspace demo --capture search --json
opensteer network detail rec_123 --workspace demo --probe使用可以确认哪种传输方式可用。
network detail --probeSession state checks
会话状态检查
bash
opensteer state example.com --workspace demots
const cookies = await opensteer.cookies("example.com");
const localStorage = await opensteer.storage("example.com", "local");
const sessionStorage = await opensteer.storage("example.com", "session");
const state = await opensteer.state("example.com");bash
opensteer state example.com --workspace demots
const cookies = await opensteer.cookies("example.com");
const localStorage = await opensteer.storage("example.com", "local");
const sessionStorage = await opensteer.storage("example.com", "session");
const state = await opensteer.state("example.com");Prove the request with exec
exec使用exec
验证请求
execbash
opensteer exec "
const response = await this.fetch('https://api.example.com/search', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ keyword: 'laptop', count: 24 }),
});
return { status: response.status, data: await response.json() };
" --workspace demobash
opensteer exec "
const response = await this.fetch('https://api.example.com/search', {
method: 'POST',
headers: { 'content-type': 'application/json' },
body: JSON.stringify({ keyword: 'laptop', count: 24 }),
});
return { status: response.status, data: await response.json() };
" --workspace demoSDK implementation
SDK实现
ts
import { Opensteer } from "opensteer";
const opensteer = new Opensteer({ workspace: "demo", rootDir: process.cwd() });
export async function search(keyword: string) {
const response = await opensteer.fetch("https://api.example.com/search", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ keyword, count: 24 }),
});
return response.json();
}Use ordinary syntax. Only set explicitly if probing showed you need it.
fetch()transportts
import { Opensteer } from "opensteer";
const opensteer = new Opensteer({ workspace: "demo", rootDir: process.cwd() });
export async function search(keyword: string) {
const response = await opensteer.fetch("https://api.example.com/search", {
method: "POST",
headers: { "content-type": "application/json" },
body: JSON.stringify({ keyword, count: 24 }),
});
return response.json();
}使用普通的语法即可,仅当探测表明需要显式设置时才指定参数。
fetch()transportScripts Analysis
脚本分析
Use this when you need to understand what JavaScript a page is running — reverse-engineering obfuscated code, finding hidden API calls, or testing script behavior in isolation.
当你需要了解页面运行的JavaScript逻辑——逆向分析混淆代码、查找隐藏的API调用,或者在隔离环境中测试脚本行为时使用该路径。
Capture scripts from the page
从页面捕获脚本
bash
opensteer scripts capture --workspace demo
opensteer scripts capture --workspace demo --url-filter "api" --external --dynamicFlags: , , , to filter by source type. to save as an artifact. to match script URLs.
--inline--external--dynamic--workers--persist--url-filter <pattern>bash
opensteer scripts capture --workspace demo
opensteer scripts capture --workspace demo --url-filter "api" --external --dynamic参数说明:、、、用于按来源类型过滤;用于将脚本保存为制品;用于匹配脚本URL。
--inline--external--dynamic--workers--persist--url-filter <pattern>Beautify and deobfuscate
格式化与反混淆
bash
undefinedbash
undefinedFormat minified code
格式化压缩后的代码
opensteer scripts beautify <artifactId> --workspace demo --persist
opensteer scripts beautify <artifactId> --workspace demo --persist
Deobfuscate packed/obfuscated code
反混淆打包/混淆后的代码
opensteer scripts deobfuscate <artifactId> --workspace demo --persist
undefinedopensteer scripts deobfuscate <artifactId> --workspace demo --persist
undefinedSandbox execution
沙箱执行
Run captured JavaScript in isolation with controlled inputs:
bash
opensteer scripts sandbox <artifactId> --workspace demo \
--fidelity standard \
--timeout 5000 \
--cookies '{"session":"abc123"}' \
--globals '{"window.API_KEY":"test"}' \
--ajax-routes '[{"url":"*/api/*","response":{"data":[]}}]'Fidelity levels: (fast, no DOM), (basic DOM), (complete browser emulation).
minimalstandardfull在隔离环境中运行捕获的JavaScript,可控制输入参数:
bash
opensteer scripts sandbox <artifactId> --workspace demo \
--fidelity standard \
--timeout 5000 \
--cookies '{"session":"abc123"}' \
--globals '{"window.API_KEY":"test"}' \
--ajax-routes '[{"url":"*/api/*","response":{"data":[]}}]'保真度级别:(速度快,无DOM模拟)、(基础DOM模拟)、(完整浏览器模拟)。
minimalstandardfullTypical workflow
典型工作流程
bash
opensteer scripts capture --workspace demo --persist --external
opensteer artifact read art_abc123 --workspace demo # inspect raw
opensteer scripts beautify art_abc123 --workspace demo --persist
opensteer scripts deobfuscate art_def456 --workspace demo --persist
opensteer scripts sandbox art_ghi789 --workspace demobash
opensteer scripts capture --workspace demo --persist --external
opensteer artifact read art_abc123 --workspace demo # 查看原始代码
opensteer scripts beautify art_abc123 --workspace demo --persist
opensteer scripts deobfuscate art_def456 --workspace demo --persist
opensteer scripts sandbox art_ghi789 --workspace demoComputer-Use
计算机交互
Use this only when DOM targeting is not enough.
bash
opensteer computer click 245 380 --workspace demo --capture-network action
opensteer computer type "search query" --workspace demo
opensteer computer key Enter --workspace demo
opensteer computer screenshot --workspace demots
await opensteer.computerExecute({
action: { type: "click", x: 245, y: 380 },
});After coordinate-based actions, switch back to normal extraction or request analysis as soon as possible.
仅当DOM定位无法满足需求时使用该功能。
bash
opensteer computer click 245 380 --workspace demo --capture-network action
opensteer computer type "search query" --workspace demo
opensteer computer key Enter --workspace demo
opensteer computer screenshot --workspace demots
await opensteer.computerExecute({
action: { type: "click", x: 245, y: 380 },
});完成基于坐标的操作后,尽快切换回常规的提取或请求分析流程。
Tab Management
标签页管理
Use when handling OAuth popups, multi-page flows, or any task that opens new tabs.
bash
opensteer tab list --workspace demo # List all open tabs
opensteer tab new https://example.com --workspace demo # Open new tab
opensteer tab 2 --workspace demo # Switch to tab 2
opensteer tab close 3 --workspace demo # Close tab 3
opensteer tab close --workspace demo # Close current tabts
const tabs = await opensteer.listPages();
await opensteer.newPage("https://example.com");
await opensteer.activatePage(2);
await opensteer.closePage(3);Re-snapshot after switching tabs — element numbers are per-page.
处理OAuth弹窗、多页面流程或任何会打开新标签页的任务时使用该功能。
bash
opensteer tab list --workspace demo # 列出所有打开的标签页
opensteer tab new https://example.com --workspace demo # 打开新标签页
opensteer tab 2 --workspace demo # 切换到标签页2
opensteer tab close 3 --workspace demo # 关闭标签页3
opensteer tab close --workspace demo # 关闭当前标签页ts
const tabs = await opensteer.listPages();
await opensteer.newPage("https://example.com");
await opensteer.activatePage(2);
await opensteer.closePage(3);切换标签页后需要重新生成快照——元素编号是按页面独立计算的。
Browser Sessions
浏览器会话
Each workspace has one browser. Three modes:
| Mode | What it does | Data persists? |
|---|---|---|
| Persistent (default) | Browser tied to workspace, survives restarts | Yes — cookies, localStorage, logins, history, extensions all retained |
| Temporary | Headless browser in | No |
| Attach | Connects to an already-running browser via CDP | Depends on that browser |
每个工作空间对应一个浏览器,共三种模式:
| 模式 | 功能说明 | 数据持久化? |
|---|---|---|
| 持久化(默认) | 浏览器与工作空间绑定,重启后仍可使用 | 是——Cookies、localStorage、登录状态、历史记录、扩展程序全部保留 |
| 临时 | 无头浏览器运行在 | 否 |
| 挂载 | 通过CDP连接到已运行的浏览器 | 取决于被挂载的浏览器设置 |
Headless vs headed
无头模式与有头模式
Browsers launch headless by default. Use to see the browser window:
--headless falsebash
opensteer open https://example.com --workspace demo --headless falseUse headed mode for debugging or when the user wants to watch. For hands-free automation, keep headless and use if a human needs to observe.
opensteer view浏览器默认以无头模式启动,使用可以显示浏览器窗口:
--headless falsebash
opensteer open https://example.com --workspace demo --headless false调试或用户需要查看运行过程时使用有头模式。对于自动化运行场景,保持无头模式即可,需要人工查看时可使用。
opensteer viewPersistent sessions
持久化会话
When you with a workspace, the browser's full Chrome user-data directory lives at . Everything Chrome normally persists (cookies, localStorage, IndexedDB, history, extensions) survives between runs.
opensteer open~/.opensteer/workspaces/<id>/browser/user-data/Re-running reconnects to the existing browser if it's still alive, or launches a fresh one with the same profile if it died.
opensteer open --workspace demo当你指定工作空间执行时,浏览器的完整Chrome用户数据目录存储在路径下。Chrome默认持久化的所有内容(Cookies、localStorage、IndexedDB、历史记录、扩展程序)都会在多次运行间保留。
opensteer open~/.opensteer/workspaces/<id>/browser/user-data/重新执行时,如果原有浏览器仍在运行会直接重连,如果已关闭会使用相同的配置文件启动新的浏览器实例。
opensteer open --workspace demoProfile cloning
配置文件克隆
Clone a real user's Chrome profile to start a workspace with their logins already active:
bash
undefined克隆真实用户的Chrome配置文件,即可直接使用用户已有的登录状态启动工作空间:
bash
undefinedDiscover available local browsers and profiles
查找可用的本地浏览器和配置文件
opensteer browser discover
opensteer browser discover
Clone a profile into a workspace
将配置文件克隆到工作空间
opensteer browser clone --workspace demo
--source-user-data-dir "$HOME/Library/Application Support/Google/Chrome"
--source-profile-directory Default
--source-user-data-dir "$HOME/Library/Application Support/Google/Chrome"
--source-profile-directory Default
This copies cookies, localStorage, extensions, and settings from the source browser. Caches and lock files are skipped. The source browser does not need to be closed — cloning while running is safe.opensteer browser clone --workspace demo
--source-user-data-dir "$HOME/Library/Application Support/Google/Chrome"
--source-profile-directory Default
--source-user-data-dir "$HOME/Library/Application Support/Google/Chrome"
--source-profile-directory Default
该操作会从源浏览器复制Cookies、localStorage、扩展程序和设置,跳过缓存和锁文件。源浏览器不需要关闭,运行时克隆也是安全的。Attach to an existing browser
挂载已有浏览器
bash
opensteer open https://example.com --workspace demo --attach-endpoint http://localhost:9222bash
opensteer open https://example.com --workspace demo --attach-endpoint http://localhost:9222Workspace lifecycle
工作空间生命周期
bash
opensteer browser status --workspace demo # Check if browser is running
opensteer browser reset --workspace demo # Wipe browser data, keep workspace
opensteer browser delete --workspace demo # Delete workspace entirelybash
opensteer browser status --workspace demo # 检查浏览器是否运行
opensteer browser reset --workspace demo # 清空浏览器数据,保留工作空间
opensteer browser delete --workspace demo # 完全删除工作空间Cloud Mode
云端模式
Run the browser on Opensteer's cloud infrastructure instead of locally. Use cloud mode when you need browsers that run 24/7, or when the local machine should not run Chromium.
在Opensteer的云端基础设施上运行浏览器,而非本地运行。当需要7*24小时运行浏览器,或者本地设备不适合运行Chromium时可以使用云端模式。
Setup
配置
bash
export OPENSTEER_API_KEY=osk_your_key_here # Required
export OPENSTEER_PROVIDER=cloud # Or use --provider cloud per commandbash
export OPENSTEER_API_KEY=osk_your_key_here # 必填
export OPENSTEER_PROVIDER=cloud # 也可以在每条命令单独加--provider cloud参数Usage
使用
All CLI commands work the same with :
--provider cloudbash
opensteer open https://example.com --workspace demo --provider cloud
opensteer snapshot action --workspace demo
opensteer click 5 --workspace demo所有CLI命令加参数即可正常使用:
--provider cloudbash
opensteer open https://example.com --workspace demo --provider cloud
opensteer snapshot action --workspace demo
opensteer click 5 --workspace demoExport local browser profile to cloud
导出本地浏览器配置到云端
Sync a local browser's cookies to a cloud browser profile so the cloud session starts logged in:
bash
undefined将本地浏览器的Cookies同步到云端浏览器配置,云端会话启动时就已经是登录状态:
bash
undefinedReads cookies from local Chrome, decrypts them, uploads to cloud
从本地Chrome读取Cookies,解密后上传到云端
opensteer browser clone --workspace demo
--source-user-data-dir "$HOME/Library/Application Support/Google/Chrome"
--source-profile-directory Default
--provider cloud
--source-user-data-dir "$HOME/Library/Application Support/Google/Chrome"
--source-profile-directory Default
--provider cloud
The cookies are extracted from the local SQLite database, decrypted, packaged into a portable format, and uploaded. The cloud browser then starts with those cookies applied.opensteer browser clone --workspace demo
--source-user-data-dir "$HOME/Library/Application Support/Google/Chrome"
--source-profile-directory Default
--provider cloud
--source-user-data-dir "$HOME/Library/Application Support/Google/Chrome"
--source-profile-directory Default
--provider cloud
Cookies会从本地SQLite数据库中提取、解密、打包为可移植格式后上传,云端浏览器启动时会自动应用这些Cookies。Local View
本地视图
When Opensteer runs headless, a human cannot see what the browser is doing. Local view streams live screenshots from headless sessions to a browser-based viewer.
bash
opensteer view # Start viewer service, print URL
opensteer view stop # Stop the viewer service
opensteer view --auto # Auto-start viewer on every browser launch
opensteer view --no-auto # Only start viewer when manually requestedThe viewer is a local web UI that shows:
- Live JPEG stream of the active browser tab
- Tab bar with switching
- Navigation controls (back, forward, reload, URL bar)
Local view is a passive observer — it connects to the browser's existing CDP endpoint. Starting or stopping it has zero impact on running browser sessions.
当Opensteer以无头模式运行时,人工无法查看浏览器的操作内容。本地视图可以将无头会话的实时截图流传输到基于浏览器的查看器中。
bash
opensteer view # 启动查看器服务,打印访问URL
opensteer view stop # 停止查看器服务
opensteer view --auto # 每次浏览器启动时自动启动查看器
opensteer view --no-auto # 仅手动请求时启动查看器查看器是本地Web UI,包含以下功能:
- 活跃浏览器标签页的JPEG实时流
- 可切换的标签栏
- 导航控件(后退、前进、刷新、地址栏)
本地视图是被动观察者,它连接到浏览器已有的CDP端点,启动或停止对运行中的浏览器会话没有任何影响。
Interaction Capture & Replay
交互捕获与重放
Record a trace of browser interactions (clicks, typing, network, DOM changes) and replay them deterministically. Useful for building repeatable test flows or comparing behavior across runs.
bash
opensteer interaction capture --workspace demo --key "login-flow" --duration 30000
opensteer interaction get <traceId> --workspace demo
opensteer interaction replay <traceId> --workspace demo
opensteer interaction diff <traceA> <traceB> --workspace demo录制浏览器交互的追踪数据(点击、输入、网络请求、DOM变更),并可确定性重放。适用于构建可复用的测试流程,或者对比不同运行的行为差异。
bash
opensteer interaction capture --workspace demo --key "login-flow" --duration 30000
opensteer interaction get <traceId> --workspace demo
opensteer interaction replay <traceId> --workspace demo
opensteer interaction diff <traceA> <traceB> --workspace demoArtifacts
制品
Commands that use save artifacts to the workspace. Read them back with:
--persistbash
opensteer artifact read <artifactId> --workspace demoArtifacts are created by , , , and other persist-enabled commands.
extract --persistscripts capture --persistscripts beautify --persist使用参数的命令会将制品保存到工作空间中,可通过以下命令读取:
--persistbash
opensteer artifact read <artifactId> --workspace demo制品可由、、以及其他支持persist参数的命令生成。
extract --persistscripts capture --persistscripts beautify --persistUseful SDK Surface
常用SDK接口
- ,
open(url),goto(url, { captureNetwork? })close() snapshot("action" | "extraction")- ,
click(),hover(),input()scroll() extract()- ,
listPages(),newPage(),activatePage()closePage() - ,
network.query()network.detail() waitForPage()- ,
cookies(),storage()state() fetch()- ,
evaluate()addInitScript() - — intercept and modify network requests
route() computerExecute()- ,
browser.status(),browser.clone(),browser.reset()browser.delete()
- 、
open(url)、goto(url, { captureNetwork? })close() snapshot("action" | "extraction")- 、
click()、hover()、input()scroll() extract()- 、
listPages()、newPage()、activatePage()closePage() - 、
network.query()network.detail() waitForPage()- 、
cookies()、storage()state() fetch()- 、
evaluate()addInitScript() - —— 拦截和修改网络请求
route() computerExecute()- 、
browser.status()、browser.clone()、browser.reset()browser.delete()
Guardrails
使用规范
- Snapshot before using element numbers. Snapshot again after UI changes.
- Do not use for API work — use
evaluateorexec.fetch - Do not keep the result as a manual-only workflow if the user needs reusable automation.
- Prefer a small final script over a large framework.
- Close browsers when done. Do not leave headed browser windows open.
- When cloning profiles, verify the source path exists with first.
opensteer browser discover
- 使用元素编号前先生成快照,UI变更后需要重新生成快照。
- 不要使用处理API相关工作,使用
evaluate或exec。fetch - 如果用户需要可复用的自动化能力,不要只提供手动操作流程。
- 优先编写小巧的最终脚本,不要引入庞大的框架。
- 使用完毕后关闭浏览器,不要保持有头浏览器窗口运行。
- 克隆配置文件前,先使用验证源路径存在。
opensteer browser discover