本文目的是为开发者提供Automation Anywhere A2019 Bot的开发指南,开发标准和最佳实践。
1、不要重复自己的代码 Don’t Repeat Yourself Principle (DRY)
该原则的目的是减少Bot中代码的重复,避免在Bot中创建重复的一组动作或逻辑,会带来代码维护的复杂度。例如以下示例:
如果要将以上流程中的Excel处理3次,最简单的方法就是将这部分代码拷贝3次,这虽然有助于快速的实现自动化,但是这首先会加长代码的行数,造成阅读障碍;其次,会给后续的代码维护造成困然,如果有规则修改,就需要修改3处,很容易造成遗失。
正确的解决方法是设置子机器人,将这些重复执行的动作放入某个子Bot里,外面由父Bot调用3次这个子Bot。这样的代码看起来,思路更加清晰,而且这个子Bot可以被其他的机器人流程来复用。
在流程设计时,一类Bot是高内聚的,负责处理可复用步骤的,另一类Bot是负责串接流程的,串接起这些子Bot。
Bot在设计上应满足“单一职责”原则,就是每个Bot应该有独立专业的职责;满足“高内聚松耦合”原则,Bot之间尽量不要产生耦合,即一个Bot的修改会影响另一个Bot。
2、机器人的命名规范
Bot的命名采用PascalCasing命名方式,即每个单词的首字母大写,例如PrintUtility,Bot的命名尽量简单明了,为了表达执行顺序,名称前缀可以加上编号01_。
被启动执行主流程的Bot,通常叫做MasterBot。只能被其他Bot调用的Bot,可以命名为“Utility” 或“Helper”,例如FileSaveHelper.bot。
3、机器人设计模式
1) 主任务Master Bot,可通过Control Room或API进行调度来启动该流程。
TRY部分中的主要流程步骤可能包括以下内容:
流程的初始化设置
验证配置是否成功(例如,是否存在所有必需的文件夹或文件?是否根据需要填充了初始变量值?)
执行预处理“内容或桌面的清理”
调用Main Bot(主核心机器人)执行流程的业务逻辑
在外部TRY / CATCH块的FINALLY部分中,可以执行后处理“内容或桌面的清理”
例如:
对于任何调用子Bot的“ Run TaskBot”操作,需要指定一个词典来保存子Bot可能返回的任何值。 至少,建议任何子Bot都向其调用的父Bot返回一条消息(例如oStrResult),以指示是否发生任何错误,并在适用的情况下提供错误行号。例如:
2) 主核心任务Main Bot,负责执行和保障业务流程的处理逻辑。一些简单流程也可以直接采用Master Bot来调用子Bot的方式,减少一层的调用。
TRY部分中的主要流程步骤包括以下内容:
验证任何输入(例如,来自MASTER的输入变量值等)
执行子Bot。 执行子Bot后,请验证结果(例如oStrResult,#1代表失败,则运行其他子Bot,#2是否有其他意义?)
验证任何的输出结果
确保根据MAIN的执行情况填充所有“输出”变量值,以返回到MASTER(例如,将值分配给oStrResult)
在CATCH部分中,记录错误,并确保填充所有“输出”变量值(例如oStrResult)以传回MASTER。
例如:
3)子Bot,负责执行某一职责的处理步骤。
根据需要设计这些Bot,以执行自动化所需的实际业务逻辑。将输出变量的结果返回到调用的父机器人(“Main Bot或另一个子Bot),例如oStrResult。 如果处理不成功(发生错误或异常),则该值可能包含错误消息。例如:
4、依赖关系
某个Bot所操作的文件,应上传到控制中心Control Room,在机器人导入或导出过程中,该文件都会作为依赖项进行检查。建议将依赖项文件上传到该流程对应的用例文件夹中,便于使用和管理。
5、设计考虑到重用性和可测试性
在设计每个独立的Bot时,需要考虑这个Bot是可以单独被测试的,而不会影响Bot。如果一个Bot设计为松耦合的,它在执行的时候,则无需为其提供任何输入信息,例如将URL,用户名和密码放入自动化代码中进行测试,然后可以独立测试该任务。这可以使自动化的维护和部署更加容易。
6、使用"步骤"
步骤Step是A2019中一个特性,可以把一组关联的动作组合成一个步骤,来提高代码的可读性。
在代码中自由使用“步骤”操作,将相关动作进行分组显示。步骤应包含动作的标题,并尽量限制在几个字以内。 如果需要更多详细信息,可以利用“注释”信息。步骤的标题有具有意义,避免使用非描述性标题,例如“步骤1”。在每个Bot中,顶层处理步骤可以使用大写字母,子步骤使用大小写混合。 此外,标题可以包含解决方案/技术设计文档中处理步骤的参考编号。 这些步骤不仅提高了可读性,而且有助于确保所开发的Bot与解决方案设计之间的一致性。
7、使用“注释”
机器人的维护是非常花费时间的,良好的注释是提速阅读代码的一种最佳手段。
采用多行的注释,说明一段处理逻辑的描述和定义,例如
采用单行的注释,说明一些假设,问题和逻辑说明,例如
注释需要具有意义,不能写的过于简单,无法让其他人读懂。
在Bot投产前,请务必删除已经禁用的命令。
尝试将注释集中于操作块的原因和作用,而不是操作方法。 尝试帮助读者了解为什么选择某种解决方案或方法以及您要实现的目标。 如果适用,还应提及可能的替代方案。
8、“变量”定义
使用camelCasing的方式来定义变量,即首单词的首字母小写,例如backgroundColor。
避免使用单字符变量名。 例如,切勿使用“ i”或“ x”。 读者应该始终能够查看变量名并了解其用途,例如pStrEmployeeFirstName或pNumSocialSecurityNumber。
除非要定义常量值,否则避免在“创建变量”对话框中初始化变量。 而是在适当的步骤下使用“分配动作”来初始化变量(例如,字符串,数字等)。
变量定义中应定义描述。
可以采用如下的范式来表达变量名称。<type/scope indicator><data type><variable name>
<type/scope indicator>的示例如下:
- p = local variable(本地变量,既不是输入或输出)
- i = input variable(输入)
- o = output variable(输出)
- io = input and output variable(输入输出)
- c = constant(常量)
<data type>的示例如下:
- Str = String
- Num = Number
- Table = Table
- Dict = Dictionary
- List = List
- Date = Date Time
- Bool = Boolean
- File = File
- Rec = Record
- Win = Window
- Any = Any
一些变量命名的示例:
- iStrAuditLogPath – 用于输入的审计日志存储路径的字符串
- oNumReturnValue - 数值类型的返回值
- pRecExcelRow – 本地处理的一个Excel记录行变量
- pBoolFileExists – 本地处理的文件是否存在的标志变量(布尔类型)
- ioStrStatus – 作为输入和输出的表示状态的字符串
- cStrNull – 代表了空值的字符串(通常用于不同变量的比对)
这种标准可以快速找到某个变量,例如
标识性变量,可以用Is, Has, Can, Allows或Supports,例如pBoolIsAvailable, pBoolIsNotAvailable, pBoolHasBeenUpdated。
9、关于“事务”Session
可以将“Session”视为外部文件/数据的引用,例如Excel Basic / Advanced:Open,XML:Start session等,一旦在此类操作中定义了该事务的名称,则后续操作(例如,获取单元格)中访问相同的事务名。 因此,拥有唯一且有意义的事务名称是重要的。
不要使用“默认”Default作为事务名称。 可以使用“变量”代替“会话名称”。
确保在流程处理结束以后,关闭所有打开的事务,以释放对外部数据源的锁定/保持。
10、文件目录设计
通常可以将目录设为,开发,测试和生产三个文件夹,里面包括输入、输出、日志。例如:
可以专门设定一个标识环境的变量,如iStrEnvironment,建立一个GlobalSettings的Bot,初始化这些环境变量。
11、不同动作的准确性和稳定性比较
操作最准确的是Record(记录器-捕捉),AISense,Keystrokes(模拟击键),PDF,Clipboard(剪贴板),Terminal Emulator(终端仿真器),Database(数据库)。
其次准确的是Image Recognition(图像识别),OCR,Wait for Screen Change(等待-屏幕变化)。
最差的是Mouse Clicks(鼠标点击),Mouse Moves(鼠标移动),Mouse Scroll(鼠标滚动),Co-ordinates(坐标)。
12、使用通配符*
当对于选定的窗口和标题,文件名称等,如果出现不确定时,可以采用通配符*来替代。比如打开一个word文档,但是由于word的名称不一定,但是一定以word结尾,所以可以将窗口名称写成“* - word”。
13、Record(记录器-捕捉)的使用
老的AA用户应该了解,Record的使用方式和AAE中Object Cloning是一样的。
如果是网页的抓取,抓取获取回来的属性通常为Name, Class, Type, HTML ID, DOMXPath等,由于A2019的查询机制是下次会按照这些属性查询,那么必须要找那些固定不变的变量,比如DOMXPath,Type,而不建议勾选Path(可能会改变)。
在某个对象Set Text时,由于输入过快可能会大致错误,所以set text需要加适当的delay(延时)。
14、日志记录Logging
日志必须要适合于人的阅读和分析。日志文件有两个接受者,是“人”和“机器”。如果接收者是人,可能是为了调试,分析或寻找错误的开发人员。也可能是分析师,查找审计信息或绩效信息。无论哪种情况,日志都应易于查看和理解,并且可以使用其他工具进行解析或导入Excel。那么就需要日志标准,以确保正确的运行日志记录。
按照Log4j的标准,日志的记录可以大约分为五种不同类型的消息。根据类型,会进入单独的日志文件,日志文件的配置文件在以下的XML文件中有定义。
使用Automation Anywhere中内置的LogToFile(记录到文件)的操作。良好的记录格式是“Start Time stamp执行开始时间戳记”,“Date-Time stamp日期时间戳记”,计算机名称,用户名,任务名称和错误消息内容。 如果允许只包含一个日志文件,则可以在日志记录级别(调试/错误/信息/警告)中显示一列。所有这些值都应以逗号(,)分隔,未来可以使用有效的CSV格式的日志文件,以便于导入或解析。任何可能包含逗号(,)的变量/文本,例如$ Error Details $,都必须使用一对双引号(“”)进行限定,以避免将该值分成CSV文件中的两个单独的列。