|
|
苹果iOS脚本Detect类系统性使用示例
- /*
- 苹果iOS Detect类系统性使用示例
- 欢迎使用AiWork苹果自动化IDE
- 帮助文档: https://www.yuque.com/aiwork/
- 官方地址: www.aiwork24.com
-
- 🍎交流QQ群:711841924(群一 - 苹果内测群)
- 🍎交流QQ群:528816639
-
- 本示例提供了Detect类的完整使用方法,针对iOS平台进行了优化
- 包含系统化的错误处理和实用的自动化案例
- */
- /**
- * Detect类方法概览
- *
- * 1. score() - 获取检测分数(置信度)
- * 2. getRect() - 获取检测区域坐标
- * 3. click() - 点击目标中心点
- * 4. clickRandom() - 在目标区域内随机点击
- * 5. x, y, width, height - 属性:目标的位置和尺寸
- * 6. text - 属性:识别到的文本内容
- */
- /**
- * 工具函数:获取当前时间戳
- * @returns {string} 格式化的时间戳
- */
- function getTimestamp() {
- var date = new Date();
- var year = date.getFullYear();
- var month = (date.getMonth() + 1).toString().padStart(2, '0');
- var day = date.getDate().toString().padStart(2, '0');
- var hours = date.getHours().toString().padStart(2, '0');
- var minutes = date.getMinutes().toString().padStart(2, '0');
- var seconds = date.getSeconds().toString().padStart(2, '0');
- return year + '-' + month + '-' + day + ' ' + hours + ':' + minutes + ':' + seconds;
- }
- /**
- * 工具函数:阻塞式延迟
- * @param {number} ms 延迟时间(毫秒)
- */
- function sleep(ms) {
- var start = Date.now();
- while (Date.now() - start < ms) {
- // 阻塞等待
- }
- }
- /**
- * 工具函数:日志输出
- * @param {string} message 日志消息
- */
- function log(message) {
- print.log('[' + getTimestamp() + '] ' + message);
- }
- /**
- * 工具函数:安全的OCR识别
- * @param {number[]} rect 识别区域 [x1, y1, x2, y2]
- * @returns {object} OCR结果对象或null
- */
- function safeOcr(rect) {
- try {
- var ocrResult = screen.ocr(rect[0], rect[1], rect[2], rect[3]);
- return ocrResult;
- } catch (e) {
- print.log('OCR识别失败: ' + e.message);
- return null;
- }
- }
- /**
- * 工具函数:安全的截图
- * @returns {object} 截图对象或null
- */
- function safeScreenshot() {
- try {
- var screenshot = screen.screenShotFull();
- return screenshot;
- } catch (e) {
- printl('截图失败: ' + e.message);
- return null;
- }
- }
- /**
- * 示例1: Detect类基本方法演示
- * 展示Detect类的核心方法使用
- */
- function basicDetectMethods() {
- print.log('==== 示例1: Detect类基本方法演示 ====');
-
- try {
- // 执行OCR识别
- var ocrResult = safeOcr([0, 0, 1, 1]);
- if (!ocrResult) {
- print.log('无法获取OCR结果,跳过此示例');
- return;
- }
-
- // 获取所有检测目标
- var detects = ocrResult.getAllDetect();
- print.log('识别到 ' + detects.length + ' 个目标');
-
- if (detects.length > 0) {
- // 分析前3个目标
- var maxTargets = Math.min(detects.length, 3);
- for (var i = 0; i < maxTargets; i++) {
- var detect = detects[i];
- print.log('\n目标 ' + (i + 1) + ':');
-
- // 获取检测分数
- try {
- var score = detect.score();
- print.log(' 置信度: ' + score.toFixed(2));
- } catch (e) {
- print.log(' 获取置信度失败: ' + e.message);
- }
-
- // 获取检测区域
- try {
- var rect = detect.getRect();
- print.log(' 区域坐标: ' + rect);
- } catch (e) {
- print.log(' 获取区域坐标失败: ' + e.message);
- }
-
- // 访问属性
- try {
- print.log(' 文本内容: ' + (detect.text || '无文本'));
- print.log(' 位置: x=' + detect.x + ', y=' + detect.y);
- print.log(' 尺寸: width=' + detect.width + ', height=' + detect.height);
- } catch (e) {
- print.log(' 访问属性失败: ' + e.message);
- }
- }
- } else {
- print.log('未检测到任何目标');
- }
-
- } catch (e) {
- print.log('示例1执行失败: ' + e.message);
- }
- }
- /**
- * 示例2: 精确文本查找与点击
- * 使用findText方法查找精确文本并执行点击操作
- */
- function exactTextClick() {
- print.log('\n==== 示例2: 精确文本查找与点击 ====');
-
- try {
- var ocrResult = safeOcr([0, 0, 1, 1]);
- if (!ocrResult) {
- print.log('无法获取OCR结果,跳过此示例');
- return;
- }
-
- // 定义要查找的常见按钮文本
- var targetTexts = ['确定', '取消', '完成', '下一步', '关闭', '保存'];
- var found = false;
-
- for (var i = 0; i < targetTexts.length; i++) {
- var text = targetTexts[i];
- var target = ocrResult.findText(text, [0, 0, 1, 1]);
-
- if (target != null) {
- print.log('找到文本: "' + text + '"');
- print.log(' 置信度: ' + target.score().toFixed(2));
- print.log(' 区域: ' + target.getRect());
-
- // 演示点击操作(实际使用时取消注释)
- print.log(' 准备执行点击操作...');
- // target.click(); // 点击中心点
- // target.clickRandom(); // 随机点击
- print.log(' 点击操作已模拟执行');
-
- found = true;
- break;
- }
- }
-
- if (!found) {
- print.log('未找到预定义的目标文本');
- }
-
- } catch (e) {
- print.log('示例2执行失败: ' + e.message);
- }
- }
- /**
- * 示例3: 包含文本查找与批量处理
- * 使用findIncludeTexts方法查找包含特定文本的所有目标
- */
- function includeTextSearch() {
- print.log('\n==== 示例3: 包含文本查找与批量处理 ====');
-
- try {
- var ocrResult = safeOcr([0, 0, 1, 1]);
- if (!ocrResult) {
- print.log('无法获取OCR结果,跳过此示例');
- return;
- }
-
- // 查找包含特定关键词的文本
- var keyword = '设置';
- var targets = ocrResult.findIncludeTexts(keyword, [0, 0, 1, 1]);
-
- print.log('查找包含 "' + keyword + '" 的文本,找到 ' + targets.length + ' 个结果');
-
- for (var i = 0; i < targets.length; i++) {
- var target = targets[i];
- print.log(' 结果 ' + (i + 1) + ': "' + target.text + '"');
- print.log(' 置信度: ' + target.score().toFixed(2));
- print.log(' 区域: ' + target.getRect());
- }
-
- } catch (e) {
- print.log('示例3执行失败: ' + e.message);
- }
- }
- /**
- * 示例4: 正则表达式文本查找
- * 使用findTextWithRegex方法进行模式匹配
- */
- function regexTextSearch() {
- print.log('\n==== 示例4: 正则表达式文本查找 ====');
-
- try {
- var ocrResult = safeOcr([0, 0, 1, 1]);
- if (!ocrResult) {
- print.log('无法获取OCR结果,跳过此示例');
- return;
- }
-
- // 使用正则表达式查找数字
- var regex = '\\d+';
- var targets = ocrResult.findTextWithRegex(regex, [0, 0, 1, 1]);
-
- print.log('使用正则表达式 "' + regex + '" 查找数字,找到 ' + targets.length + ' 个结果');
-
- for (var i = 0; i < targets.length; i++) {
- var target = targets[i];
- print.log(' 结果 ' + (i + 1) + ': "' + target.text + '"');
- print.log(' 置信度: ' + target.score().toFixed(2));
- print.log(' 区域: ' + target.getRect());
- }
-
- } catch (e) {
- print.log('示例4执行失败: ' + e.message);
- }
- }
- /**
- * 示例5: 区域OCR与目标定位
- * 在指定区域内进行OCR识别并处理结果
- */
- function regionOcrProcessing() {
- print.log('\n==== 示例5: 区域OCR与目标定位 ====');
-
- try {
- // 定义屏幕区域(示例:屏幕下半部分)
- var region = [0, 0.5, 1, 1];
- print.log('在区域 [' + region[0] + ', ' + region[1] + ', ' + region[2] + ', ' + region[3] + '] 内进行OCR识别');
-
- var ocrResult = safeOcr(region);
- if (!ocrResult) {
- print.log('无法获取OCR结果,跳过此示例');
- return;
- }
-
- // 获取区域内的所有目标
- var detects = ocrResult.getAllDetect();
- print.log('区域内识别到 ' + detects.length + ' 个目标');
-
- // 按置信度排序并显示前5个
- if (detects.length > 0) {
- // 简单排序(按置信度降序)
- detects.sort(function(a, b) {
- return b.score() - a.score();
- });
-
- var topTargets = Math.min(detects.length, 5);
- for (var i = 0; i < topTargets; i++) {
- var detect = detects[i];
- print.log(' 目标 ' + (i + 1) + ': "' + detect.text + '" (置信度: ' + detect.score().toFixed(2) + ')');
- }
- }
-
- } catch (e) {
- print.log('示例5执行失败: ' + e.message);
- }
- }
- /**
- * 示例6: iOS应用自动化示例
- * 模拟一个完整的iOS应用操作流程
- */
- function iosAppAutomation() {
- print.log('\n==== 示例6: iOS应用自动化示例 ====');
-
- try {
- print.log('步骤1: 查找并点击"设置"应用');
- var ocrResult1 = safeOcr([0, 0, 1, 1]);
- if (!ocrResult1) {
- print.log('无法获取OCR结果,跳过自动化示例');
- return;
- }
-
- var settingsTarget = ocrResult1.findText('设置', [0, 0, 1, 1]);
- if (settingsTarget != null) {
- print.log('找到"设置"应用,准备点击');
- // settingsTarget.click();
- print.log('模拟点击"设置"应用');
-
- // 等待应用启动
- sleep(3000);
-
- print.log('步骤2: 查找并点击"通用"选项');
- var ocrResult2 = safeOcr([0, 0, 1, 1]);
- if (ocrResult2) {
- var generalTarget = ocrResult2.findText('通用', [0, 0, 1, 1]);
- if (generalTarget != null) {
- print.log('找到"通用"选项,准备点击');
- // generalTarget.click();
- print.log('模拟点击"通用"选项');
- } else {
- print.log('未找到"通用"选项');
- }
- }
- } else {
- print.log('未找到"设置"应用');
- }
-
- // 演示点击底部导航栏按钮
- print.log('\n步骤3: 演示点击底部导航栏按钮');
- var ocrResult3 = safeOcr([0, 0, 1, 1]);
- if (ocrResult3) {
- // 查找并点击"软件"按钮
- var softwareTarget = ocrResult3.findText('软件', [0, 0, 1, 1]);
- if (softwareTarget != null) {
- print.log('找到"软件"按钮,准备点击');
- // softwareTarget.click();
- print.log('模拟点击"软件"按钮');
- sleep(2000);
- } else {
- print.log('未找到"软件"按钮');
- }
-
- // 查找并点击"日志"按钮
- var logTarget = ocrResult3.findText('日志', [0, 0, 1, 1]);
- if (logTarget != null) {
- print.log('找到"日志"按钮,准备点击');
- // logTarget.click();
- print.log('模拟点击"日志"按钮');
- sleep(2000);
- } else {
- print.log('未找到"日志"按钮');
- }
-
- // 查找并点击"设置"按钮
- var settingsNavTarget = ocrResult3.findText('设置', [0, 0, 1, 1]);
- if (settingsNavTarget != null) {
- print.log('找到"设置"按钮,准备点击');
- // settingsNavTarget.click();
- print.log('模拟点击"设置"按钮');
- sleep(2000);
- } else {
- print.log('未找到"设置"按钮');
- }
- }
-
- } catch (e) {
- print.log('自动化示例执行失败: ' + e.message);
- }
- }
- /**
- * 示例7: Detect类高级应用 - 目标过滤与选择
- * 根据条件过滤和选择检测目标
- */
- function advancedTargetSelection() {
- print.log('\n==== 示例7: Detect类高级应用 - 目标过滤与选择 ====');
-
- try {
- var ocrResult = safeOcr([0, 0, 1, 1]);
- if (!ocrResult) {
- print.log('无法获取OCR结果,跳过此示例');
- return;
- }
-
- var detects = ocrResult.getAllDetect();
- print.log('原始检测目标数量: ' + detects.length);
-
- // 过滤条件1: 置信度大于0.8
- var highConfidenceTargets = [];
- for (var i = 0; i < detects.length; i++) {
- var detect = detects[i];
- if (detect.score() > 0.8) {
- highConfidenceTargets.push(detect);
- }
- }
-
- print.log('高置信度目标数量(>0.8): ' + highConfidenceTargets.length);
-
- // 过滤条件2: 文本长度大于2
- var validTargets = [];
- for (var j = 0; j < highConfidenceTargets.length; j++) {
- var target = highConfidenceTargets[j];
- if (target.text && target.text.length > 2) {
- validTargets.push(target);
- }
- }
-
- print.log('有效目标数量(文本长度>2): ' + validTargets.length);
-
- // 显示过滤后的目标
- for (var k = 0; k < Math.min(validTargets.length, 3); k++) {
- var target = validTargets[k];
- print.log(' 目标 ' + (k + 1) + ': "' + target.text + '" (置信度: ' + target.score().toFixed(2) + ')');
- }
-
- } catch (e) {
- print.log('示例7执行失败: ' + e.message);
- }
- }
- /**
- * 主函数 - 运行所有示例
- */
- function main() {
- print.log('苹果iOS Detect类系统性使用示例');
- print.log('=====================================');
-
- // 运行各个示例
- basicDetectMethods();
- exactTextClick();
- includeTextSearch();
- regexTextSearch();
- regionOcrProcessing();
- iosAppAutomation();
- advancedTargetSelection();
-
- print.log('\n所有示例执行完毕!');
- print.log('=====================================');
- print.log('使用说明:');
- print.log('1. 本示例针对iOS平台优化,包含完整的错误处理');
- print.log('2. 实际使用时,请取消注释相应的点击操作代码');
- print.log('3. 根据具体应用场景调整OCR区域和目标文本');
- print.log('4. 对于连续操作,建议添加适当的sleep等待时间');
- print.log('5. 可以根据需要扩展异常处理逻辑');
- }
- // 调用主函数运行示例
- main();
复制代码
|
|