3. RPA核心组件:选择器原理与配置、变量与数据类型、流程控制、异常处理机制

好,咱们进入RPA最核心的部分。说实话,很多初学者觉得RPA就是“录个屏,点几下”,其实不然。真正让RPA稳定、智能的,是底下这几个硬核组件。今天我就把这四个核心掰开揉碎了讲给你听。

3.1 选择器(Selector)—— 让机器人“看”得见元素

你想想看,一个机器人要操作电脑,它怎么知道该点哪里?靠的就是选择器。选择器说白了,就是给机器人一双“眼睛”,告诉它目标元素在屏幕上的唯一身份。

3.1.1 选择器的原理

每个界面元素,比如一个按钮、一个输入框,在底层都有它的“身份证”。这个身份证由一组属性组成,比如:

  • tag:元素标签,比如 <button><input>
  • id:唯一标识符,最稳定
  • name:名称属性
  • class:样式类名
  • title:提示文本
  • path:元素在DOM树中的路径

选择器就是把这些属性组合起来,形成一个唯一的“寻址表达式”。

核心原则:选择器越具体,定位越准;但越具体,也越脆弱。我一般建议在“稳定”和“灵活”之间找平衡。

3.1.2 选择器的配置技巧

我在项目中遇到过最头疼的事,就是系统一升级,选择器全失效了。后来我总结了一套配置方法:

  1. 优先用id:id是唯一的,只要开发不改,基本不会变
  2. 次选用name或title:这些属性相对稳定
  3. 避免用绝对路径:比如 /html/body/div[3]/div[2]/button,页面结构一变就废
  4. 善用通配符和正则:比如 class*='btn-submit' 可以匹配包含该关键词的class

我的小技巧:配置选择器时,先用工具验证一下是否唯一。很多RPA工具都带“高亮元素”功能,点一下看看是不是你要的那个。

3.1.3 动态选择器处理

有些页面元素是动态生成的,比如表格行、弹窗。这时候固定选择器就不够用了。我常用的办法是:

  • 使用索引:比如选择第3行,用 row[2]
  • 使用变量替换:把动态部分用变量代替,比如 id='user_{userId}'
  • 使用相对选择器:先定位一个稳定的父元素,再找子元素
// 示例:动态选择器配置
// 假设每次登录的用户ID不同
// 固定部分:id='user_' + 动态部分
Selector: id='user_{userId}'
// 运行时传入 userId 变量即可

注意:动态选择器一定要做边界测试。我曾经因为没考虑空值,导致选择器匹配到一堆无关元素,差点把生产数据搞乱。

3.2 变量与数据类型—— 机器人的“记忆”

机器人干活,总得记住点东西吧?比如用户名、密码、计算结果。这些就是变量。但变量不是随便存的,得按类型来。

3.2.1 常见数据类型

类型 说明 示例
String(字符串) 文本内容 "Hello, RPA"
Int(整数) 整数值 42
Double(浮点数) 带小数点的数 3.14
Boolean(布尔) 真/假 True / False
Array(数组) 一组数据 [1, 2, 3]
Dictionary(字典) 键值对 {"name": "张三", "age": 30}

3.2.2 变量命名与作用域

我个人习惯用“匈牙利命名法”的简化版:

  • 全局变量:以 g_ 开头,比如 g_UserName
  • 局部变量:直接用小驼峰,比如 userName
  • 常量:全大写,比如 MAX_RETRY_COUNT

避坑指南:我曾经因为变量名拼写错误,排查了整整两个小时。后来我养成了习惯——所有变量名写完后,先检查一遍拼写。

3.2.3 类型转换

实际项目中,经常需要把一种类型转成另一种。比如从文本框读到的“123”是字符串,但你要做加法,就得转成整数。

// 类型转换示例
string strNumber = "123"
int intNumber = Convert.ToInt32(strNumber)  // 字符串转整数
string strResult = intNumber.ToString()      // 整数转字符串

注意:类型转换一定要做异常处理。比如用户输入了“abc”,你硬要转成整数,程序就崩了。我一般会先判断一下能不能转。

3.3 流程控制—— 让机器人“思考”

机器人不能只会顺序执行,得能判断、能循环。这就是流程控制。

3.3.1 条件判断(If/Else)

最常见的场景:如果登录成功,就继续;否则,报错退出。

// 条件判断伪代码
If (loginResult == "成功") Then
    // 执行后续操作
    NavigateToDashboard()
Else
    // 记录错误并退出
    LogError("登录失败")
    StopProcess()
End If

嗯,这里要注意:条件判断里,布尔值可以直接用,不用写 == True。比如 If (isLoggedIn) Then 就够了。

3.3.2 循环(For/While)

循环用来处理重复性工作。比如读取Excel的每一行,或者重试失败的操作。

  • For循环:知道要循环多少次时用。比如处理100行数据。
  • While循环:不知道次数,但知道什么时候停止时用。比如等待某个元素出现。
  • For Each:遍历集合时用,最常用。
// For Each 循环示例
For Each row In excelData
    // 处理每一行
    ProcessRow(row)
Next

// While 循环示例
While (element.Exists == False)
    Wait(1000)  // 等1秒再检查
    retryCount = retryCount + 1
    If (retryCount > 10) Then
        Break  // 超过10次就放弃
    End If
End While

我的经验:循环里一定要加“退出条件”或“最大次数限制”。不然遇到死循环,机器人就卡死了。我曾经有个同事没加限制,循环跑了整整一个周末。

3.4 异常处理机制—— 给机器人上“保险”

程序总会出错的。网络断了、系统卡了、数据格式变了……没有异常处理的RPA,就像没系安全带的赛车手。

3.4.1 常见的异常类型

异常类型 常见原因 处理方式
元素未找到 页面加载慢、选择器失效 等待重试、更新选择器
超时异常 操作耗时过长 增加超时时间、分步执行
数据格式异常 输入数据不符合预期 数据校验、类型转换前检查
权限异常 没有操作权限 检查账号权限、提权处理

3.4.2 Try/Catch/Finally 结构

这是异常处理的标准姿势:

Try
    // 尝试执行可能出错的代码
    OpenApplication()
    Login()
    ProcessData()
Catch ex As Exception
    // 捕获异常并处理
    LogError("操作失败: " + ex.Message)
    SendAlertEmail("管理员,RPA出错了!")
Finally
    // 无论成功失败,都要执行的清理工作
    CloseApplication()
End Try

避坑指南:我曾经在Catch块里只写了日志,没做任何恢复操作。结果机器人连续报错,但一直没停,把数据搞乱了。现在我的原则是——Catch里要么重试,要么优雅退出,绝不能什么都不做。

3.4.3 重试机制

有些错误是临时的,比如网络抖动。这时候直接重试比报错退出更合理。

// 带重试的异常处理
maxRetries = 3
retryCount = 0
success = False

While (retryCount < maxRetries And success == False)
    Try
        // 执行操作
        ClickButton()
        success = True
    Catch ex As Exception
        retryCount = retryCount + 1
        If (retryCount >= maxRetries) Then
            // 重试次数用完,上报错误
            LogError("重试" + maxRetries + "次后仍然失败")
            Throw ex  // 重新抛出异常
        Else
            Wait(2000)  // 等2秒再重试
        End If
    End Try
End While

注意:重试不是万能的。如果连续失败3次以上,说明问题不是临时的,这时候应该停下来人工介入。我一般设置最大重试3次,超过就发通知。

3.4.4 全局异常处理

你不可能在每个地方都写Try/Catch,那样代码太臃肿了。我建议设置一个全局异常处理器:

  • 捕获所有未处理的异常
  • 记录详细的错误上下文(哪个步骤、什么数据、什么时间)
  • 发送通知给运维人员
  • 执行清理操作(关闭应用、释放资源)

说白了,全局异常处理就是最后一道防线。它保证即使出了意外,机器人也能“体面地”退出,而不是留下一堆烂摊子。


好了,这四个核心组件讲完了。选择器让机器人看得见,变量让它记得住,流程控制让它会思考,异常处理让它稳得住。把这四个吃透了,你的RPA机器人就能从“玩具”变成“工具”。下一章我们聊聊怎么把这些组件组合起来,做一个真正的自动化流程。