AutoJS控件操作与自动化脚本开发指南

发布时间:2026/7/16 10:27:52

AutoJS控件操作与自动化脚本开发指南 1. AutoJS控件操作基础概念AutoJS作为Android平台上的JavaScript自动化工具其核心能力在于对UI控件的识别与操作。控件View是Android应用界面构成的基本单元每个按钮、文本框、列表项都是独立的控件实例。理解控件操作前需要先明确几个关键概念控件树View Hierarchy是Android界面元素的组织结构采用树形方式描述父子包含关系。通过dumpWindowHierarchy()方法可以获取当前界面的完整控件树XML这是调试控件定位的重要依据。典型控件属性包括id: 资源标识符如com.example:id/login_buttontext: 显示文本内容className: 控件类名如android.widget.Buttondesc: 内容描述常用于无障碍访问bounds: 控件在屏幕中的坐标范围控件查找遵循选择器→过滤→操作的三段式流程。选择器确定目标特征如id(btn_confirm)过滤方法如findOne()执行实际查找最后调用操作方法如click()。这种链式调用是AutoJS脚本的典型模式。提示实际开发中建议先使用AutoJS内置的布局分析功能可视化查看控件属性再编写精确的选择器表达式。2. 核心控件定位方法详解2.1 基础定位选择器id()选择器是最精确的定位方式但需要目标应用为控件设置了资源ID。典型用法// 等待最多3秒查找ID为btn_submit的按钮 let submitBtn id(btn_submit).findOne(3000); if(submitBtn) { submitBtn.click(); } else { console.error(提交按钮未找到); }text()选择器适用于带有可见文本的控件支持正则表达式// 匹配包含登录文本的控件 text(/登录/).findOne().click(); // 精确匹配文本注意空格和大小写 text(确 定).findOne().click();className()通常需要结合其他条件使用因为同类控件可能大量存在// 查找第一个EditText并输入内容 className(android.widget.EditText).findOne().setText(AutoJS);desc()常用于没有文本但有无障碍描述的控件// 通过描述定位图片按钮 desc(返回按钮).findOne().click();2.2 复合条件定位通过untilFind()实现阻塞式查找默认超时10秒// 持续查找直到控件出现 let closeBtn desc(关闭).untilFind(); closeBtn.click();组合多个条件提高定位精度// 同时满足类名和文本条件 className(android.widget.Button).text(确定).findOne().click();使用child()和parent()处理层级关系// 在指定父控件下查找子元素 id(item_container).findOne() .child(className(android.widget.CheckBox)) .click();3. 控件交互操作实战3.1 基础交互方法click()是最常用的操作方法但需要注意控件必须可见且可点击某些应用需要添加点击延迟sleep(300)对于动态加载的列表项建议使用clickable(true)过滤// 安全点击示例 function safeClick(selector) { let target selector.findOne(5000); if (!target) return false; if (!target.clickable()) { console.warn(控件不可点击); return false; } target.click(); return true; }longClick()长按操作需要控制持续时间默认500ms// 长按1.5秒 desc(更多选项).findOne().longClick(1500);setText()输入文本时的注意事项先clear()清除原有内容输入法可能遮挡控件某些应用需要触发input事件let input className(EditText).findOne(); input.clear(); // 清空原有文本 input.setText(新内容); // 模拟回车键确认 input.press(Enter);3.2 高级手势操作swipe()滑动操作需要精确坐标控制// 从(x1,y1)滑动到(x2,y2)持续1秒 swipe(device.width/2, device.height*0.8, device.width/2, device.height*0.2, 1000);gesture()支持复杂手势序列// 绘制字母Z手势 gesture(1000, [0, 300], [500, 300], // 横线 [500, 300], [0, 600], // 斜线 [0, 600], [500, 600] // 横线 );滚动操作的特殊处理// 向下滚动列表适配不同机型 className(ListView).findOne().scrollForward(); // 或使用坐标滑动 swipe(device.width/2, device.height*0.7, device.width/2, device.height*0.3, 800);4. 实战案例与调试技巧4.1 自动化登录案例// 等待应用启动 auto.waitFor(); // 进入登录界面 text(我的).findOne().click(); text(登录/注册).findOne().click(); // 填写表单 let inputs className(EditText).find(); inputs[0].setText(username); inputs[1].setText(password); // 处理验证码 let captcha descContains(验证码).findOne(); if (captcha) { let code ocr.recognize(captcha.bounds()); className(EditText).find()[2].setText(code); } // 提交登录 textMatches(/登\s*录/).findOne().click(); // 验证结果 if (text(登录成功).findOne(5000)) { console.log(登录成功); } else { console.error(登录失败); }4.2 控件操作常见问题排查问题1控件无法找到检查是否启用无障碍服务确认界面完全加载添加sleep(2000)使用dumpWindowHierarchy()分析实际控件结构尝试更宽松的选择器如textContains()问题2点击无效检查控件clickable属性尝试坐标点击click(centerX, centerY)关闭输入法setClip()有时能触发隐藏键盘问题3动态内容定位// 处理动态列表项 function findDynamicItem(keyword) { for (let i 0; i 5; i) { let item textContains(keyword).findOne(1000); if (item) return item; className(RecyclerView).findOne().scrollForward(); } return null; }4.3 性能优化建议减少findOne()的频繁调用改用findOnce()对稳定控件使用cachetrue参数let cachedBtn id(btn_confirm).findOne({cache: true});批量操作时禁用自动等待auto.setFastMode(true); // 执行批量操作 auto.setFastMode(false);使用selector.offsetParent()缩小查找范围5. 进阶技巧与扩展应用5.1 图像辅助定位当控件无法通过属性定位时可以结合图像识别// 通过图标截图定位 let icon images.read(/sdcard/icon.png); let pos findImage(captureScreen(), icon); if (pos) { click(pos.x 10, pos.y 10); // 点击图标中心偏移位置 }5.2 多条件过滤策略// 复杂条件过滤 let target className(android.widget.Button) .filter(b { return b.clickable() b.visibleToUser() b.bounds().width() 100; }) .findOne();5.3 跨应用自动化通过shell命令启动其他应用// 打开微信 shell(am start -n com.tencent.mm/.ui.LauncherUI, true); // 返回AutoJS执行后续操作 shell(am start -n org.autojs.autojs/.external.open.RunIntentActivity, true);5.4 定时任务管理实现定时检查控件状态setInterval(() { if (text(升级提示).findOnce()) { id(btn_close).findOne().click(); } }, 60 * 1000); // 每分钟检查一次在实际项目中我习惯将常用控件操作封装成工具函数。例如处理弹窗的通用方法function handlePopups() { let closeBtns [ () desc(关闭).findOnce(), () id(iv_close).findOnce(), () textMatches(/^确定|取消$/).findOnce() ]; for (let getBtn of closeBtns) { let btn getBtn(); if (btn btn.clickable()) { btn.click(); return true; } } return false; }对于需要持续运行的重要脚本建议添加异常恢复机制let retries 3; while (retries-- 0) { try { mainFlow(); break; } catch (e) { console.error(运行失败:, e); if (retries 0) throw e; restartApp(); sleep(3000); } }

相关新闻