diff --git a/src/tools/element.ts b/src/tools/element.ts index 89f4573..cd89275 100644 --- a/src/tools/element.ts +++ b/src/tools/element.ts @@ -596,7 +596,8 @@ function createGetAttributesTool(manager: WeappAutomatorManager): AnyTool { function createGetBoundingClientRectTool(manager: WeappAutomatorManager): AnyTool { return { name: "element_getBoundingClientRect", - description: "获取元素相对于视口的边界矩形信息(left、top、width、height、right、bottom)。此方法返回的是考虑 CSS transform 变换后的实际渲染尺寸和位置。支持跨组件查询:若需获取自定义组件内部元素,可将 selector 设为组件选择器,innerSelector 设为内部元素选择器。注意:目前仅支持 ID 选择器、类选择器。", + description: "获取元素相对于视口的边界矩形信息(left、top、width、height、right、bottom)。此方法返回的是考虑 CSS transform 变换后的实际渲染尺寸和位置。仅支持 ID 选择器、类选择器。" + + "若目标元素位于自定义组件内部,selector 必须指向「当前页面 wxml 源码中直接引用的那一层自定义组件,而非渲染后的组件树」,innerSelector 可在 selector 所指组件的整个子树内匹配。", parameters: getBoundingClientRectParameters, execute: async (rawArgs, context: ToolContext) => withUserErrorResult(async () => { diff --git a/src/tools/page.ts b/src/tools/page.ts index 49335e8..ac17b04 100644 --- a/src/tools/page.ts +++ b/src/tools/page.ts @@ -28,6 +28,8 @@ const callPageMethodParameters = connectionContainerSchema.extend({ args: z.array(z.unknown()).optional(), }); +const getRendererParameters = connectionContainerSchema; + const waitForElementParameters = connectionContainerSchema.extend({ selector: z.string().trim().min(1), timeout: z.coerce.number().int().positive().optional().default(5000), @@ -58,6 +60,7 @@ export function createPageTools(manager: WeappAutomatorManager): AnyTool[] { createGetPageDataTool(manager), createSetPageDataTool(manager), createCallPageMethodTool(manager), + createGetRendererTool(manager), ]; } @@ -368,3 +371,42 @@ function createCallPageMethodTool(manager: WeappAutomatorManager): AnyTool { }), }; } + +function createGetRendererTool(manager: WeappAutomatorManager): AnyTool { + return { + name: "page_getRenderer", + description: "获取当前页面运行时渲染引擎,返回 webview 或 skyline。", + parameters: getRendererParameters, + execute: async (rawArgs, context: ToolContext) => + withUserErrorResult(async () => { + const args = getRendererParameters.parse(rawArgs ?? {}); + return manager.withMiniProgram( + context.log, + { overrides: args.connection }, + async (miniProgram) => { + let skylineInfo; + try { + skylineInfo = await miniProgram.callWxMethod("getSkylineInfoSync"); + } catch (error) { + const message = error instanceof Error ? error.message : String(error); + throw new UserError(`调用 wx.getSkylineInfoSync() 失败: ${message}`); + } + + const isSupported = + typeof skylineInfo === "object" && + skylineInfo !== null && + "isSupported" in skylineInfo && + Boolean((skylineInfo as { isSupported?: unknown }).isSupported); + const renderer = isSupported ? "skyline" : "webview"; + + return toTextResult( + formatJson({ + renderer, + skylineInfo: toSerializableValue(skylineInfo), + }) + ); + } + ); + }), + }; +}