通用 Agent API
本文介绍各平台 Agent 继承的通用 API,涵盖配置选项、交互方法、数据提取、元素定位、断言与等待、持续观察、工作流执行、报告与用量,以及生命周期与运行时配置。
Agent 配置
各平台 Agent 均支持以下通用配置项(构造函数中的目标连接参数与平台特有选项由各平台 SDK 定义)。
设备端 CLI 同样支持在单次调用时传入可序列化的 Agent 参数(如 waitForActionReady 等函数类型参数仅支持通过 JavaScript / TypeScript SDK 传入)。将参数名从 camelCase 转换为不带平台前缀的 kebab-case 命令行标志即可,例如 waitAfterAction 对应 --wait-after-action。各平台 CLI 入口见 Skills。
模型配置
modelConfig?: Record<string, string | number>—— 当前 Agent 实例的模型配置。通过代码直接传入模型配置后,当前 Agent 将完全忽略系统环境变量中的模型配置,仅使用该对象中的键值。基础配置与各服务商示例见配置模型 API Key,高级参数见模型高级配置与调试,Default、Planning 和 Insight 模型的职责划分见模型选择指南。createOpenAIClient?: (openai, options) => Promise<OpenAI | undefined>—— 自定义 OpenAI 客户端包装函数,可用于接入 LangSmith、Langfuse 等可观测性工具或挂载自定义中间件。
自定义 OpenAI 客户端参数说明:
openai: OpenAI—— Midscene 创建的基础 OpenAI 客户端实例(已载入配置的 API Key、Base URL、代理等设置)。options: Record<string, unknown>—— OpenAI 初始化选项,包括:baseURL?: string:API 接入地址。apiKey?: string:API Key。dangerouslyAllowBrowser: boolean:在 Midscene 中固定为true。- 其他 OpenAI 客户端初始化选项。
- 返回值:返回包装后的 OpenAI 客户端实例,或返回
undefined以继续使用原始实例。
执行与等待
replanningCycleLimit?: number——aiAct的最大重规划次数。标准模型默认为20,UI-TARS 模型默认为40,AutoGLM 模型默认为100。推荐通过此 Agent 参数设置(环境变量MIDSCENE_REPLANNING_CYCLE_LIMIT仅保留作向后兼容)。waitForActionReady?: (context: ActionReadyContext) => Promise<void>—— 自定义每个动作执行后的就绪判断。waitAfterAction?: number—— 每次动作执行后的固定等待延迟(单位:毫秒),默认值为300。详见默认等待策略。useDeviceTime?: boolean—— 是否使用目标设备的本地时间记录任务时间戳。要求底层 Device 实现getDeviceLocalTimeString方法;若未实现,Midscene 会记录一条警告日志并回退为宿主机的系统时间。默认值:false。
每个动作执行后的就绪判断
配置 waitForActionReady 可自定义每次动作完成后何时允许进入下一步。该回调作用于每个原子动作(如 Input、Tap 等,包含 aiAct 拆解出的子步骤和缓存回放步骤),但不会在初始页面加载或只读查询时触发。
回调仅在动作执行成功后触发,SDK 会等待其返回的 Promise 完成后再继续执行。回调入参 context 包含:
action: { id, name, param }:每次执行都会生成新的id,且param已完成参数解析与元素定位;signal?: AbortSignal:可选的取消信号,用于在外部中止执行时清理回调内部的任务。
以下示例中,app.waitUntilReady 为业务自定义的就绪检查函数:
注意事项:
- 若回调耗时超过 5 秒,SDK 会打印一次警告日志并继续等待,不会强制超时或回退到默认等待策略。外部取消执行时,即使回调尚未结束,SDK 也会立即停止等待;请在回调内部监听
signal,及时停止自定义的轮询、网络请求或事件监听器。 - 若动作本身执行失败,不会触发该回调;若回调内部抛出错误,当前执行流程会直接终止,不会自动重放动作或回退到重新规划。
- 配置该回调后,它会接管并替代通用的动作后固定延迟(
waitAfterAction)及平台默认的动作后检查;但驱动层必需的底层时序(如键盘就绪等待、手势持续时长)和生命周期钩子仍会正常执行。如果某次动作无需等待,在异步回调中直接return即可。 - 该回调在动作完成后才开始执行,无法捕获动作触发瞬间闪过的单次事件;请基于当前应用状态或底层
page/deviceAPI 判断是否就绪。
所有平台的 Agent 均支持此配置(puppeteerAgentForTarget 可在第二个参数中传入,且仍会保留初始页面连接时的网络空闲等待)。
默认等待策略(高级配置)
未配置 waitForActionReady 时,默认按以下参数等待:
两项 Web 超时参数均可设为 0 以跳过检查;等待超时后仅会记录警告日志并继续后续步骤,不会抛出错误。
缓存
cache?: false | { id: string; strategy?: 'read-only' | 'read-write' | 'write-only'; cacheDir?: string }—— 缓存配置:false:禁用缓存。id:缓存唯一标识(启用缓存时必填)。strategy:缓存读写策略,默认值为'read-write'。cacheDir:自定义缓存目录路径。设置后,缓存文件会写入该目录而非默认的<MIDSCENE_RUN_DIR>/cache(相对路径基于当前工作目录解析,而非基于MIDSCENE_RUN_DIR),便于将缓存、日志和报告分别存放在不同目录。
cacheId?: string(已废弃)—— 仅保留作向后兼容,新代码请使用cache.id。
截图
screenshotShrinkFactor?: number—— 发送给 AI 模型前的截图缩放系数,用于缩小图像尺寸、降低 Token 消耗。默认值为1(保持原始尺寸);设为2时,截图宽高各缩减为原来的 1/2,像素面积缩减为 1/4。- 移动端设备:通常设为
2即可在保持识别清晰度的同时明显降低 Token 开销;不建议超过3,以免画面过度模糊影响模型定位。 - Web 页面:如果页面布局紧凑或包含大量微小文字,不宜设置过大的
screenshotShrinkFactor。Web 场景更推荐优先通过 Puppeteer 或 Playwright 的deviceScaleFactor从源头控制渲染与截图分辨率。
- 移动端设备:通常设为
screenshotShrinkFactor 与 deviceScaleFactor 的区别:
screenshotShrinkFactor是 Midscene 提供的后处理参数,用于在获取浏览器或设备截图后按比例缩小图片尺寸,从而减少 Token 消耗并加快模型响应;但过度压缩会导致画面模糊。deviceScaleFactor是 Puppeteer 和 Playwright 的浏览器视口参数,用于控制将 1 个 CSS 逻辑像素渲染为多少倍的物理像素,直接决定了截图生成时的原始像素尺寸。在有头(headed)模式下,若deviceScaleFactor与宿主机显示器的实际缩放比不一致,可能会导致浏览器画面闪烁。
二者是否需要同时配置?
- Web 场景:通常只需配置
deviceScaleFactor从源头控制截图尺寸即可。唯一例外是在本地有头调试时:如果你为了避免高分屏闪烁而将deviceScaleFactor设为了2或更高,但又不希望把超大分辨率的截图发给模型,可以同时配合screenshotShrinkFactor在发送前缩小图片。 - 移动端与桌面端等非 Web 场景:没有
deviceScaleFactor可用,直接通过screenshotShrinkFactor控制发送给模型的截图尺寸即可。
报告配置
generateReport?: boolean—— 是否生成执行报告文件。默认值:true。persistExecutionDump?: boolean—— 是否在生成报告的同时,在同目录下额外输出每次执行的原始 JSON dump 文件(要求generateReport为true)。默认值:false。reportFileName?: string—— 自定义报告输出名称(默认由 Midscene 自动生成)。其具体含义取决于outputFormat:- 当
outputFormat为'single-html'(默认)时:作为文件名,输出到midscene_run/report/<reportFileName>.html(若已包含.html后缀则不会重复追加)。 - 当
outputFormat为'html-and-external-assets'时:作为子目录名,输出到midscene_run/report/<reportFileName>/index.html及同级静态资源目录。
- 当
autoPrintReportMsg?: boolean—— 是否在终端打印报告文件路径提示。默认值:true。outputFormat?: 'single-html' | 'html-and-external-assets'—— 报告输出格式。默认值:'single-html':'single-html'(默认):将 Viewer、执行数据和 Base64 图片包含在一个 HTML 文件中,可直接打开,也可离线查看。'html-and-external-assets':生成index.html、report.json、data/下的执行 JSON 和screenshots/下的图片文件。相同图片内容共用一个文件,每次截图仍保留独立的 ID、时间和步骤关联。分享时需保留完整报告目录,并通过 HTTP 服务访问。本地预览时,可进入报告目录并启动静态文件服务:- 使用 Node.js:
npx serve - 使用 Python:
python3 -m http.server然后在浏览器中访问终端输出的地址(如http://localhost:3000)。
- 使用 Node.js:
回调
onTaskStartTip?: (tip: string) => void | Promise<void>—— 每个子任务开始执行前触发的可选钩子,入参tip为可读的任务摘要。默认值:undefined。onLLMUsage?: (usage: AIUsageInfo) => void—— 每次大模型调用完成后的用量回调,详见onLLMUsage。
AI 上下文
aiContexts?: { default?: string; [apiName]?: string }—— Agent 级别的 AI 补充上下文,默认值为undefined。优先级规则详见context与aiContexts的优先级。aiActContext?: string(已废弃)——aiContexts.aiAct的旧版兼容 字段。当两者同时存在时以aiContexts.aiAct为准;新代码请使用aiContexts.aiAct。关于如何编写高质量的应用上下文,请参阅为 GUI Agent 补充应用知识。aiActionContext?: string(已废弃)—— 更早期的兼容别名,仅在aiContexts.aiAct和aiActContext均未设置时生效(解析顺序为aiContexts.aiAct ?? aiActContext ?? aiActionContext,传入空字符串''同样会屏蔽低优先级字段)。新代码请使用aiContexts.aiAct。
提示词与调用选项
文本与图片提示词
当仅凭文字难以准确描述目标时,可以在提示词中附带参考图片。
带图片的提示词对象格式如下:
- 示例一:结合参考图片定位点击目标
- 示例二:结合参考图片断言页面内容
- 示例三:结合参考图片引导自动规划(
aiAct)
图片尺寸限制
请确保传入的图片符合对应模型服务商对图片体积与分辨率的限制(过大或过小的图片均可能被接口拒绝,具体限制请参考模型服务商文档)。
context 与 aiContexts 的优先级
上下文(context)是提供给 AI 模型的背景信息(如业务名词、判断规则、交互约束或输出格式要求),用于补充而非替代 API 的主提示词。
你可以通过三个层级配置上下文:
aiContexts.default:所有 AI 方法共享的全局回退上下文;aiContexts[apiName]:特定 AI 方法的专属上下文;options.context:单次 API 调用传入的上下文。
这三个层级按 options.context ?? aiContexts[apiName] ?? aiContexts.default 的优先级依次覆盖,不会自动合并。只有当更高优先级的层级未设置(undefined)时,才会回退到下一层级;显式传入空字符串 '' 会直接清空上下文并阻断向低优先级回退。如需同时保留多段上下文,请像下方示例一样手动拼接字符串:
aiContexts 支持配置的键名包括:aiAct、aiTap、aiRightClick、aiMiddleClick、aiDoubleClick、aiHover、aiInput、aiKeyboardPress、aiScroll、aiPinch、aiLongPress、aiClearInput、aiLocate、aiQuery、aiBoolean、aiNumber、aiString、aiAsk、aiAssert 和 aiWaitFor(其中 ai 及已废弃的 aiAction 别名共用 aiAct 的上下文)。
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 仅用于表示 aiAct() 的规划模式,定位增强统一命名为 deepLocate:
- 在
aiAct()中,可同时传入deepThink(控制规划模式)和deepLocate(控制本节所述的深度定位)。 - 在
aiTap、aiHover等单步操作方法中,请使用语义更明确的deepLocate(旧参数名deepThink仍保留向后兼容,效果与deepLocate等同)。
自动规划
agent.aiAct()(及其简写别名 agent.ai())会根据自然语言指令自动规划并执行一连串操作;而下文的即时交互方法(如 aiTap、aiInput)则在定位到目标元素后直接执行单步指定动作。
aiAct() 或 ai()
通过自然语言描述 UI 操作目标及可选的断言条件。执行期间,Midscene 会根据最新的界面状态持续进行 AI 规划并执行动作,直到达成目标;如果提示词中包含的断言未通过,aiAct 会立即中止并抛出错误。
该方法在早期版本中名为 aiAction(),当前版本仍保留兼容;为保持代码风格统一,新代码推荐使用 aiAct()。
- 类型
-
参数:
prompt: string | object—— 用自然语言描述的操作目标与可选断言条件,或带参考图片的提示词。options?: object—— 可选配置对象:cacheable?: boolean—— 启用缓存功能时,是否允许缓存本次调用结果。默认值:true。deepThink?: 'unset' | true | false—— 控制aiAct的规划模式实现,详见deepThink规划模式。deepLocate?: boolean—— 是否开启深度定位。默认值:false。context?: string—— 本次调用的补充上下文,详见context与aiContexts的优先级。fileChooserAccept?: string | string[]—— 当页面弹出文件选择器时自动填入的文件路径(支持单个路径字符串或路径数组)。仅在 Web 页面(Playwright、Puppeteer 或 Chrome Bridge)中可用,且不受fileChooserAllowedDir限制。- 注意:若目标文件输入框不支持多文件上传(不含
multiple属性),但传入了多个文件路径,会直接抛出错误。 - 注意:若操作触发了文件选择器但未传入
fileChooserAccept,文件选择器会被忽略,后续页面操作仍可正常继续。 - 注意:在 Chrome Bridge 模式下上传本地文件,需先在
chrome://extensions中进入 Midscene 插件详情页,开启允许访 问文件网址(Allow access to file URLs),再切回目标http(s)://页面重新连接。 - 注意:Chrome Bridge 模式不支持文件夹上传输入框(
webkitdirectory/directory);如需上传文件夹,请使用 Playwright。
- 注意:若目标文件输入框不支持多文件上传(不含
fileChooserAllowedDir?: string—— 显式授权当前aiAct调用在通过提示词触发文件上传时允许访问的本地目录(未配置此项时,由模型在规划阶段生成的文件上传动作会被拒绝)。提示词中的相对路径会基于该目录解析,并校验解析后的真实路径(包含软链接)是否仍位于该目录内;绝对路径同样会校验是否处于该目录下。建议将其设为测试用例的fixtures目录,以防范因 AI 幻觉或页面提示词注入攻击而误传敏感文件。abortSignal?: AbortSignal—— 用于中止aiAct执行的AbortSignal。信号触发后,Midscene 会立即停止规划循环并抛出错误,适用于自定义超时控制或主动取消任务。
-
返回值:
- 返回规划执行完成后生成的总结文本;若规划未产生文本输出,则返回
undefined。执行失败时抛出错误。
- 返回规划执行完成后生成的总结文本;若规划未产生文本输出,则返回
-
示例:
deepThink 规划模式
deepThink 用于控制 aiAct 的内部规划策略:
- 默认情况下(
false或'unset'),aiAct会在单次模型调用中同时完成下一步动作规划与目标元素定位。 - 设为
true后,aiAct会侧重于任务拆解,并将「任务规划」与「元素定位」拆分为独立的模型调用。这有助于提升复杂长链路任务的稳定性,但会相应增加模型调用次数与整体耗时。
注意:deepThink 仅控制 Midscene 自身的规划策略,不控制大模型底层的原生推理(Thinking / Reasoning)开关;模型原生推理配置请参阅模型原生思考。
在 aiAct 提示词中上传文件
如需在 aiAct 的自然语言提示词中直接指定要上传的文件,必须同时传入 fileChooserAllowedDir(推荐设为测试工程的 fixtures 目录)。Midscene 会在触发文件选择器前自动解析提示词中的路径,并校验该路径是否位于授权目录内:
如果单次 aiAct 需要分步上传多个文件,请在提示词中将每个相对路径与其对应的点击上传动作明确写在一起(后一次上传配置会覆盖前一次的文件选择器路径)。切勿将提示词中的文件路径与 options.fileChooserAccept 混用,因为模型在规划过程中动态生成的文件选择器配置可能会覆盖 options.fileChooserAccept。
该能力仅支持 Web 页面(Playwright、Puppeteer 和 Chrome Bridge)。在 Chrome Bridge 模式下上传本地文件时,请确保已在 chrome://extensions 的 Midscene 插件详情页中开启允许访问文件网址(Allow access to file URLs)。
即时交互
aiTap()
点击指定元素。
- 类型
-
参数:
locate: string | object—— 目标元素的自然语言描述,或带参考图片的提示词。options?: object—— 可选配置对象:deepLocate?: boolean—— 是否开启深度定位(旧参数名deepThink仍保留兼容)。默认值:false。context?: string—— 本次调用的补充上下文,详见context与aiContexts的优先级。xpath?: string—— 目标元素的 XPath。传入后,Midscene 会优先按该 XPath 查找元素,未命中时再依次尝试缓存与 AI 模型。默认值:undefined。cacheable?: boolean—— 启用缓存功能时,是否允许缓存本次调用结果。默认值:true。fileChooserAccept?: string | string[]—— 当点击触发文件选择器时自动填入的文件路径(支持单个路径字符串或路径数组)。仅在 Web 页面(Playwright、Puppeteer 或 Chrome Bridge)中可用。- 注意:若目标文件输入框不支持多文件上传(不含
multiple属性),但传入 了多个文件路径,会直接抛出错误。 - 注意:若点击触发了文件选择器但未传入
fileChooserAccept,文件选择器会被忽略,后续页面操作仍可正常继续。 - 注意:Chrome Bridge 模式不支持文件夹上传输入框(
webkitdirectory/directory);如需上传文件夹,请使用 Playwright。
- 注意:若目标文件输入框不支持多文件上传(不含
-
返回值:
Promise<void>
-
示例:
aiDoubleClick()
双击指定元素。
- 类型
-
参数:
locate: string | object—— 目标元素的自然语言描述,或带参考图片的提示词。options?: object—— 可选配置对象:deepLocate?: boolean—— 是否开启深度定位(旧参数名deepThink仍保留兼容)。默认值:false。context?: string—— 本次调用的补充上下文,详见context与aiContexts的优先级。xpath?: string—— 目标元素的 XPath。传入后,Midscene 会优先按该 XPath 查找元素,未命中时再依次尝试缓存与 AI 模型。默认值:undefined。cacheable?: boolean—— 启用缓存功能时,是否允许缓存本次调用结果。默认值:true。
-
返回值:
Promise<void>
-
示例:
aiMiddleClick()
仅支持 Web 页面和桌面端(
@midscene/computer),不支持移动设备(Android、iOS 或 HarmonyOS)。
使用鼠标中键点击指定元素。具体行为由应用决定。
- 类型
-
参数:
locate: string | object—— 目标元素的自然语言描述,或带参考图片的提示词。options?: object—— 可选配置对象:deepLocate?: boolean—— 是否开启深度定位(旧参数名deepThink仍保留兼容)。默认值:false。context?: string—— 本次调用的补充上下文,详见context与aiContexts的优先级。xpath?: string—— 目标元素的 XPath。传入后,Midscene 会优先按该 XPath 查找元素,未命中时再依次尝试缓存与 AI 模型。默认值:undefined。cacheable?: boolean—— 启用缓存功能时,是否允许缓存本次调用结果。默认值:true。
-
返回值:
Promise<void>
-
示例:
aiRightClick()
仅支持 Web 页面和桌面端(
@midscene/computer),不支持移动设备(Android、iOS 或 HarmonyOS)。
右键点击指定元素。注意:右键点击后,Midscene 无法与浏览器原生的系统级右键菜单交互;该方法适用于页面自身监听了 contextmenu 事件并渲染自定义右键菜单的元素。
- 类型
-
参数:
locate: string | object—— 目标元素的自然语言描述,或带参考图片的提示词。options?: object—— 可选配置对象:deepLocate?: boolean—— 是否开启深度定位(旧参数名deepThink仍保留兼容)。默认值:false。context?: string—— 本次调用的补充上下文,详见context与aiContexts的优先级。xpath?: string—— 目标元素的 XPath。传入后,Midscene 会优先按该 XPath 查找元素,未命中时再依次尝试缓存与 AI 模型。默认值:undefined。cacheable?: boolean—— 启用缓存功能时,是否允许缓存本次调用结果。默认值:true。
-
返回值:
Promise<void>
-
示例:
aiHover()
仅支持 Web 页面和桌面端(
@midscene/computer),不支持移动设备(Android、iOS 或 HarmonyOS)。
将鼠标指针悬停在指定元素上。
- 类型
-
参数:
locate: string | object—— 目标元素的自然语言描述,或带参考图片的提示词。options?: object—— 可选配置对象:deepLocate?: boolean—— 是否开启深度定位(旧参数名deepThink仍保留兼容)。默认值:false。context?: string—— 本次调用的补充上下文,详见context与aiContexts的优先级。xpath?: string—— 目标元素的 XPath。传入后,Midscene 会优先按该 XPath 查找元素,未命中时再依次尝试缓存与 AI 模型。默认值:undefined。cacheable?: boolean—— 启用缓存功能时,是否允许缓存本次调用结果。默认值:true。
-
返回值:
Promise<void>
-
示例:
aiLongPress()
长按(按住不放)指定元素,常用于呼出上下文菜单、进入多选模式或触发其他长按手势。
- 类型
-
参数:
locate: string | object—— 目标元素的自然语言描述,或带参考图片的提示词。opt?: object—— 可选配置对象:duration?: number—— 按住持续时长(单位:毫秒)。Android 默认2000,iOS 默认1000,Web 默认500;HarmonyOS 固定使用系统长按时长并忽略此参数。deepLocate?: boolean—— 是否开启深度定位。默认值:false。context?: string—— 本次调用的补充上下文,详见context与aiContexts的优先级。xpath?: string—— 目标元素的 XPath。默认值:undefined。cacheable?: boolean—— 启用缓存功能时,是否允许缓存本次调用结果。默认值:true。
-
返回值:
Promise<void>
-
示例:
- 支持 Android、iOS、HarmonyOS 和 Web(基于 Chromium 的浏览器,通过触摸事件实现)。在 HarmonyOS 上,由于底层
uitestAPI 不支持自定义按压时长,duration参数会被忽略。
aiInput()
向指定输入框输入文本。
- 类型
-
参数:
推荐用法:
locate: string | object—— 目标输入框的自然语言描述,或带参考图片的提示词。opt: object—— 配置对象:value: string | number—— 必填。要输入的文本内 容:- 当
mode为'replace'(默认)时:先清空输入框中的原有内容,再输入value。 - 当
mode为'typeOnly'时:不清空原有内容,直接追加输入value。 - 当
mode为'clear'时:忽略value,仅清空输入框。
- 当
deepLocate?: boolean—— 是否开启深度定位(旧参数名deepThink仍保留兼容)。默认值:false。context?: string—— 本次调用的补充上下文,详见context与aiContexts的优先级。xpath?: string—— 目标元素的 XPath。传入后,Midscene 会优先按该 XPath 查找元素,未命中时再依次尝试缓存与 AI 模型。默认值:undefined。cacheable?: boolean—— 启用缓存功能时,是否允许缓存本次调用结果。默认值:true。autoDismissKeyboard?: boolean—— 输入完成后是否自动收起软键盘(仅在 Android、iOS、HarmonyOS 上生效)。默认值:true。keyboardTypeDelay?: number—— 按键之间的延迟(单位:毫秒,须为有限非负数)。在'legacy'模式下是否生效取决于各平台既有的输入路径(见下表);支持延迟的'legacy'路径在延迟大于0时会逐个 Unicode 码点发送字符,适用于输入框因输入过快而丢字的场景。inputStrategy?: 'legacy' | 'sequential' | 'bulk'—— 文本发送策略。默认值:'legacy':'legacy'(默认):沿用各平台的历史默认输入行为,确保升级版本后不改变既有测试的表现。'sequential':始终逐个 Unicode 码点发送字符(即使未设置keyboardTypeDelay或设为0)。'bulk':在平台支持的情况下,通过单次底层输入调用发送完整字符串。在 Web 上,'replace'模式会先全选旧内容再调用insertText,从而只触发一次插入input事件(而非先触发清空事件再逐字触发input事件);其他平台则由 Midscene 向底层驱动发起一次调用(操作系统或驱动内部仍可能向应用派发多个事件)。- 使用
'bulk'时,不能设置keyboardTypeDelay(或须将其设为0),若传入正数会直接抛出错误(任何策略下传入负数或非有限数值均会报错)。动作级参数优先于 Device 或 Agent 级默认配置,因此当全局配置了正数延迟时,可在单次aiInput中传入keyboardTypeDelay: 0来配合'bulk'使用。
mode?: 'replace' | 'clear' | 'typeOnly'—— 输入模式。默认值:'replace':'replace':先清空输入框,再输入新文本。'typeOnly':不清空输入框,直接输入文本。'clear':仅清空输入框,不输入新文本。
各平台在默认
inputStrategy: 'legacy'下的具体行为如下:旧版兼容用法(已废弃,仍保留支持):
value: string | number—— 要输入的文本内容。locate: string | object—— 目标元素的自然语言描述,或带参考图片的提示词。options?: object—— 可选配置对象,类型与推荐用法中的opt相同。
-
返回值:
Promise<void>
-
示例:
推荐使用将定位描述放在第一个参数的新签名 aiInput(locate, opt)。旧版签名 aiInput(value, locate, options) 仍保留向后兼容,但新代码请统一使用新签名。
aiClearInput()
清空指定输入框的内容。适合将「清空」作为独立步骤执行(例如测试输入框清空后的校验提示,或需要将清空与重新输入拆分为两个独立步骤)。
- 类型
-
参数:
locate: string | object—— 目标输入框的自然语言描述,或带参考图片的提示词。opt?: object—— 可选配置对象:deepLocate?: boolean—— 是否开启深度定位。默认值:false。context?: string—— 本次调用的补充上下文,详见context与aiContexts的优先级。xpath?: string—— 目标元素的 XPath。默认值:undefined。cacheable?: boolean—— 启用缓存功能时,是否允许缓存本次调用结果。默认值:true。
-
返回值:
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)支持以'+'连接的修饰键组合(如'Control+A'、'Shift+Enter'),候选键名见共享按键名称定义(具体支持情况因平台而异)。内置的 Android、iOS 和 HarmonyOS 设备仅支持单键(其中 HarmonyOS 支持常见控制键以及A–Z、0–9,不支持'?'等没有独立键码的字符);传入不支持的键名或在移动端传入组合键会直接抛出错误。deepLocate?: boolean—— 是否开启深度定位(旧参数名deepThink仍保留兼容)。默认值:false。context?: string—— 本次调用的补充上下文,详见context与aiContexts的优先级。xpath?: string—— 目标元素的 XPath。传入后,Midscene 会优先按该 XPath 查找元素,未命中时再依次尝试缓存与 AI 模型。默认值:undefined。cacheable?: boolean—— 启用缓存功能时,是否允许缓存本次调用结果。默认值:true。
旧版兼容用法(已废弃,仍保留支持):
key: string—— 要按下的键名(如'Enter'、'Tab'、'Escape')。locate?: string | object—— 可选的目标元素自然语言描 述,或带参考图片的提示词。options?: object—— 可选配置对象,类型与推荐用法中的opt相同。
-
返回值:
Promise<void>
-
示例:
推荐使用将可选定位描述放在第一个参数的新签名 aiKeyboardPress(locate, opt)。当按键直接作用于当前焦点时,第一个参数传 undefined 即可(此时虽不会向模型发起定位请求,但在执行动作前仍会校验模型配置是否有效)。旧版签名 aiKeyboardPress(key, locate, options) 仍保留向后兼容,但新代码请统一使用新签名。
aiScroll()
滚动页面或某个元素。
- 类型
-
参数:
推荐用法:
locate: string | object | undefined- 用自然语言描述的元素定位,或使用图片作为提示词。未传入时,移动端使用下文的默认手势;Web 和电脑端在当前鼠标位置滚动。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>
-
示例:
移动端滚动
Android、iOS 和鸿蒙的默认手势一致:从屏幕中间经过,滑动范围为屏幕中央 70%,耗时约 1 秒。
默认滚动希望保留上一屏的部分内容,减少浏览时的遗漏。手指移动距离不等于内容滚动距离:松手后,列表可能继续滑动;分页控件可能自动翻页。
请将 distance 设置在屏幕可用范围内,距离过大可能导致手势执行失败。
在弹窗或局部列表中滚动时,建议同时指定 locate 和合适的 distance。例如:
需要快速划动或指定起终点时,使用 Swipe。Swipe 按指定坐标或方向执行手势,可设置 duration;Scroll 用于浏览内容。
我们最近更新了 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。
数据提取
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 返回结果时解析为字符串。
-
示例:

