clickPercent天然适配不同分辨率找控件点击

455

主题

212

回帖

2759

积分

管理员

积分
2759
clickPercent天然适配不同分辨率找控件点击


QQ截图20261013124514.png


QQ截图20261013124504.png


  1. /**
  2. * 案例 8:clickPercent天然适配不同分辨率找控件点击
  3. *
  4. * 只教一件事:怎么用 auto.nodeSearch 在当前页面找到控件并点进去。
  5. * 控件查找比找图/OCR 都稳——不用做模板、不受分辨率影响、文字变了也不怕。
  6. *
  7. * 演示流程:打开快手 → 找弹窗上的 "不再提示" → 算中心坐标点掉 →
  8. * 再搜一次,节点消失即为点成功。
  9. *
  10. * 运行:真机/模拟器上直接跑(要开无障碍服务),不需要任何资源文件。
  11. * 改成自己的业务:只要把 CAND_WORDS 换成你要找的文字,APP_PKG 换成目标包名。
  12. */

  13. // ==================== 配置(改这里)====================
  14. var APP_PKG = "com.smile.gifmaker"; // 快手
  15. var CAND_WORDS = ["不再提示", "不再显示", "我知道了"]; // 候选词:命中哪个点哪个
  16. var SEARCH_TIMEOUT = 3000; // 节点搜索超时(ms)
  17. var WAIT_AFTER_OPEN = 3500; // 打开后等待弹窗出现的时长(ms)

  18. // ==================== 全局变量放顶部 ====================
  19. var gFoundWord = "";

  20. // ==================== 工具 ====================
  21. function doSleep(ms) { sleep.millisecond(ms); }

  22. // ==================== 核心:按候选词找控件 ====================
  23. // auto.nodeSearch(超时).textIncludes(词) 返回节点集合;
  24. // 集合为空时是 ''(不是 null),这是 AIWROK 的固定判断写法
  25. function findNodeByText(texts, timeout) {
  26. for (var i = 0; i < texts.length; i++) {
  27. var nodesObj = auto.nodeSearch(timeout).textIncludes(texts[i]);
  28. if (nodesObj != '') {
  29. var nodeObj = nodesObj.getNode(0);
  30. return { node: nodeObj, word: texts[i] };
  31. }
  32. }
  33. return null;
  34. }

  35. // ==================== 主流程 ====================
  36. function runMain() {
  37. printl("╔════════════════════════════════════════╗");
  38. printl("║ 案例8:找控件点击 nodeSearch ║");
  39. printl("╚════════════════════════════════════════╝");

  40. // ---- 1. 打开快手 ----
  41. app.openApp(APP_PKG);
  42. doSleep(WAIT_AFTER_OPEN); // 等冷启动 + 弹窗出现
  43. printl("[打开] 当前页面: " + app.getCurrentActivity());

  44. // ---- 2. 找弹窗上的控件 ----
  45. var found = findNodeByText(CAND_WORDS, SEARCH_TIMEOUT);
  46. if (found == null) {
  47. printl("[失败] 页面上没有候选词: " + CAND_WORDS.join("/"));
  48. try { toast.show("没找到" + CAND_WORDS[0] + ",可能没弹窗"); } catch (e) {}
  49. return; // 找不到就体面退出,绝不硬点
  50. }
  51. gFoundWord = found.word;
  52. printl("[找到] "" + gFoundWord + "" 文本=" + found.node.getText());

  53. // ---- 3. 算中心坐标并点击 ----
  54. // getCenterPoint() 带 XPercent()/YPercent(),是百分比坐标,
  55. // 配合 auto.clickPercent 天然适配不同分辨率
  56. var p = found.node.getCenterPoint();
  57. var xp = p.XPercent();
  58. var yp = p.YPercent();
  59. printl("[坐标] 中心 = (" + xp.toFixed(3) + ", " + yp.toFixed(3) + ")");
  60. auto.clickPercent(xp, yp);
  61. doSleep(1500);

  62. // ---- 4. 验证:再搜一次,节点消失 = 点掉了 ----
  63. // 弹窗类操作不能靠 Activity 跳转验证,看"目标还在不在"最直接
  64. var again = findNodeByText(CAND_WORDS, 1500);
  65. if (again == null) {
  66. printl("[验证] ✅ "" + gFoundWord + "" 已消失,点击成功");
  67. try { toast.show("✅ 弹窗已点掉"); } catch (e) {}
  68. } else {
  69. printl("[验证] ⚠ "" + again.word + "" 还在,可能没点中或弹窗刷新了");
  70. try { toast.show("已点击,但控件还在"); } catch (e) {}
  71. }

  72. printl("[结束]");
  73. }

  74. runMain();
复制代码

举报 回复