📚 知识库

03循环功能

作者: aklai 更新时间: 2026-01-13 02:05 浏览次数: 89

循环功能使用教程

概述

循环功能是脚本自动化的核心控制结构,允许重复执行一段动作序列。系统支持固定次数循环、随机次数循环、嵌套循环等多种模式,并提供了强大的循环状态管理和跳转控制机制。

支持的循环特性

  • 固定次数循环: 执行指定次数的重复操作
  • 随机次数循环: 在范围内随机选择执行次数
  • 嵌套循环: 支持多层循环嵌套,最大层级限制
  • 循环栈管理: 独立的循环状态栈,支持复杂的嵌套控制
  • 跳转控制: 循环过程中支持条件跳转和流程控制
  • 动作组循环: 动作组内部独立的循环系统

核心概念

循环结构 vs 线性执行

特性 线性执行 循环执行
执行流程 顺序执行,每个动作仅执行一次 重复执行循环体内的动作序列
控制复杂度 简单 需要理解循环边界和状态管理
应用场景 简单的单次操作流程 重复性操作、数据处理、游戏自动化
资源消耗 根据循环次数成比例增加
调试难度 需要跟踪循环状态和迭代过程

循环的工作原理

  1. 初始化阶段: 遇到 循环开始 时创建循环状态
  2. 执行阶段: 依次执行循环体内的动作
  3. 检查阶段: 遇到 循环结束 时检查是否继续循环
  4. 跳转阶段: 根据循环状态决定跳转到循环开始或继续后续动作
  5. 清理阶段: 循环完成后清理循环状态

循环层级系统

脚本级循环 (主循环)

  • 作用域: 在主脚本中的循环控制
  • 标识: 使用 L1, L2, L3 等表示嵌套层级
  • 管理器: ScriptConfig 中的循环栈管理
  • 优先级: 最高优先级,控制整个脚本的执行流程

动作组级循环 (子循环)

  • 作用域: 在动作组内部的循环控制
  • 标识: 动作组名称前缀 + 循环层级
  • 管理器: ActionGroupExecutionState 中的独立循环栈
  • 优先级: 在动作组执行上下文中有效,不影响主脚本循环

层级关系图

脚本执行
├── 脚本循环 L1 [开始]
│   ├── 动作1: 点击
│   ├── 动作2: 调用动作组A
│   │   └── 动作组A内部循环 [开始]
│   │       ├── 动作A1: 文字识别检测
│   │       ├── 动作A2: 等待
│   │       └── [动作组循环结束,返回主脚本]
│   ├── 动作3: 等待
│   └── 脚本循环 L1 [检查/跳转]
└── [脚本执行完成]

基础循环配置

循环开始 (循环开始)

1. 基本设置

在动作配置界面选择 循环开始 类型: - 系统将显示循环配置界面 - 必须与相应的 循环结束 配对使用

2. 循环模式选择

固定次数循环:

循环模式: 固定次数
循环次数: 5
说明: 精确执行5次循环

随机次数循环:

循环模式: 随机次数
最小次数: 3
最大次数: 8
说明: 随机执行3-8次循环

3. 配置示例

示例1: 固定次数循环

动作类型: 循环开始
循环配置:
  模式: 固定次数
  循环次数: 10
  说明: "重复数据录入操作10次"

示例2: 随机次数循环

动作类型: 循环开始
循环配置:
  模式: 随机次数
  最小次数: 5
  最大次数: 12
  说明: "模拟用户随机浏览行为"
  智能上下文: "浏览操作_用户行为模拟"

循环结束 (循环结束)

基本配置

动作类型: 循环结束
说明: "结束当前循环层级"

循环结束动作会: 1. 检查当前循环是否达到设定次数 2. 如果未完成,跳转回对应的 循环开始 位置 3. 如果已完成,继续执行后续动作 4. 自动管理循环状态和嵌套层级

循环配置验证

系统提供循环结构验证功能:

常见验证错误: - 循环开始没有对应的循环结束 - 循环结束没有对应的循环开始
- 嵌套循环结构不匹配 - 循环边界跨分组设置不当

嵌套循环详解

嵌套循环概念

嵌套循环允许在一个循环内部包含另一个循环,创建复杂的重复逻辑结构。

嵌套层级管理

层级标识: - L1: 第一层循环(最外层) - L2: 第二层循环(嵌套在L1内) - L3: 第三层循环(嵌套在L2内) - : 支持更深层级嵌套

循环栈状态:

当前循环栈状态: L1(2/5)->L2(1/3)->L3(3/4)
解释: 
- L1循环:第2次/共5次
- L2循环:第1次/共3次  
- L3循环:第3次/共4次

嵌套循环配置示例

示例1: 双层循环数据处理

业务场景: 处理多个表格,每个表格有多行数据

# 外层循环:处理表格
动作1: 循环开始
  模式: 固定次数
  循环次数: 3
  说明: "处理3个表格"

动作2: 文字识别_点击
  检测目标: ["表格1", "表格2", "表格3"]
  说明: "点击下一个表格"

  # 内层循环:处理表格行
  动作3: 循环开始
    模式: 随机次数
    最小次数: 5
    最大次数: 10
    说明: "处理表格中的数据行"

  动作4: 文字识别_点击
    检测目标: ["下一行", "编辑"]
    说明: "选择数据行"

  动作5: 等待
    等待时间: 1秒
    说明: "等待数据加载"

  动作6: 循环结束
    说明: "结束行处理循环"

动作7: 循环结束
  说明: "结束表格处理循环"

执行流程: 1. 开始外层循环 L1 (表格处理) 2. 点击第一个表格 3. 开始内层循环 L2 (行处理) 4. 重复处理表格行 (5-10次) 5. 结束内层循环 L2 6. 外层循环 L1 继续下一次 (处理下一个表格) 7. 重复步骤 2-6,直到处理完3个表格

示例2: 三层循环游戏自动化

业务场景: 游戏中的多关卡、多波次、多目标处理

# 第一层:关卡循环
动作1: 循环开始
  模式: 固定次数
  循环次数: 5
  说明: "挑战5个关卡"

  # 第二层:波次循环  
  动作2: 循环开始
    模式: 随机次数
    最小次数: 3
    最大次数: 6
    说明: "每关卡3-6波敌人"

    # 第三层:目标循环
    动作3: 循环开始
      模式: 固定次数
      循环次数: 4
      说明: "每波4个目标"

    动作4: 图像识别_点击
      模板图片: ["敌人1.png", "敌人2.png"]
      说明: "攻击敌人"

    动作5: 等待
      等待时间: 0.5秒

    动作6: 循环结束
      说明: "结束目标循环"

  动作7: 等待
    等待时间: 2秒
    说明: "波次间隔等待"

  动作8: 循环结束
    说明: "结束波次循环"

动作9: 文字识别_点击
  检测目标: ["下一关", "继续"]
  说明: "进入下一关卡"

动作10: 循环结束
  说明: "结束关卡循环"

嵌套循环的执行机制

循环栈管理

入栈过程: 1. 遇到 循环开始 时,创建新的循环状态 2. 将循环状态压入循环栈 3. 设置循环层级和边界信息

出栈过程: 1. 遇到 循环结束 时,检查栈顶循环状态 2. 如果需要继续循环,更新迭代次数并跳转 3. 如果循环完成,将循环状态从栈中移除

状态追踪:

执行动作3时的循环栈状态:
┌─────────────────────────────────┐
│ L3(当前迭代: 1, 总次数: 4)       │ ← 栈顶(最内层)
├─────────────────────────────────┤
│ L2(当前迭代: 2, 总次数: 5)       │ ← 中间层
├─────────────────────────────────┤
│ L1(当前迭代: 1, 总次数: 3)       │ ← 栈底(最外层)
└─────────────────────────────────┘

循环边界检测

系统自动检测循环边界,确保正确的嵌套关系:

正确的嵌套:

循环开始 (L1)     # 动作1
  循环开始 (L2)   # 动作3  
    动作序列
  循环结束 (L2)     # 动作7
循环结束 (L1)       # 动作9

错误的交叉:

循环开始 (L1)     # 动作1
  循环开始 (L2)   # 动作3
循环结束 (L1)       # 动作7 ❌ 错误:应该先结束L2
  循环结束 (L2)     # 动作9 ❌ 错误:L1已结束

循环中的跳转机制

跳转类型概述

循环执行过程中支持多种跳转操作,但需要注意对循环状态的影响。

支持的跳转类型

  1. 跳转到动作号: 直接跳转到指定的动作编号
  2. 跳转到分组: 跳转到指定分组的第一个动作
  3. 调用动作组: 暂时跳转到动作组执行
  4. 条件流程控制: 基于条件的动态跳转

循环内跳转的影响

1. 跳转到循环外部

场景: 从循环内部跳转到循环结构外的动作

动作1: 循环开始
  循环次数: 5

动作2: 文字识别_检测
  检测目标: ["错误", "异常"]
  检测失败后操作: 跳转到动作 6  # 跳出循环

动作3: 点击
  坐标: (100, 200)

动作4: 循环结束

动作5: 正常流程继续...

动作6: 错误处理流程...  # 跳转目标

影响分析: - ✅ 循环状态保持: 循环栈状态保留,可能影响后续流程 - ⚠️ 注意事项: 跳出循环但循环状态未清理,可能导致问题 - 🔧 建议: 在跳转目标位置考虑循环状态清理

2. 跳转到循环内部

场景: 从循环外部或其他位置跳转到循环内部

动作1: 文字识别_检测
  检测目标: ["开始处理"]
  检测成功后操作: 跳转到动作 4  # 跳入循环

动作2: 循环开始
  循环次数: 3

动作3: 初始化动作...

动作4: 主要处理动作...  # 跳转目标

动作5: 循环结束

影响分析: - ❌ 循环状态缺失: 跳转进入时缺少循环初始化状态 - ❌ 边界混乱: 可能导致循环结束时找不到对应的开始 - 🚫 不建议: 避免从循环外部跳转到循环内部

3. 循环间跳转

场景: 从一个循环跳转到另一个循环

# 第一个循环
动作1: 循环开始
  循环次数: 3

动作2: 文字识别_检测  
  检测目标: ["切换模式"]
  检测成功后操作: 跳转到动作 6  # 跳到第二个循环

动作3: 循环结束

动作4: 其他动作...

# 第二个循环  
动作5: 循环开始
  循环次数: 5

动作6: 第二循环的处理...  # 跳转目标

动作7: 循环结束

影响分析: - ⚠️ 状态混乱: 第一个循环状态未正确清理 - ⚠️ 嵌套问题: 可能造成循环栈状态异常 - 🔧 解决方案: 使用条件流程控制或动作组调用

最佳跳转实践

1. 安全的循环控制跳转

推荐方式: 使用条件流程控制

动作1: 循环开始
  循环次数: 10

动作2: 条件控制
  条件类型: IF_THEN
  检测配置:
    检测类型: 文字识别文字检测
    检测目标: ["完成", "结束"]
  满足条件时操作: 跳转到分组 "结束处理"

动作3: 正常循环体...

动作4: 循环结束

# 结束处理分组
动作5: [分组: 结束处理] 清理操作...

2. 循环异常处理

异常跳转处理:

动作1: 循环开始
  循环次数: 5

动作2: 文字识别_检测
  检测目标: ["目标元素"]
  重试次数: 3
  重试失败后操作: 跳转到分组 "循环异常处理"

动作3: 正常处理...

动作4: 循环结束

# 异常处理分组
动作5: [分组: 循环异常处理] 
动作6: 强制清理循环状态
动作7: 跳转到分组 "错误恢复"

3. 嵌套循环的安全跳转

场景: 从内层循环安全跳出到外层

动作1: 循环开始  # 外层循环
  循环次数: 3

动作2: 循环开始  # 内层循环
  循环次数: 5

动作3: 文字识别_检测
  检测目标: ["跳出内层"]
  检测成功后操作: 跳转到动作 6  # 跳到内层循环结束

动作4: 内层正常处理...

动作5: 循环结束  # 内层循环结束

动作6: 外层循环继续...  # 跳转目标

动作7: 循环结束  # 外层循环结束

跳转调试技巧

1. 循环状态监控

在日志中观察循环栈状态:

[脚本名] 动作#3 当前循环栈: L1(2/5)->L2(1/3)
[脚本名] 动作#5 跳转执行: 从动作5跳转到动作8
[脚本名] 动作#8 循环栈检查: L1(2/5)->L2(1/3) (状态保持)

2. 跳转路径追踪

记录跳转路径便于调试:

[脚本名] 跳转路径: 动作2 → 动作7 → 动作3 → 动作8
[脚本名] 循环状态变化: 
  - 跳转前: L1(1/3)
  - 跳转后: L1(1/3) (保持)

动作组循环详解

动作组循环的独立性

动作组内部拥有完全独立的循环系统,与主脚本循环互不干扰。

独立循环栈

主脚本循环栈:

ScriptConfig.loopStack: [L1(2/5), L2(1/3)]

动作组循环栈:

ActionGroupExecutionState.loopStack: [AG-L1(1/4), AG-L2(3/7)]

执行上下文隔离

脚本执行
├── 脚本循环 L1 [2/5次]
│   ├── 动作1: 点击
│   ├── 动作2: 调用动作组A
│   │   └── 动作组A执行上下文
│   │       ├── 动作组循环 AG-L1 [1/4次]
│   │       │   ├── 动作A1: 文字识别检测
│   │       │   ├── 动作A2: 嵌套调用动作组B
│   │       │   │   └── 动作组B执行上下文
│   │       │   │       ├── 动作组循环 AG-L1 [3/6次]
│   │       │   │       └── (独立的循环系统)
│   │       │   └── 动作A3: 等待
│   │       └── 动作组循环 AG-L1 [结束]
│   └── 脚本循环 L1 [继续下一次]

动作组循环配置

基本配置方式

动作组内的循环配置与主脚本相同:

# 动作组内的循环
动作组: "数据处理流程"
动作序列:
  动作1: 循环开始
    模式: 随机次数
    最小次数: 2
    最大次数: 5
    说明: "动作组内的随机循环"

  动作2: 文字识别_点击
    检测目标: ["处理", "下一条"]

  动作3: 等待
    等待时间: 1秒

  动作4: 循环结束
    说明: "结束动作组内循环"

动作组嵌套调用中的循环

场景: 动作组A调用动作组B,两者都包含循环

# 主脚本
动作1: 循环开始
  循环次数: 3
  说明: "主脚本循环"

动作2: ACTION_GROUP_CALL
  动作组: "流程A"

动作3: 循环结束

# 动作组A
动作组A:
  动作A1: 循环开始
    循环次数: 2
    说明: "动作组A的循环"

  动作A2: ACTION_GROUP_CALL
    动作组: "流程B"

  动作A3: 循环结束

# 动作组B  
动作组B:
  动作B1: 循环开始
    循环次数: 4
    说明: "动作组B的循环"

  动作B2: 点击
    坐标: (100, 200)

  动作B3: 循环结束

执行分析: - 主脚本循环3次 - 每次主脚本循环中,动作组A循环2次 - 每次动作组A循环中,动作组B循环4次 - 总点击次数: 3 × 2 × 4 = 24次

循环优先级和冲突处理

优先级层次

  1. 最高优先级: 当前执行上下文的循环
  2. 中等优先级: 父级上下文的循环
  3. 最低优先级: 全局脚本循环

冲突场景处理

场景1: 动作组内跳转到主脚本

# 主脚本循环
动作1: 循环开始 (主脚本 L1)

动作2: ACTION_GROUP_CALL
  动作组: "处理流程"

动作3: 循环结束 (主脚本 L1)

# 动作组内部
动作组 "处理流程":
  动作A1: 循环开始 (动作组 AG-L1)
  
  动作A2: 文字识别_检测
    检测失败后操作: 跳转到主脚本动作 4  # 跨上下文跳转
    
  动作A3: 循环结束 (动作组 AG-L1)

# 主脚本继续
动作4: 错误处理...

处理机制: - ❌ 上下文冲突: 动作组循环状态与主脚本状态不匹配 - 🔧 系统处理: 自动清理动作组循环状态 - ⚠️ 副作用: 可能导致主脚本循环状态异常

建议解决方案:

# 改进方案:使用动作组内部跳转
动作组 "处理流程":
  动作A1: 循环开始 (动作组 AG-L1)
  
  动作A2: 文字识别_检测
    检测失败后操作: 跳转到分组 "动作组错误处理"
    
  动作A3: 循环结束 (动作组 AG-L1)
  
  动作A4: [分组: 动作组错误处理] 内部错误处理
  动作A5: 返回主脚本时设置错误标志

随机循环详解

随机循环的应用场景

随机循环模拟真实用户行为,避免固定模式被检测,增强自动化脚本的自然性。

典型应用场景

  1. 用户行为模拟: 随机浏览次数、随机停留时间
  2. 游戏自动化: 随机刷图次数、随机技能释放
  3. 数据采集: 随机采集样本数量
  4. 压力测试: 随机负载生成

随机算法机制

智能上下文随机

系统使用智能上下文系统生成随机数,确保: - 一致性: 相同上下文产生相似的随机结果 - 多样性: 不同上下文产生不同的随机结果 - 可预测性: 便于调试和问题复现

上下文信息构成

随机上下文信息:
├── 基础信息: "循环次数_脚本名称_动作编号"
├── 时间因子: 当前时间的影响
├── 执行环境: 设备状态、网络状态等
└── 用户设定: 自定义的上下文标识

示例:

上下文: "循环次数_数据采集脚本_动作3"
生成范围: 5-10次
可能结果: 7次 (基于上下文算法)

随机循环配置详解

基本随机配置

动作类型: 循环开始
循环模式: 随机次数
随机配置:
  最小次数: 3
  最大次数: 8
  上下文标识: "用户浏览行为"
说明: "模拟用户随机浏览3-8次"

高级随机配置

场景相关的随机设置:

# 游戏刷图随机
动作类型: 循环开始
循环模式: 随机次数
随机配置:
  最小次数: 5
  最大次数: 15
  上下文标识: "游戏刷图_体力消耗"
说明: "根据体力随机刷图5-15次"

# 数据采集随机
动作类型: 循环开始
循环模式: 随机次数
随机配置:
  最小次数: 10
  最大次数: 50
  上下文标识: "数据采集_样本数量"
说明: "随机采集10-50个数据样本"

嵌套随机循环

复杂随机场景:

# 外层随机:随机处理几个页面
动作1: 循环开始
  循环模式: 随机次数
  最小次数: 2
  最大次数: 5
  上下文标识: "页面处理数量"

  # 内层随机:每个页面随机处理几个项目
  动作2: 循环开始
    循环模式: 随机次数
    最小次数: 3
    最大次数: 10
    上下文标识: "页面项目处理数量"

  动作3: 处理单个项目...

  动作4: 循环结束  # 内层循环结束

动作5: 翻页操作...

动作6: 循环结束  # 外层循环结束

随机结果示例: - 外层随机结果: 3页 (在2-5范围内) - 内层随机结果: - 第1页: 7个项目 (在3-10范围内) - 第2页: 4个项目 - 第3页: 9个项目 - 总处理项目: 7 + 4 + 9 = 20个

随机循环调试

随机结果日志

系统会详细记录随机生成过程:

[脚本名] 动作#1 随机循环配置 - 范围: 5-12次,上下文: "数据处理_批次"
[脚本名] 动作#1 随机生成结果 - 本次执行: 8次
[脚本名] 动作#1 循环栈状态 - 创建: L1(0/8)

可重现性测试

通过固定上下文确保随机结果的可重现性:

# 测试配置
动作类型: 循环开始
循环模式: 随机次数
随机配置:
  最小次数: 1
  最大次数: 10
  上下文标识: "测试专用_固定种子_001"

多次执行相同配置应该产生相同的随机结果。

循环性能优化

大循环次数优化

性能考虑因素

  1. 内存消耗: 循环状态栈的内存占用
  2. 日志存储: 大量循环日志的存储空间
  3. 执行时间: 长时间循环的用户体验
  4. 系统资源: CPU和设备资源消耗

优化策略

1. 合理设置循环次数

# 避免过大的循环
❌ 不推荐:
动作类型: 循环开始
循环次数: 10000  # 过大的循环次数

✅ 推荐:
动作类型: 循环开始
循环次数: 50
说明: "合理的循环次数,分批处理"

2. 使用嵌套分解大循环

# 将大循环分解为嵌套循环
外层循环: 10次 (大分类)
内层循环: 50次 (小批量)
总计: 500次 (10 × 50)

优势:
- 更好的进度控制
- 更容易中断和恢复
- 更清晰的日志结构

3. 添加适当的等待时间

动作1: 循环开始
  循环次数: 100

动作2: 主要处理动作...

动作3: 等待
  等待时间: 0.1秒  # 短暂等待,避免过度占用资源
  说明: "防止过度占用系统资源"

动作4: 循环结束

循环状态清理

自动清理机制

系统在以下情况会自动清理循环状态: 1. 脚本执行完成 2. 脚本被强制停止 3. 发生未处理的异常 4. 跨上下文跳转

手动清理方法

紧急情况下的循环清理:

# 添加循环清理检查点
动作1: 条件控制
  条件类型: IF_THEN
  检测配置:
    检测类型: 文字识别文字检测
    检测目标: ["重置", "清理"]
  满足条件时操作: 调用动作组 "循环状态清理"

# 清理动作组
动作组 "循环状态清理":
  动作1: 强制清理所有循环状态
  动作2: 重置脚本执行位置
  动作3: 跳转到安全位置

故障排除

常见循环问题

1. 循环无法结束

症状: 循环超出预期次数继续执行

可能原因: - 循环开始和结束不匹配 - 循环状态管理错误 - 跳转逻辑影响循环计数

诊断方法:

检查日志中的循环栈状态:
[脚本名] 动作#5 循环栈检查: L1(10/5) ← 异常:超出预期
[脚本名] 动作#5 循环状态验证失败

解决方案: 1. 验证循环结构的完整性 2. 检查跳转逻辑是否影响循环状态 3. 强制清理循环状态并重新开始

2. 嵌套循环混乱

症状: 内外层循环执行顺序混乱

可能原因: - 嵌套循环边界设置错误 - 跨层级跳转导致状态异常

诊断方法:

分析循环栈的层级关系:
[脚本名] 循环栈验证: L1(1/3)->L2(5/2) ← 异常:L2超出范围
[脚本名] 嵌套关系错误

解决方案: 1. 重新设计嵌套循环边界 2. 避免跨层级的直接跳转 3. 使用条件流程控制替代直接跳转

3. 循环与动作组冲突

症状: 调用动作组后循环状态异常

可能原因: - 动作组内跳转到主脚本 - 动作组执行异常未正确返回

诊断方法:

跟踪上下文切换:
[脚本名] 进入动作组: 处理流程
[动作组:处理流程] 循环开始: AG-L1(0/5)
[脚本名] 异常返回: 循环状态不一致

解决方案: 1. 确保动作组内部跳转不跨越上下文 2. 添加动作组异常处理机制 3. 在动作组返回时验证循环状态

调试工具和技巧

1. 循环状态监控

启用详细日志:

# 在循环开始添加状态监控
动作1: 循环开始
  循环次数: 5
  调试选项: 启用详细日志

# 在循环关键位置添加检查点
动作2: 检查点动作
动作3: 循环状态日志输出

2. 循环结构验证

使用系统验证功能:

验证结果示例:
✅ 循环结构完整性检查通过
✅ 嵌套关系正确
❌ 发现问题:动作15的循环结束没有对应的开始

3. 执行路径追踪

跟踪复杂循环的执行路径:

执行路径日志:
动作1 → 动作2 (L1开始) → 动作3 → 动作4 (L2开始) → 
动作5 → 动作6 (L2结束,跳转到动作4) → 动作5 → 
动作6 (L2结束,跳转到动作7) → 动作7 (L1结束,跳转到动作2)

最佳实践

1. 循环设计原则

简单性原则: - 优先使用简单的单层循环 - 避免过度复杂的嵌套结构 - 保持循环逻辑的清晰性

可维护性原则: - 使用有意义的循环说明 - 合理设置循环次数范围 - 添加适当的调试信息

性能原则: - 避免不必要的大循环 - 在循环体中添加适当等待 - 及时清理不需要的循环状态

2. 嵌套循环设计

层级控制: - 建议最大嵌套层级不超过3层 - 每层循环都应有明确的业务含义 - 避免单纯为了减少代码重复而嵌套

边界管理: - 确保循环开始和结束正确配对 - 避免跨循环边界的直接跳转 - 使用分组标识辅助循环边界识别

3. 跳转控制最佳实践

安全跳转: - 优先使用条件流程控制 - 避免跨上下文的直接跳转 - 在跳转前考虑循环状态影响

异常处理: - 为循环异常设计专门的处理流程 - 提供循环状态清理机制 - 建立错误恢复策略

4. 随机循环优化

合理范围: - 设置合理的随机次数范围 - 考虑业务场景的实际需求 - 避免过大的随机范围差异

上下文设计: - 使用有意义的上下文标识 - 确保上下文的唯一性 - 便于调试和问题定位

高级应用案例

案例1: 电商自动化购物

业务需求: 自动浏览商品,随机加购物车,模拟真实用户行为

# 主流程:浏览多个商品类别
动作1: 循环开始
  循环模式: 随机次数
  最小次数: 3
  最大次数: 6
  上下文标识: "商品类别浏览"
  说明: "随机浏览3-6个商品类别"

  # 子流程:每个类别浏览多个商品
  动作2: 循环开始
    循环模式: 随机次数
    最小次数: 5
    最大次数: 12
    上下文标识: "类别内商品浏览"
    说明: "每个类别随机浏览5-12个商品"

  动作3: 图像识别_点击
    模板图片: ["商品1.png", "商品2.png", "商品3.png"]
    说明: "点击商品进入详情"

  动作4: 等待
    等待时间: 2-5秒随机
    说明: "模拟用户查看商品详情时间"

  动作5: 条件控制
    条件类型: IF_THEN
    检测配置:
      检测类型: 文字识别文字检测
      检测目标: ["加入购物车", "立即购买"]
    满足条件时操作: 调用动作组 "随机加购物车"
    随机执行概率: 30%  # 30%概率执行加购物车

  动作6: 文字识别_点击
    检测目标: ["返回", "back"]
    说明: "返回商品列表"

  动作7: 循环结束  # 结束商品浏览循环

动作8: 文字识别_点击
  检测目标: ["下一类别", "更多分类"]
  说明: "切换到下一个商品类别"

动作9: 循环结束  # 结束类别浏览循环

# 随机加购物车动作组
动作组 "随机加购物车":
  动作A1: 文字识别_点击
    检测目标: ["加入购物车"]
    
  动作A2: 等待
    等待时间: 1秒
    
  动作A3: 文字识别_检测
    检测目标: ["已添加", "购物车"]
    检测成功时: 记录成功日志

执行特点: - 双层随机循环模拟真实浏览行为 - 随机执行概率控制加购物车频率 - 动作组封装可重用的购物车操作

案例2: 游戏多关卡自动化

业务需求: 自动挑战游戏关卡,根据不同难度调整策略

# 主循环:挑战多个关卡
动作1: 循环开始
  循环模式: 固定次数
  循环次数: 10
  说明: "挑战10个关卡"

动作2: 文字识别_检测
  检测目标: ["简单", "普通", "困难"]
  检测成功后操作: 调用对应难度动作组

动作3: 条件控制
  条件类型: IF_THEN_ELSE
  检测配置:
    检测类型: 文字识别文字检测
    检测目标: ["挑战成功", "胜利"]
  满足条件时操作: 继续下一关卡
  不满足时操作: 调用动作组 "失败重试处理"

动作4: 循环结束

# 困难关卡策略动作组
动作组 "困难关卡策略":
  # 困难关卡需要更多操作
  动作A1: 循环开始
    循环模式: 随机次数
    最小次数: 8
    最大次数: 15
    上下文标识: "困难关卡_技能释放"
    说明: "困难关卡需要更多技能"

  动作A2: 图像识别_点击
    模板图片: ["技能1.png", "技能2.png", "技能3.png"]
    随机偏移: 10像素
    说明: "释放技能"

  动作A3: 等待
    等待时间: 0.5秒
    说明: "技能冷却等待"

  动作A4: 循环结束

# 简单关卡策略动作组  
动作组 "简单关卡策略":
  # 简单关卡操作较少
  动作B1: 循环开始
    循环模式: 固定次数
    循环次数: 3
    说明: "简单关卡少量操作即可"

  动作B2: 图像识别_点击
    模板图片: ["攻击.png"]
    说明: "基础攻击"

  动作B3: 等待
    等待时间: 1秒

  动作B4: 循环结束

执行特点: - 根据关卡难度动态调整循环策略 - 困难关卡使用随机循环增加变化 - 简单关卡使用固定循环保证效率

案例3: 数据采集与处理

业务需求: 批量采集网页数据,按页面分批处理

# 外层循环:处理多个页面
动作1: 循环开始
  循环模式: 固定次数
  循环次数: 20
  说明: "处理20个数据页面"

  # 内层循环:每页采集多条数据
  动作2: 循环开始
    循环模式: 随机次数
    最小次数: 10
    最大次数: 25
    上下文标识: "页面数据采集_条目数"
    说明: "每页随机采集10-25条数据"

  动作3: 文字识别_点击
    检测目标: ["数据行", "条目"]
    重试次数: 3
    重试失败后操作: 跳转到分组 "页面数据采集完成"

  动作4: 调用动作组 "数据提取与保存"

  动作5: 文字识别_点击
    检测目标: ["下一条", "next"]
    说明: "移动到下一条数据"

  动作6: 循环结束  # 结束页面内数据采集

动作7: [分组: 页面数据采集完成] 文字识别_点击
  检测目标: ["下一页", "next page"]
  说明: "翻到下一页"

动作8: 等待
  等待时间: 3秒
  说明: "等待页面加载"

动作9: 循环结束  # 结束页面循环

# 数据提取与保存动作组
动作组 "数据提取与保存":
  动作C1: 文字识别_检测
    检测目标: ["标题", "价格", "描述"]
    检测区域: ROI(0, 0, 100, 50)
    说明: "提取数据字段"

  动作C2: SCREENSHOT
    保存路径: "/storage/emulated/0/data_collection/"
    文件名: "data_{timestamp}.jpg"
    说明: "保存数据截图"

  动作C3: 等待
    等待时间: 0.5秒
    说明: "数据保存等待"

执行特点: - 双层循环实现分页和条目的批量处理 - 随机采集数量避免固定模式被检测 - 独立的数据处理动作组便于复用和维护 - 完善的错误处理和跳转机制

总结

循环功能是脚本自动化的核心控制结构,通过合理的设计和使用,可以实现高效、稳定、灵活的自动化流程。

关键要点

  1. 理解循环层级: 掌握脚本循环与动作组循环的独立性和优先级关系
  2. 合理设计嵌套: 避免过度复杂的嵌套结构,保持逻辑清晰
  3. 安全使用跳转: 理解跳转对循环状态的影响,优先使用条件流程控制
  4. 善用随机功能: 合理利用随机循环模拟真实用户行为
  5. 注重性能优化: 控制循环次数和资源消耗,添加适当的等待时间
  6. 完善异常处理: 建立循环异常处理机制,提供状态清理功能

最佳实践总结

  • 从简单循环开始,逐步增加复杂度
  • 充分利用日志系统进行调试和监控
  • 设计完善的异常处理和恢复机制
  • 合理使用动作组封装可重用的循环逻辑
  • 定期验证循环结构的完整性和正确性

正确使用循环功能可以让您的自动化脚本更加强大、灵活和稳定!