API 参考
本页汇总通用 Agent API,以及各平台专属的构造函数、选项、操作和辅助方法。
本页记录 API 契约。安装、端到端工作流和故障排查请参考对应指南。平台 Agent 默认继承共享 Agent API;平台章节只记录对应环境的构造方式、选项、能力差异和工具。
本页保留少量完整示例,帮助理解相关 API 如何组合使用。更完整的接入流程和最佳实践请参考各章节末尾的指南链接。
共享 Agent API
Agent 选项与配置
Midscene 针对每个不同环境都有对应的 Agent。每个 Agent 的构造函数都接受一组共享的配置项(设备、报告、缓存、AI 配置、钩子等),然后再叠加平台专属的配置,比如浏览器里的导航控制或 Android 的 ADB 配置。
你可以通过下面的链接查看各 Agent 的导入路径和平台专属参数:
- 在 Puppeteer 中,使用 PuppeteerAgent
- 在 Playwright 中,使用 PlaywrightAgent
- 在桥接模式(Bridge mode)中,使用 AgentOverChromeBridge
- 在 Android 中,使用 Android API 参考
- 在 iOS 中,使用 iOS API 参考
- 如果你要把 GUI Agent 集成到自己的界面,请参考 自定义界面 Agent
参数
这些 Agent 有一些相同的构造参数:
generateReport: boolean: 如果为 true,则生成报告文件。默认值为 true。persistExecutionDump: boolean: 如果为 true,Midscene 还会在报告旁边额外写出每次执行对应的 JSON dump 文件。默认值为 false。这个选项要求generateReport保持为true。reportFileName: string: 报告输出名称,默认值由 midscene 内部生成。它在不同outputFormat下含义不同:single-html(默认):按文件名处理。Midscene 会在midscene_run/report/下写入<reportFileName>.html(如果已带.html后缀则保持不变)。html-and-external-assets:按目录名处理。Midscene 会在midscene_run/report/<reportFileName>/下写入index.html与相关静态资源。
autoPrintReportMsg: boolean: 如果为 true,则打印报告消息。默认值为 true。cache?: false | { id: string; strategy?: 'read-only' | 'read-write' | 'write-only'; cacheDir?: string }:false:完全禁用缓存。id:必填的缓存 ID。strategy:可选缓存策略。默认值为'read-write'。cacheDir:可选缓存目录路径。配置后,缓存文件会写入该目录,而不是<MIDSCENE_RUN_DIR>/cache。相对路径会基于当前工作目录解析,而不是基于MIDSCENE_RUN_DIR。这样可以把缓存、日志和报告目录拆开。
cacheId: string | undefined(已废弃):仅用于向后兼容。推荐使用cache.id。aiContexts: { default?: string; [apiName]?: string }:Agent 级 AI 补充信息,可包含业务事实、判断或操作规则、约束以及输出要求。如果配置了default,它会作为所有 AI API 共享的缺省回退值,仅当本次调用和对应 API 都没有自己的 context 时使用。解析规则为options.context ?? aiContexts[apiName] ?? aiContexts.default,只使用优先级最高的已定义值,不会自动合并。空字符串会显式清空低优先级的用户 context。默认值为空。aiActContext: string(已废弃):aiContexts.aiAct的兼容配置。两者同时存在时以aiContexts.aiAct为准;没有aiContexts.aiAct时,它与aiContexts.aiAct的作用相同。新代码请使用aiContexts.aiAct;更早的名称aiActionContext也已废弃,仅为兼容而保留。modelConfig: Record<string, string | number>:当前 Agent 的模型配置。传入该参数后,当前 Agent 不再读取系统环境变量中的模型配置。详细用法见下文。replanningCycleLimit: number:aiAct的最大重规划次数。标准模型默认 20,UI-TARS 模型默认 40,AutoGLM 模型默认 100。推荐通过 Agent 入参设置;MIDSCENE_REPLANNING_CYCLE_LIMIT环境变量仅作兼容读取。waitAfterAction: number: 每次动作执行后的等待时间(毫秒)。这让 UI 有时间稳定,然后再执行下一个动作。默认值为 300 毫秒。useDeviceTime: boolean:是否使用目标设备的本地时间记录任务时间。目标接口必须实现getDeviceLocalTimeString。如果未实现,Midscene 会输出警告并改用运行环境的系统时间。默认值为false。onTaskStartTip: (tip: string) => void | Promise<void>:可选回调,在每个子任务执行开始前收到一条可读的任务描述提示。默认值为 undefined。createOpenAIClient: (openai, options) => Promise<OpenAI | undefined>:可选的 OpenAI 客户端包装函数,可用于接入可观测性工具或自定义中间件。详细示例见下文。onLLMUsage: (usage: AIUsageInfo) => void:可选回调。每次大模型调用的用量信息就绪后,Midscene 会调用一次该函数,可用于实时统计用量和成本。outputFormat: 'single-html' | 'html-and-external-assets': 控制报告的生成格式。'single-html'(默认)将所有截图作为 base64 内嵌到单个 HTML 文件中,并把reportFileName作为 HTML 文件名。'html-and-external-assets'将截图保存为独立的 PNG 文件到子目录,并把reportFileName作为该目录名,适用于报告文件过大的场景。注意:使用'html-and-external-assets'时,报告必须通过 HTTP 服务器或 CDN 地址访问,无法直接使用file://协议打开。这是因为浏览器的 CORS(跨源资源共享)限制会阻止从 file 协议加载相对路径的本地图片。如需在本地测试,可在报告目录下启动简易的 HTTP 服务器。进入报告目录后运行以下命令之一:- 使用 Node.js:
npx serve - 使用 Python:
python -m http.server或python3 -m http.server然后通过http://localhost:3000(或终端显示的端口)访问报告。
- 使用 Node.js:
screenshotShrinkFactor: number: 控制截图的缩放比例,以减少发送给 AI 模型的图像大小,从而减少 token 消耗。默认值为 1(不缩放)。如果将其设置为 2,则截图的宽高将缩小为原来的一半,面积缩小为原来的四分之一。你可以根据实际情况调整这个值,以在图像清晰度和 token 消耗之间找到最佳平衡点。- 对于移动端设备,将
screenshotShrinkFactor设置为 2 可以在保持清晰度的同时减少 token 的消耗,但不建议设置的值超过 3,否则可能会导致图像过于模糊,影响 AI 模型的理解。 - 对于 Web 页面,如果页面内容比较复杂或包含大量细节,不建议设置过高的
screenshotShrinkFactor,以避免截图过于模糊。通常也可以通过 Puppeteer 或 Playwright 的deviceScaleFactor在更上游控制截图尺寸。
- 对于移动端设备,将
screenshotShrinkFactor 与 deviceScaleFactor 的区别:
-
screenshotShrinkFactor是 Midscene 自定义的参数,用于控制拿到浏览器、手机等设备的截图后,是否对其进行尺寸压缩。目的是减少 token 消耗、加快模型响应速度。但过度压缩会导致图片模糊,影响模型理解。 -
deviceScaleFactor是 Puppeteer 和 Playwright 自带的参数,用于配置高清屏适配(现在很多设备都是高清屏了)时将一个 CSS 逻辑像素渲染为几倍的物理像素。这也就是为什么deviceScaleFactor和实际设备的缩放比例不一致时,非 headless 模式下可能会出现页面闪烁。同时,这一缩放逻辑也决定了 Puppeteer/Playwright 的截图尺寸(基于物理像素)。相比于screenshotShrinkFactor,它是在更上游的生产端控制了截图尺寸。
二者是否可以同时使用?
- Web 场景:二者同时使用的意义不大,应该优先使用
deviceScaleFactor,直接在生产端控制截图尺寸。- 一种特殊情况:你期望配置
deviceScaleFactor来避免浏览器闪烁,但同时又不期望发送给模型的截图过大,此时可以同时使用screenshotShrinkFactor控制发送给模型时的图片压缩。
- 一种特殊情况:你期望配置
- 移动端等非 Web 场景:因为没有
deviceScaleFactor参数可用,所以只能通过screenshotShrinkFactor来控制模型消费时使用的截图尺寸。
设备 CLI 可以按单次调用传入这些 Agent 行为参数。把 API 的 camelCase 参数名转换成不带平台前缀的 kebab-case flag,例如 waitAfterAction -> --wait-after-action。各平台 CLI 入口请参考 Skills。
自定义模型
modelConfig: Record<string, string | number> 可选。它允许你通过代码配置模型,而不是通过环境变量。
如果在 Agent 初始化时提供了
modelConfig,系统环境变量中的模型配置将全部被忽略,仅使用该对象中的值。 这里可配置的 key / value 与 模型配置 文档中说明的内容完全一致。Default、Planning 和 Insight 模型的职责请参考模型策略。
自定义 OpenAI 客户端
createOpenAIClient: (openai, options) => Promise<OpenAI | undefined> 可选。它允许你包装 OpenAI 客户端实例,用于集成可观测性工具(如 LangSmith、Langfuse)或应用自定义中间件。
参数说明:
openai: OpenAI- Midscene 创建的基础 OpenAI 客户端实例,已包含所有必要配置(API 密钥、基础 URL、代理等)options: Record<string, unknown>- OpenAI 初始化选项,包括:baseURL?: string- API 接入地址apiKey?: string- API 密钥dangerouslyAllowBrowser: boolean- 在 Midscene 中始终为 true- 其他 OpenAI 配置选项
返回值:
- 返回包装后的 OpenAI 客户端实例,或返回
undefined表示使用原始实例
规划与交互
这些是 Midscene 中各类 Agent 的主要 API。
agent.ai() 和 agent.aiAct() 会根据自然语言自动规划并执行多个步骤。agent.aiTap()、agent.aiInput() 等即时操作 API 直接执行指定动作,AI 模型只负责定位等底层任务。
aiAct() 或 ai()
这个方法允许你通过自然语言描述 UI 操作目标和断言条件。执行期间,Midscene 会基于最新的界面状态持续进行 AI 规划和操作,直至完成目标。如果提示词中的断言失败,aiAct 会及时抛出错误。
这个接口在之前版本里也被写为 aiAction(),当前的版本兼容两种写法。为了保持代码的一致性,建议使用新的 aiAct() 方法。
- 类型
-
参数:
prompt: string | object- 用自然语言描述的操作目标和断言条件,或使用图片作为提示词。断言条件不是必填项。options?: object- 可选,一个配置对象,包含:cacheable?: boolean- 当启用 缓存功能 时,是否允许缓存当前 API 调用结果。默认值为 truedeepThink?: 'unset' | true | false- 控制 Midscene 在aiAct执行规划时的具体实现。详见deepThink规划模式。deepLocate?: boolean- 是否开启深度定位。默认值为 false。context?: string- 本次调用的额外上下文。详见单次调用上下文。fileChooserAccept?: string | string[]- 当文件选择器弹出时,指定对应的文件路径。可以是单个文件路径或路径数组。仅在 web 页面(Playwright、Puppeteer 或 Chrome extension Bridge mode)中可用。该选项不受fileChooserAllowedDir限制。- 注意:如果文件输入框不支持多文件(没有
multiple属性),但是传入了多个文件,会抛出错误。 - 注意:如果点击触发了文件选择器但没有传入
fileChooserAccept参数,文件选择器会被忽略,页面可以继续正常操作。 - 注意:Chrome extension Bridge mode 上传本地文件时,需要在
chrome://extensions> Midscene > “Details” 中开启插件的 “Allow access to file URLs” 权限。开启后请从目标http(s)://页面重新连接桥接模式。 - 注意:Chrome extension Bridge mode 不支持目录上传输入框(
webkitdirectory/directory)。如需上传目录,请使用 Playwright。
- 注意:如果文件输入框不支持多文件(没有
fileChooserAllowedDir?: string:显式授权当前aiAct通过提示词上传文件时可访问的目录。未配置时,模型规划的文件上传会被拒绝。配置后,提示词中的相对路径会基于此目录解析,并校验是否位于此目录下;绝对路径则直接校验是否位于此目录下。位于此目录下的 symlink 也允许上传。建议将其设置为测试用例的fixtures目录,以避免 AI 幻觉或页面提示词攻击导致aiAct上传敏感文件。abortSignal?: AbortSignal- 可选的 AbortSignal,用于中止aiAct的执行。当信号被触发时,Midscene 会停止当前的规划循环并抛出错误。适用于实现超时控制或用户主动取消操作的场景。
-
返回值:
- 返回执行完成后的规划输出文本;如果规划没有产生输出,则返回
undefined。执行失败时会抛出错误。
- 返回执行完成后的规划输出文本;如果规划没有产生输出,则返回
-
示例:
deepThink 规划模式
deepThink 控制 aiAct 的规划实现:
- 默认情况下,
aiAct会在同一次规划请求中完成下一步规划和目标元素定位。 - 设置为
true后,aiAct会更注重任务拆解,并将任务规划和元素定位分为不同的模型调用。复杂任务可能因此更加稳定,但模型调用次数和延迟也会增加。
deepThink 支持 'unset' | true | false。'unset' 是兼容旧写法的取值,与 false 的行为相同。
deepThink 不控制模型原生思考。相关环境变量请参考模型原生思考。
在 aiAct 提示词中上传文件
如需让 aiAct 上传提示词中提到的文件,请为该次调用显式传入 fileChooserAllowedDir。建议将其设置为测试用例的 fixtures 目录。Midscene 会在打开文件选择器的操作之前规划文件选择器配置;相对路径和绝对路径都会先解析,再校验解析结果是否仍在所选目录内。
如果一次 aiAct 需要上传多个文件,请在提示词中把每个相对路径与对应的上传操作明确写出。后出现的路径会覆盖此前配置的文件选择器路径。不要将提示词中的文件路径与 options.fileChooserAccept 混用:模型在规划过程中生成的后续文件选择器配置可能覆盖该 option 的值。
此能力仅适用于 web 页面(Playwright、Puppeteer 和 Chrome extension Bridge mode)。当 fixture 不在当前工作目录下,或需要让同一提示词在本地和 CI 环境中复用时,请配置 fileChooserAllowedDir。
在 Chrome extension Bridge mode 中上传本地文件时,需要在 chrome://extensions > Midscene > “Details” 中开启插件的 “Allow access to file URLs” 权限。开启后请切回目标 http(s):// 页面,再重新连接桥接模式。
在实际运行时,Midscene 会将用户指令规划(Planning)成多个步骤,然后逐步执行。如果 Midscene 认为无法执行,将抛出一个错误。
为了获得最佳效果,请尽可能提供清晰、详细的步骤描述。
关联文档:
aiTap()
点击某个元素
- 类型
-
参数:
locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:deepLocate?: boolean- 是否开启深度定位。该参数原来叫deepThink,现已更名为deepLocate。默认值为 false。context?: string- 本次调用的额外上下文。详见单次调用上下文。xpath?: string- 目标元素的 xpath 路径,用于执行当前操作。如果提供了这个 xpath,Midscene 会优先使用该 xpath 来找到元素,然后依次使用缓存和 AI 模型。默认值为空cacheable?: boolean- 当启用 缓存功能 时,是否允许缓存当前 API 调用结果。默认值为 truefileChooserAccept?: string | string[]- 当文件选择器弹出时,指定对应的文件路径。可以是单个文件路径或路径数组。仅在 web 页面(Playwright、Puppeteer 或 Chrome extension Bridge mode)中可用。- 注意:如果文件输入框不支持多文件(没有
multiple属性),但是传入了多个文件,会抛出错误。 - 注意:如果点击触发了文件选择器但没有传入
fileChooserAccept参数,文件选择器会被忽略,页面可以继续正常操作。 - 注意:Chrome extension Bridge mode 不支持目录上传输入框(
webkitdirectory/directory)。如需上传目录,请使用 Playwright。
- 注意:如果文件输入框不支持多文件(没有
-
返回值:
Promise<void>
-
示例:
aiHover()
在 Web 页面和桌面端(
@midscene/computer)中可用,在移动端(Android、iOS 或 HarmonyOS)下不可用。
鼠标悬停某个元素上。
- 类型
-
参数:
locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:
-
返回值:
Promise<void>
-
示例:
aiInput()
在某个元素中输入文本。
- 类型
-
参数:
推荐用法:
locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。opt: object- 配置对象,包含:value: string | number- 必填,要输入的文本内容。- 当
mode为'replace'时:文本将替换输入框中的所有现有内容。 - 当
mode为'typeOnly'时:直接输入文本,不会先清空输入框。 - 当
mode为'clear'时:会忽略文本内容,仅清空输入框。
- 当
deepLocate?: boolean- 是否开启深度定位。该参数原来叫deepThink,现已更名为deepLocate。默认值为 false。context?: string- 本次调用的额外上下文。详见单次调用上下文。xpath?: string- 目标元素的 xpath 路径,用于执行当前操作。如果提供了这个 xpath,Midscene 会优先使用该 xpath 来找到元素,然后依次使用缓存和 AI 模型。默认值为空cacheable?: boolean- 当启用 缓存功能 时,是否允许缓存当前 API 调用结果。默认值为 trueautoDismissKeyboard?: boolean- 如果为 true,则键盘会在输入文本后自动关闭,仅在 Android/iOS/HarmonyOS 中有效。默认值为 true。keyboardTypeDelay?: number- 按键间延迟,单位为毫秒。取值必须是有限的非负数。该选项在legacy模式下是否生效取决于平台既有的输入路径,详见下表。支持延迟的legacy路径会在值大于0时逐个 Unicode 码点输入。适用于输入框在快速输入下丢字的场景。inputStrategy?: 'legacy' | 'sequential' | 'bulk'- 控制 Midscene 如何把文本发送给平台。默认值为'legacy'。'legacy':保留各平台现有行为。它是兼容性默认值,升级后不会改变已有测试的输入方式。'sequential':逐个 Unicode 码点发送。即使未设置keyboardTypeDelay或将其设为0,Midscene 也会逐个发送。'bulk':在平台支持时,只调用一次平台输入操作,以发送完整字符串。Web 的replace会先选中旧值,再使用insertText。这个过程只产生一次插入input事件。它不会先产生清空input事件,再逐字符产生input事件。其他平台只会收到 Midscene 发起的一次底层输入调用。不过,操作系统或驱动仍可能合成多个应用事件。- 使用
'bulk'时,必须省略keyboardTypeDelay,或将它设为0。如果值大于0,Midscene 会抛出错误。所有策略都拒绝负数和非有限数值。动作级配置优先于 Device 或 Agent 的默认值。因此,单次动作选择'bulk'时,可以用keyboardTypeDelay: 0覆盖正数默认值。
mode?: 'replace' | 'clear' | 'typeOnly'- 输入模式。(默认值: 'replace')'replace': 先清空输入框,然后输入文本。'typeOnly': 直接输入文本,不会先清空输入框。'clear': 清空输入框,不会输入新的文本。
所有平台的
inputStrategy默认值均为'legacy'。该模式会沿用先前版本中 Midscene 针对各平台的输入逻辑,具体表现可能因平台而异:兼容用法(已过时,但仍然支持):
value: string | number- 要输入的文本内容。locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选的配置对象,类型与推荐用法中的opt类型相同。
-
返回值:
Promise<void>
-
示例:
我们最近更新了 aiInput 的 API 签名,将定位提示作为第一个参数,使得参数顺序更直观。旧的签名 aiInput(value, locate, options) 仍然完全兼容,但建议新代码使用推荐的签名。
aiClearInput()
清空输入框内容。适合作为一个独立步骤使用:在输入前先清空,或只需删除现有文本而暂时不输入新内容。
- 类型
-
参数:
-
返回值:
- 返回
Promise<void>
- 返回
-
示例:
aiClearInput 与 aiInput 的取舍
aiInput(locate, { value: '...' }) 默认会先清空输入框(mode: 'replace')。只有在需要把清空当成独立一步时(例如测试空值校验,或想把清空和输入拆成两步分别控制)才使用 aiClearInput。
aiKeyboardPress()
按下键盘上的某个键。
- 类型
-
参数:
推荐用法:
locate: string | object | undefined- 可选的元素定位描述,或使用图片作为提示词。传入undefined时,不执行 AI 定位和预先点击,按键会直接作用于当前获得焦点的元素。opt: object- 配置对象,包含:keyName: string- 必填,要按下的键,如Enter、Tab、Escape等;输入文本请使用aiInput()。Web 和 Computer Device 支持Control+A、Shift+Enter等 modifier shortcut,使用+连接按键。可在共享按键名称定义中查看非移动端的候选名称,实际支持情况以平台为准。内置的 Android、iOS 和 Harmony Device 仅支持单键。Harmony 支持一组保守的具名键以及A-Z、0-9;?等没有独立键码的输出字符不属于按键名。不支持的按键和移动端组合键会抛出错误;自定义 Device 的支持情况取决于其实现。deepLocate?: boolean- 是否开启深度定位。该参数原来叫deepThink,现已更名为deepLocate。默认值为 false。context?: string- 本次调用的额外上下文。详见单次调用上下文。xpath?: string- 目标元素的 xpath 路径,用于执行当前操作。如果提供了这个 xpath,Midscene 会优先使用该 xpath 来找到元素,然后依次使用缓存和 AI 模型。默认值为空cacheable?: boolean- 当启用 缓存功能 时,是否允许缓存当前 API 调用结果。默认值为 true
兼容用法(已过时,但仍然支持):
key: string- 要按下的键,如Enter、Tab、Escape等。locate?: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选的配置对象,类型与推荐用法中的opt类型相同。
-
返回值:
Promise<void>
-
示例:
我们最近更新了 aiKeyboardPress 的 API 签名,将可选的定位提示作为第一个参数,使得参数顺序更直观。如果快捷键应该直接作用于当前焦点,请传入 undefined,这样不会执行定位或点击。此时仍需提供有效的模型配置,系统会在执行 action 前完成配置校验,但不会向模型发起定位请求。旧的签名 aiKeyboardPress(key, locate, options) 仍然完全兼容,但建议新代码使用推荐的签名。
aiScroll()
滚动页面或某个元素。
- 类型
-
参数:
推荐用法:
locate: string | object | undefined- 用自然语言描述的元素定位,或使用图片作为提示词。如果未传入或为 undefined,Midscene 会在当前鼠标位置滚动。opt: object- 配置对象,包含:scrollType?: 'singleAction' | 'scrollToBottom' | 'scrollToTop' | 'scrollToRight' | 'scrollToLeft'- 滚动类型,默认值为singleAction。direction?: 'down' | 'up' | 'left' | 'right'- 滚动方向,默认值为down。仅在scrollType为singleAction时生效。不论是 Android 还是 Web,这里的滚动方向都是指页面哪个方向的内容会进入屏幕。比如当滚动方向是down时,页面下方被隐藏的内容会从屏幕底部开始逐渐向上露出。distance?: number | null- 滚动距离,单位为像素。设置为null表示由 Midscene 自动决定。deepLocate?: boolean- 是否开启深度定位。该参数原来叫deepThink,现已更名为deepLocate。默认值为 false。context?: string- 本次调用的额外上下文。详见单次调用上下文。xpath?: string- 目标元素的 xpath 路径,用于执行当前操作。如果提供了这个 xpath,Midscene 会优先使用该 xpath 来找到元素,然后依次使用缓存和 AI 模型。默认值为空cacheable?: boolean- 当启用 缓存功能 时,是否允许缓存当前 API 调用结果。默认值为 true
兼容用法(已过时,但仍然支持):
scrollParam: PlanningActionParamScroll- 滚动参数(包含 scrollType、direction、distance)。locate?: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选的配置对象,类型与推荐用法中的opt类型相同。
-
返回值:
Promise<void>
-
示例:
我们最近更新了 aiScroll 的 API 签名,将定位提示作为第一个参数,使得参数顺序更直观。旧的签名 aiScroll(scrollParam, locate, options) 仍然完全兼容,但建议新代码使用推荐的签名。
aiPinch()
执行双指缩放手势,用于放大或缩小。支持 Android、iOS 和 Web(基于 Chromium 的浏览器)。
- 类型
-
参数:
locate: string | object | undefined- 用自然语言描述的缩放目标元素,或使用图片作为提示词。如果未传入,缩放将在屏幕中心执行。opt: object- 配置对象,包含:direction: 'in' | 'out'- 必填。"in"= 双指收拢(缩小),"out"= 双指张开(放大)。distance?: number- 每根手指移动的距离(像素)。默认值为屏幕较短边的四分之一。duration?: number- 缩放手势持续时间(毫秒),默认值为500。deepLocate?: boolean- 是否开启深度定位。默认值为 false。context?: string- 本次调用的额外上下文。详见单次调用上下文。xpath?: string- 目标元素的 xpath 路径。默认值为空。cacheable?: boolean- 当启用缓存功能时,是否允许缓存。默认值为 true。
-
返回值:
Promise<void>
-
示例:
- Android:通过 yadb 的
-pinch命令实现。 - iOS:通过 W3C Actions API 双触摸指针实现。
- Web:通过 CDP 触摸事件实现。Puppeteer/Playwright 需设置
enableTouchEventsInActionSpace: true。Playwright 仅支持 Chromium 内核浏览器。 - HarmonyOS:不支持。
uitest框架未提供多触点 API。
aiLongPress()
长按(按住不放)某个元素,常用于唤起右键/上下文菜单、触发选中模式或其他长按手势。
- 类型
-
参数:
locate: string | object- 要长按的元素的自然语言描述,或通过图像提示。opt?: object- 可选配置对象:
-
返回值:
- 返回
Promise<void>
- 返回
-
示例:
- Android、iOS、HarmonyOS、Web(基于 Chromium 的浏览器,通过触摸事件实现)。HarmonyOS 会忽略
duration选项,因为底层uitestAPI 不支持自定义按住时长。
aiDoubleClick()
双击某个元素。
- 类型
-
参数:
locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:
-
返回值:
Promise<void>
-
示例:
aiRightClick()
可用于 web 页面和 PC 桌面端(
@midscene/computer),不可用于移动设备(Android、iOS 或 HarmonyOS)。
右键点击某个元素。请注意,Midscene 在右键点击后无法与浏览器原生上下文菜单交互。这个接口通常用于已经监听了右键点击事件的元素。
- 类型
-
参数:
locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:
-
返回值:
Promise<void>
-
示例:
提取、定位与断言
aiAsk()
使用此方法,你可以针对当前页面,直接向 AI 模型发起提问,并获得字符串形式的回答。
aiAsk() 与 aiString() 的查询和返回行为相同,但仍可分别通过 aiContexts.aiAsk 和 aiContexts.aiString 配置 Agent 级 context。
- 类型
-
参数:
prompt: string | object- 用自然语言描述的询问内容,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:domIncluded?: boolean | 'visible-only'- 是否向模型发送精简后的 DOM 信息,一般用于提取 UI 中不可见的属性,比如图片的链接。如果设置为'visible-only',则只发送可见的元素。默认值为 false。screenshotIncluded?: boolean- 是否向模型发送截图。默认值为 true。context?: string- 本次调用的额外上下文。详见单次调用上下文。
-
返回值:
- 返回一个 Promise。返回 AI 模型的回答。
-
示例:
除了 aiAsk 方法,你还可以使用 aiQuery 方法,直接从 UI 提取结构化的数据。
aiQuery()
使用此方法,你可以直接从 UI 提取结构化的数据。只需在 dataDemand 中描述期望的数据格式(如字符串、数字、JSON、数组等),Midscene 即返回相应结果。
- 类型
-
参数:
dataDemand: string | object:描述预期的返回值和格式。options?: object- 可选,一个配置对象,包含:domIncluded?: boolean | 'visible-only'- 是否向模型发送精简后的 DOM 信息,一般用于提取 UI 中不可见的属性,比如图片的链接。如果设置为'visible-only',则只发送可见的元素。默认值为 false。screenshotIncluded?: boolean- 是否向模型发送截图。默认值为 true。context?: string- 本次调用的额外上下文。详见单次调用上下文。
-
返回值:
- 返回值可以是任何合法的基本类型,比如字符串、数字、JSON、数组等。
- 你只需在
dataDemand中描述它,Midscene 就会给你满足格式的返回。
-
示例:
此外,我们还提供了 aiBoolean(), aiNumber(), aiString() 三个便捷方法,用于直接提取布尔值、数字和字符串。
aiBoolean()
从 UI 中提取一个布尔值。
- 类型
-
参数:
-
返回值:
- 返回一个 Promise。当 AI 返回结果时解析为布尔值。
-
示例:
aiNumber()
从 UI 中提取一个数字。
- 类型
-
参数:
prompt: string | object- 用自然语言描述的期望值,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:domIncluded?: boolean | 'visible-only'- 是否向模型发送精简后的 DOM 信息,一般用于提取 UI 中不可见的属性,比如图片的链接。如果设置为'visible-only',则只发送可见的元素。默认值为 false。screenshotIncluded?: boolean- 是否向模型发送截图。默认值为 true。context?: string- 本次调用的额外上下文。详见单次调用上下文。
-
返回值:
- 返回一个 Promise。当 AI 返回结果时解析为数字。
-
示例:
aiString()
从 UI 中提取一个字符串。
aiString() 与 aiAsk() 的查询和返回行为相同,但仍可分别通过 aiContexts.aiString 和 aiContexts.aiAsk 配置 Agent 级 context。
- 类型
-
参数:
prompt: string | object- 用自然语言描述的期望值,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:domIncluded?: boolean | 'visible-only'- 是否向模型发送精简后的 DOM 信息,一般用于提取 UI 中不可见的属性,比如图片的链接。如果设置为'visible-only',则只发送可见的元素。默认值为 false。screenshotIncluded?: boolean- 是否向模型发送截图。默认值为 true。context?: string- 本次调用的额外上下文。详见单次调用上下文。
-
返回值:
- 返回一个 Promise。当 AI 返回结果时解析为字符串。
-
示例:
aiLocate()
通过自然语言描述一个元素的定位。
- 类型
-
参数:
locate: string | object- 用自然语言描述的元素定位,或使用图片作为提示词。options?: object- 可选,一个配置对象,包含:
-
返回值:
- 返回一个 Promise。当元素定位成功时解析为元素定位信息。
rect在大多数定位链路里表示命中的目标元素边界。- 有些模型只支持按点定位,不支持按元素边界定位。在这种情况下,例如 AutoGLM,这里的
rect会退化成一个包含元素中心的8x8小方块,而不是真实的元素边界。 - 由于
rect的表现会明显受底层模型能力影响,不建议对这个字段建立过强的边界语义依赖。 - 如果你想获得更稳定的点击位置,推荐优先使用
center字段。 dpr是仅供 Web 使用的兼容字段,表示截图物理像素与 CSS 逻辑像素的比例。其他 Agent 类型不保证提供该字段。
-
示例:
aiAssert()
通过自然语言描述一个断言条件,让 AI 判断该条件是否为真。当条件不满足时,SDK 会抛出错误,并在错误信息中追加 AI 返回的详细原因。
- 类型
-
参数:
assertion: string | object- 用自然语言描述的断言条件,或使用图片作为提示词。errorMsg?: string- 当断言失败时附加的可选错误提示信息。options?: object- 可选,一个配置对象,包含:domIncluded?: boolean | 'visible-only'- 是否向模型发送精简后的 DOM 信息,一般用于提取 UI 中不可见的属性,比如图片的链接。如果设置为'visible-only',则只发送可见的元素。默认值为 false。screenshotIncluded?: boolean- 是否向模型发送截图。默认值为 true。context?: string- 本次调用的额外上下文。详见单次调用上下文。
-
返回值:
- 返回一个 Promise。当断言成功时解析为 void;若断言失败,则抛出一个错误,错误信息包含
errorMsg以及 AI 生成的原因。
- 返回一个 Promise。当断言成功时解析为 void;若断言失败,则抛出一个错误,错误信息包含
-
示例:
断言在测试脚本中非常重要。为了降低因 AI 幻觉导致错误断言的风险(例如遗漏错误),你也可以使用 .aiQuery 加上常规的 JavaScript 断言来替代 .aiAssert。
例如,你可以这样替代上面的断言代码:
观察与等待
startObserving()
startObserving() 会持续记录屏幕。它适合检查短暂出现的 UI,例如 toast、横幅和页面切换。
调用流程很简单:先开始录制,再执行页面操作,最后调用 stop()。stop() 返回 UIObservation。你可以查询或断言录制期间的画面。
UIObserver 负责录制:
observer.bufferedFrameCount: number- 录制过程中当前缓冲的帧数。observer.stop(): Promise<UIObservation>- 停止录制,并返回UIObservation。
UIObservation 保存已经录下的画面。调用 stop() 后,这些画面不再变化。
你可以调用 aiQuery()、aiBoolean()、aiNumber()、aiString()、aiAsk() 和 aiAssert()。这些方法只读取录制画面,不读取当前页面的 DOM。
因此,这些方法不支持 domIncluded。TypeScript 会检查这个错误。JavaScript 在运行时传入该参数,Midscene 也会抛出错误。
UIObservation 还包含 frameCount、startedAt 和 endedAt。使用完后,可以调用 observation.dispose() 清理临时图片。agent.destroy() 也会清理尚未释放的图片。
采样和资源占用:
- Midscene 会优先使用连续帧源。Android 使用 scrcpy(
scrcpyConfig.enabled),iOS 使用 WDA MJPEG(wdaMjpegFrameSource.enabled),Web 使用 CDP screencast。无法使用连续帧源时,Midscene 会定时截图。移动端此时的采样频率较低。 - data URL 形式的帧会在采样时写入文件。
UIObserver不会把所有图片长期保存在内存中。其他帧会在录制停止时分批解码并保存。查询或断言时,Midscene 才读取图片。 - 模型会接收最多
maxFrames帧,以及最后一张截图。增大intervalMs可以减少采样帧,减小maxFrames可以限制帧数。观察帧会显示在报告时间线中,并带有Observed标签。 - iOS 的观察帧来自 MJPEG 流,分辨率和质量较低。最后一张截图仍使用完整质量。
aiWaitFor()
等待某个条件达成。为控制 AI 服务成本,相邻两次检查的开始时间至少间隔 checkIntervalMs 毫秒。
- 类型
-
参数:
assertion: string- 用自然语言描述的断言条件options?: object- 可选的配置对象timeoutMs?: number- 超时时间(毫秒,默认为 15000)。每轮检查开始时都会记录时间,只要该时间点仍在超时窗口内,就会进入下一轮检查;否则视为超时checkIntervalMs?: number- 相邻两次检查开始时间的最小间隔(毫秒),默认值为 3000context?: string- 本次调用的额外上下文。详见单次调用上下文。
-
返回值:
- 返回一个 Promise。当断言成功时解析为 void;若超时,则抛出错误。
-
示例:
考虑到 AI 服务的时间消耗,.aiWaitFor 并不是一个特别高效的方法。使用一个普通的 sleep 可能是替代 waitFor 的另一种方式。
工作流执行与上下文
runYaml()
执行一个 YAML 格式的自动化脚本。脚本中的 tasks 部分会被解析和执行,并返回所有 .aiQuery 调用的结果。
- 类型
-
参数:
yamlScriptContent: string- YAML 格式的脚本内容
-
返回值:
- 返回一个包含
result属性的对象,其中包含所有aiQuery调用的结果
- 返回一个包含
-
示例:
更多关于 YAML 脚本的信息,请参考 Automate with Scripts in YAML。
runGherkinScenario()
运行一个 Gherkin Scenario,并把其中的步骤映射为 Midscene Agent 调用。
此 API 从 Midscene 1.10 开始支持,目前仍处于 Beta 阶段。未来 API 可能发生变化。
- 类型
-
参数:
scenarioText: string- 一个 Gherkin scenario,或者一组不带Scenario:头部的 Gherkin 步骤options?: object- 可选的运行选项context?: string- 应用于本次运行每个步骤的 AI 补充信息。对于每个映射后的 API 调用,它会覆盖 Agent 的 API 级 context 和aiContexts.defaultabortSignal?: AbortSignal- 用于中止本次运行的可选信号deepThink?: 'unset' | true | false- 传给Given和When步骤对应的aiActdeepLocate?: boolean- 传给Given和When步骤对应的aiAct
-
返回值:
Promise<void>- 所有步骤执行完成后 resolve。如果某个步骤失败,错误文案会包含 Gherkin 行号、原始步骤,以及当时正在执行的 Midscene 语义动作。
-
示例:
关于支持规则、限制、缓存行为和 YAML 用法,请参考 BDD 风格脚本(Gherkin)。
setAIContext()
设置 Agent 级共享回退 context,或某个 API 的 context。
- 类型
-
参数:
target:使用'default'表示所有 AI API 共享的缺省回退值,也可以传入'aiAct'、'aiTap'、'aiQuery'或'aiAssert'等 API 名称。context:提供给 AI 的补充信息,例如业务事实、规则、约束或输出要求。对 API target 传入''会屏蔽共享默认值;传入undefined会移除该 API 的覆盖值,并在已配置aiContexts.default时重新回退到该值。对defaulttarget 传入undefined会移除共享回退值。
-
示例:
setAIActContext()(已废弃)
已废弃的兼容性 setter,用于设置后续 agent.aiAct() 或 agent.ai() 调用发送给 AI 模型的背景知识。新代码请使用 agent.setAIContext('aiAct', context)。该方法仍与后者等价,并覆盖原有的 aiContexts.aiAct。
对于即时操作类型的 API,比如 aiTap(),这个设置不会生效。
- 类型
-
参数:
aiActContext: string- 要发送给 AI 模型的背景知识。
-
示例:
agent.setAIActContext() 和更早的 agent.setAIActionContext() 都仅为兼容而保留;新代码请使用 agent.setAIContext('aiAct', context)。
evaluateJavaScript()
仅 Web Agent 可用。
这个方法允许你在 web 页面上下文中执行一段 JavaScript 代码,并返回执行结果。
- 类型
-
参数 :
script: string- 要执行的 JavaScript 代码。
-
返回值:
- 返回执行结果。
-
示例:
freezePageContext()
冻结当前页面上下文,使后续所有的操作都复用同一个页面快照,避免多次重复获取页面状态。在执行大量并发操作时,它可以显著提升性能。
一些注意点:
- 通常情况下,你不需要使用这个方法,除非你确定“页面状态获取”是脚本性能瓶颈。
- 需要及时调用
agent.unfreezePageContext()来恢复实时页面状态。 - 不要在交互类操作中使用这个方法,它会让 AI 模型无法感知到页面的最新状态,产生令人困惑的错误。
- 类型
-
返回值:
Promise<void>
-
示例:
在报告中,使用冻结上下文的操作会在 Insight tab 中显示 🧊 图标。
unfreezePageContext()
解冻页面上下文,恢复使用实时的页面状态。
- 类型
-
返回值:
Promise<void>
报告、指标与生命周期
recordToReport()
默认在报告文件中记录当前截图并添加描述,也可以记录调用方传入的 截图。
- 类型
-
参数:
title?: string- 可选,截图的标题,如果未提供,则标题为 'untitled'。options?: RecordToReportOptions- 可选,一个配置对象,包含:content?: string- 截图的描述。screenshots?: Array<{ base64: string; description?: string }>- 在同一个报告条目下记录一张或多张传入的截图。设置该选项后,Midscene 不会再自动截图。base64推荐使用 PNG/JPEG data URI,例如data:image/png;base64,...;也可以传裸 base64 body,此时会按 PNG 处理。
-
兼容性:
screenshotBase64?: string仍然作为向后兼容的单截图覆盖参数被接受。新代码建议使用screenshots: [{ base64 }]。screenshots和screenshotBase64二者只能传入一个。 -
返回值:
Promise<void>
-
示例:
_unstableLogContent()
从报告文件中获取日志内容。日志内容的结构可能会在未来发生变化。
- 类型
-
返回值:
- 返回一个对象,包含日志内容。
-
示例:
大模型用量指标
Midscene 会记录每一次大模型调用的 token 用量。你可以在运行时从 agent 读取聚合后的总量,这对于配合 Langfuse 等工具做成本可观测性非常有用。
metrics
一个 getter,返回自 agent 创建以来累计的大模型用量快照。
- 类型
- 示例
onLLMUsage 选项
如需实时追踪,可在构造 agent 时传入 onLLMUsage 回调。每次大模型调用的用量一旦就绪即触发一次,回调参数为原始用量信息(token 数、模型名、意图、请求 id 等)。
destroy()
完成 Agent 报告的收尾(finalization),并释放 Agent 持有的资源。
- 类型
- 行为:
- 停止正在运行的 observer。
- 调用底层 interface 的可选
destroy()方法,并等待清理完成。 - 等待报告写入完成,再完成报告收尾。最后,将最终路径写入
.reportFile。如果没有生成报告,则写入undefined。 - 首次调用完成后,再次调用不会重复清理。
- 如果 interface 清理失败,Midscene 仍会尝试完成报告收尾,然后抛出清理错误。
调用该方法后,请勿继续使用这个 Agent。
Agent.destroy() 会停止 Agent、完成报告收尾,并释放 Midscene 持有的控制资源。
它通常不会关闭目标页面或断开物理设备,但部分平台会结束相应的自动化会话或连接。
具体行为请参见各平台的 destroy() 说明。
属性
.reportFile
当前报告文件的路径。它的类型是 string | null | undefined。
首次更新报告前,该属性没有可用值。以下情况也不会生成报告路径:关闭报告生成功能、Agent 在没有文件系统访问能力的浏览 器环境中运行,或 Agent 没有产生 execution。
报告路径可用后,报告内容仍可能继续更新。使用最终报告前,请调用
await agent.destroy()。该方法会等待报告写入完成,完成报告的
收尾,并将最终路径写入 .reportFile。
单次调用上下文
context 是提供给 AI 的补充信息,例如业务事实、判断或操作规则、约束以及输出要求。它用于补充 API 的主提示词,而不是替代主提示词。
使用 aiContexts.default 为所有 AI API 提供共享的缺省回退值,使用 aiContexts[apiName] 配置某个 API,再使用单次调用的 options.context 配置某一次请求。如果配置了 aiContexts.default,只有两个更具体的层级都没有提供值时才会选用它;它不会与其他层级自动合并。
最终用户 context 为 options.context ?? aiContexts[apiName] ?? aiContexts.default。这些层级互相覆盖,不会自动合并。'' 是一个已定义值,会清空低优先级用户 context;undefined 或未配置字段则继续使用下一个已配置的回退值。如需组合多个 context 片段,请像上例一样显式拼接字符串。
支持的 API key 包括 aiAct、aiTap、aiRightClick、aiDoubleClick、aiHover、aiInput、aiKeyboardPress、aiScroll、aiPinch、aiLongPress、aiClearInput、aiLocate、aiQuery、aiBoolean、aiNumber、aiString、aiAsk、aiAssert 和 aiWaitFor。ai 与已废弃的 aiAction 别名使用 aiAct context。
共享类型
定位选项:深度定位(deepLocate)
deepLocate 是一个可选参数,适用于所有需要元素定位的 API(aiAct、aiTap、aiHover、aiInput、aiKeyboardPress、aiScroll、aiDoubleClick、aiRightClick、aiLocate 等)。
开启后,Midscene 会调用 AI 模型两次以精确定位元素,从而提升准确性。这在目标元素面积较小、难以和周围元素区分时非常有用。对于新一代模型(如 Qwen3.x / Doubao 2.0 / Gemini 3.5),大多数场景下带来的收益不明显,建议按需开启。
- 默认值:
false
历史上,deepThink 这个名字在不同 API 中承担过两种含义:
- 在
aiAct()中,deepThink从一开始就表示规划模式,用于引导任务拆解和专注规划的思考过程。详情请参考deepThink规划模式。 - 在
aiTap、aiHover等单步操作方法中,旧的deepThink表示定位增强,等同于现在的deepLocate。
为了区分这两种语义,自 v1.5.1 起,deepThink 只用于表示规划模式,定位增强统一命名为 deepLocate。
- 对于
aiAct(),可以同时使用deepThink和deepLocate:deepThink控制规划模式,deepLocate控制本节描述的深度定位。 - 对于
aiTap、aiHover等单步操作方法,如果需要提 升定位精确度,推荐使用语义更清晰的deepLocate参数;旧的deepThink参数仍然兼容,语义等同于deepLocate。 :::
使用图片的提示词输入
你可以在提示词中使用图片作为补充,来描述无法通过自然语言表达的内容。
使用图片作为提示词时,提示词的参数格式如下:
- 示例一:使用图片描述点击位置
- 示例二:使用图片进行页面断言
- 示例三:使用图片引导操作(
aiAct)
图片尺寸的注意事项
请遵守模型提供商对图片体积和尺寸的限制。过大或过小的图片都可能被拒绝,准确限制请以模型提供商的文档为准。
报告工具
ReportMergingTool
每个自动化工作流都可以生成独立报告。ReportMergingTool 可以将这些报告合并,便于统一查看和管理。合并结果可能是独立的 HTML 文件,也可能是包含 index.html 和外部截图资源的目录。
new ReportMergingTool()
创建一个报告合并工具实例。
- 示例:
.append()
将自动化报告添加到待合并列表中。通常在每个自动化工作流结束后调用此方法。
- 类型
-
参数:
reportInfo: ReportFileWithAttributes- 报告信息对象,包含:reportFilePath: string | undefined- 报告文件的路径,通常是agent.reportFile。只有当reportAttributes.testStatus为'skipped'时,才能省略该字段。其他状态缺少路径时,append()会抛出错误reportAttributes: object- 报告属性testId: string- 自动化工作流的唯一标识符testTitle: string- 自动化工作流标题testDescription: string- 自动化工作流描述testDuration: number- 自动化工作流执行时长(毫秒)testStatus: 'passed' | 'failed' | 'timedOut' | 'skipped' | 'interrupted'- 自动化状态
-
返回值:
void
-
示例:
调用 .mergeReports() 前,应完成所有报告相关 Agent 的收尾。
.mergeReports()
执行报告合并操作,将所有添加的报告合并为一份报告。
- 类型
-
参数:
reportFileName?: 'AUTO' | string- 合并后的报告文件名- 默认为
'AUTO',自动生成文件名 - 可以指定自定义文件名(不需要
.html后缀)
- 默认为
opts?: object- 可选配置对象rmOriginalReports?: boolean- 是否删除原始报告文件,默认为falseoverwrite?: boolean- 如果目标文件已存在是否覆盖,默认为falseoutputDir?: string- 合并报告的输出目录。相对路径从当前工作目录开始解析。默认输出到midscene_run/report/
-
返回值:
- 成功时返回合并报告的入口 HTML 路径
- 如果没有添加任何报告,返回
null - 所有源报告均使用
single-html时,输出路径为<outputDir>/<reportFileName>.html - 任一源报告使用
html-and-external-assets时,输出路径为<outputDir>/<reportFileName>/index.html,同时输出截图资源
-
示例:
.clear()
清空待合并的报告列表。如果需要在同一个实例中进行多次合并操作,可以使用此方法清空之前的报告列表。
- 类型
-
返回值:
void
-
示例:
Web 浏览器(@midscene/web)
当你需要自定义 Midscene 的浏览器自动化 Agent,或查阅 Web 专属构造参数时,请参考本篇。关于通用参数(报告、Hook、缓存等),请阅读API 参考(通用)。
Web Action Space(动作空间)
PuppeteerAgent、PlaywrightAgent 和 Chrome Bridge 共用一套 Action Space,Midscene Agent 在规划任务时可以使用这些操作:
Tap—— 左键点击元素。RightClick—— 右键点击元素。DoubleClick—— 双击元素。Hover—— 悬停目标元素。Input—— 输入文本,支持replace/typeOnly/clear模式(append是typeOnly的已废弃别名)。KeyboardPress—— 按下指定键(可在按键前先聚焦目标)。Scroll—— 以元素为起点或从屏幕中央滚动,支持滚动到顶/底/左/右。DragAndDrop—— 从一个元素拖拽到另一个元素。LongPress—— 长按目标元素,可选自定义时长。Swipe—— 触摸式滑动(开启enableTouchEventsInActionSpace时可用)。Pinch—— 双指缩放手势,用于放大/缩小(开启enableTouchEventsInActionSpace时可用;Playwright 仅支持 Chromium 内核浏览器)。ClearInput—— 清空输入框内容。Navigate—— 在当前标签页打开指定 URL。Reload—— 刷新当前页面。GoBack—— 浏览器后退。
生命周期与所有权
Puppeteer 和 Playwright Page/Browser Agent 继承通用的
destroy() 方法。调用该方法会完成 Midscene 报告收尾,
并清理 Agent 持有的资源。该方法不会关闭 Agent 使用的 Page、Browser 或
BrowserContext。
PuppeteerPageAgent / PuppeteerAgent
当你需要在 Puppeteer 控制的浏览器里复用 Midscene 的 AI 操作能力时使用。
PuppeteerPageAgent 绑定单个 Puppeteer Page。PuppeteerAgent 仍作为兼容别名保留。
导入
构造器
浏览器特有选项
除了通用 Agent 参数,Puppeteer 还提供:
forceSameTabNavigation: boolean—— 限制始终在当前标签页内导航,默认true。waitForNavigationTimeout: number—— 当操作触发页面跳转时的最长等待时间,默认5000(设为0表示不等待)。waitForNetworkIdleTimeout: number—— 每次操作后等待网络空闲的时间,默认2000(设为0关闭)。enableTouchEventsInActionSpace: boolean—— 在动作空间里增加触摸手势(如滑动),用于需要触摸事件的页面,默认false。keyboardTypeDelay: number—— 按键间延迟,单位为毫秒。取值必须是有限的非负数。在'legacy'模式下,Puppeteer 的page.keyboard.type负责处理正数延迟。默认值为undefined。此时,Midscene 不传该选项,而是使用 Puppeteer 自身的默认值。通常无须配置。只有受控输入框在快速输入时丢字,才需要调大该值,例如80。inputStrategy: 'legacy' | 'sequential' | 'bulk'——Input动作的默认文本输入策略。使用'bulk'可以一次插入完整字符串。使用'sequential'可以强制逐个 Unicode 码点输入。'bulk'要求不设置keyboardTypeDelay或将其设为0。如需延迟输入,请使用'sequential'。默认值为'legacy'。forceChromeSelectRendering: boolean—— 强制select元素使用 Chrome 的 base-select 样式,避免系统原生样式导致截图/元素提取不可见;需要 Puppeteer >24.6.0。默认值为true;如需关闭(例如旧版 Chrome/Puppeteer)可设为false。customActions: DeviceAction[]—— 添加额外的自定义动作,让 Agent 可以调用你定义的领域特定动作。
使用说明
:::info
- 每个页面一个 Agent:默认 情况下(
forceSameTabNavigation: true)Midscene 会拦截新标签并在当前页打开,便于调试;若想保留浏览器原生的新标签行为可设为false,并自行给每个页面创建新的PuppeteerAgent。如果需要同一个 Agent 管理浏览器级别的页面切换,请使用PuppeteerBrowserAgent。 PuppeteerAgent/PuppeteerPageAgent为了兼容性仍保持 page-scoped 语义,不会暴露浏览器级别的页面切换能力;需要时请显式选择PuppeteerBrowserAgent。- 更多交互方法请参考 API 参考(通用)。
PuppeteerBrowserAgent
当一个 Midscene Agent 需要管理 Puppeteer 浏览器内的页面切换时,使用 PuppeteerBrowserAgent。它绑定 browser 实例,维护一个 active page,并且可以选择自动跟随新打开的页面。
- 构造函数:
new PuppeteerBrowserAgent(browser, page, options?)—— 你要显式指定初始 active page 时使用。 - 工厂方法:
PuppeteerBrowserAgent.create(browser, options?)—— 你希望 Midscene 自动选择或创建初始 active page 时使用。它会优先使用initialPage,否则复用浏览器里的第一个页面,或者创建一个新页面。 initialPage: Page—— 工厂方法使用的初始 Puppeteer 页面。autoFollowNewPage: boolean—— 浏览器打开新页面时是否自动切换 active page,默认false。newPageTimeout: number——waitForNewPage的超时时间,默认5000。activePage: Page—— Browser Agent 当前控制的页面。pages()—— 列出绑定 browser 中的页面。newPage()—— 创建新页面并将其设为 active page。setActivePage(page: Page)—— 显式指定 Browser Agent 接下来控制哪个 Puppeteer 页面。waitForNewPage(action?, options?)—— 等待新打开的页面,但不会隐式切换 active page。
另请参阅
- 集成到 Puppeteer 获取安装、Fixture 与远程 CDP 配置。
PlaywrightPageAgent / PlaywrightAgent
在 Playwright 浏览器中使用 Midscene 以支持带 AI 的测试或自动化流程。
PlaywrightPageAgent 绑定单个 Playwright Page。PlaywrightAgent 仍作为兼容别名保留。
导入
构造器
浏览器特有选项
forceSameTabNavigation: boolean—— 强制在当前标签页内执行,默认true。waitForNavigationTimeout: number—— 等待导航完成的时间,默认5000(设为0关闭)。waitForNetworkIdleTimeout: number—— 每次操作后等待网络空闲的时间,默认2000(设为0关闭)。enableTouchEventsInActionSpace: boolean—— 在动作空间里增加触摸手势(如滑动),用于需要触摸事件的页面,默认false。keyboardTypeDelay: number—— 按键间延迟,单位为毫秒。取值必须是有限的非负数。在'legacy'模式下,Playwright 的page.keyboard.type负责处理正数延迟。默认值为undefined。此时,Midscene 不传该选项,而是使用 Playwright 自身的默认值。通常无须配置。只有受控输入框在快速输入时丢字,才需要调大该值,例如80。inputStrategy: 'legacy' | 'sequential' | 'bulk'——Input动作的默认文本输入策略。使用'bulk'可以一次插入完整字符串。使用'sequential'可以强制逐个 Unicode 码点输入。'bulk'要求不设置keyboardTypeDelay或将其设为0。如需延迟输入,请使用'sequential'。默认值为'legacy'。forceChromeSelectRendering: boolean—— 强制select元素使用 Chrome 的 base-select 样式,避免系统原生样式导致截图/元素提取不可见;需要 Playwright ≥1.52.0。默认值为true;如需关闭(例如旧版 Chrome/Playwright)可设为false。customActions: DeviceAction[]—— 添加额外的自定义动作,让 Agent 可以调用你定义的领域特定动作。
使用说明
- 每个页面一个 Agent:默认
forceSameTabNavigation为true,Midscene 会拦截新标签确保稳定性;如需浏览器原生新标签行为请设为false,并自行给每个页面创建新的PlaywrightAgent。如果需要同一个 Agent 管理 browser context 级别的页面切换,请使用PlaywrightBrowserAgent。 PlaywrightAgent/PlaywrightPageAgent为了兼容性仍保持 page-scoped 语义,不会暴露浏览器级别的页面切换能力;需要时请显式选择PlaywrightBrowserAgent。- 更多交互方法请参考 API 参考(通用)。
PlaywrightBrowserAgent
当一个 Midscene Agent 需要管理 Playwright browser context 内的页面切换时,使用 PlaywrightBrowserAgent。它绑定 browser context,维护一个 active page,并且可以选择自动跟随新打开的页面。

