/** * adb method: locate — 定位(image/text/coordinate),结果写入 outVars 或 variable */ async function run(action, ctx) { const { device, folderPath, variableContext, api, extractVarName, resolveValue, logOutVars } = ctx const inVars = action.inVars || [] const outVars = action.outVars || [] const locateMethod = action.targetMethod || 'image' let position = null if (locateMethod === 'image') { let imagePath = inVars.length > 0 ? (variableContext[extractVarName(inVars[0])] || inVars[0]) : action.target if (!imagePath) return { success: false, error: 'locate 操作(image)缺少图片路径' } const fullPath = imagePath.startsWith('/') || imagePath.includes(':') ? imagePath : `${folderPath}/resources/${imagePath}` if (!api?.matchImageAndGetCoordinate) return { success: false, error: '图像匹配 API 不可用' } const matchResult = await api.matchImageAndGetCoordinate(device, fullPath, folderPath) if (!matchResult.success) return { success: false, error: `图像匹配失败: ${matchResult.error != null ? matchResult.error : 'unknown'}` } position = matchResult.clickPosition } else if (locateMethod === 'text') { const targetText = inVars.length > 0 ? (variableContext[extractVarName(inVars[0])] || inVars[0]) : action.target if (!targetText) return { success: false, error: 'locate 操作(text)缺少文字内容' } if (!api?.findTextAndGetCoordinate) return { success: false, error: '文字识别 API 不可用' } const matchResult = await api.findTextAndGetCoordinate(device, targetText) if (!matchResult.success) return { success: false, error: `文字识别失败: ${matchResult.error != null ? matchResult.error : 'unknown'}` } position = matchResult.clickPosition } else if (locateMethod === 'coordinate') { const coord = inVars.length > 0 ? variableContext[extractVarName(inVars[0])] : resolveValue(action.target, variableContext) if (!coord) return { success: false, error: 'locate 操作(coordinate)缺少坐标' } position = Array.isArray(coord) ? { x: coord[0], y: coord[1] } : coord } if (outVars.length > 0) { variableContext[extractVarName(outVars[0])] = position await logOutVars(action, variableContext, folderPath) } else if (action.variable) variableContext[action.variable] = position return { success: true, result: position } } module.exports = { run }