locate.js 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637
  1. /**
  2. * adb method: locate — 定位(image/text/coordinate),结果写入 outVars 或 variable
  3. */
  4. async function run(action, ctx) {
  5. const { device, folderPath, variableContext, api, extractVarName, resolveValue, logOutVars } = ctx
  6. const inVars = action.inVars || []
  7. const outVars = action.outVars || []
  8. const locateMethod = action.targetMethod || 'image'
  9. let position = null
  10. if (locateMethod === 'image') {
  11. let imagePath = inVars.length > 0 ? (variableContext[extractVarName(inVars[0])] || inVars[0]) : action.target
  12. if (!imagePath) return { success: false, error: 'locate 操作(image)缺少图片路径' }
  13. const fullPath = imagePath.startsWith('/') || imagePath.includes(':') ? imagePath : `${folderPath}/resources/${imagePath}`
  14. if (!api?.matchImageAndGetCoordinate) return { success: false, error: '图像匹配 API 不可用' }
  15. const matchResult = await api.matchImageAndGetCoordinate(device, fullPath)
  16. if (!matchResult.success) return { success: false, error: `图像匹配失败: ${matchResult.error != null ? matchResult.error : 'unknown'}` }
  17. position = matchResult.clickPosition
  18. } else if (locateMethod === 'text') {
  19. const targetText = inVars.length > 0 ? (variableContext[extractVarName(inVars[0])] || inVars[0]) : action.target
  20. if (!targetText) return { success: false, error: 'locate 操作(text)缺少文字内容' }
  21. if (!api?.findTextAndGetCoordinate) return { success: false, error: '文字识别 API 不可用' }
  22. const matchResult = await api.findTextAndGetCoordinate(device, targetText)
  23. if (!matchResult.success) return { success: false, error: `文字识别失败: ${matchResult.error != null ? matchResult.error : 'unknown'}` }
  24. position = matchResult.clickPosition
  25. } else if (locateMethod === 'coordinate') {
  26. const coord = inVars.length > 0 ? variableContext[extractVarName(inVars[0])] : resolveValue(action.target, variableContext)
  27. if (!coord) return { success: false, error: 'locate 操作(coordinate)缺少坐标' }
  28. position = Array.isArray(coord) ? { x: coord[0], y: coord[1] } : coord
  29. }
  30. if (outVars.length > 0) {
  31. variableContext[extractVarName(outVars[0])] = position
  32. await logOutVars(action, variableContext, folderPath)
  33. } else if (action.variable) variableContext[action.variable] = position
  34. return { success: true, result: position }
  35. }
  36. module.exports = { run }