达观动态

达观愿与业内同行分享 助力各企业在大数据浪潮来临之际一起破浪前行

RPA界面元素定位与操控技术详解-达观数据

RPA 入门介绍

什么是 RPA?RPA 是机器人流程自动化 Robotic Process Automation 的简写。在《智能RPA实战》中,我们这样定义:通过特定的、可模拟人类在计算机界面上进行操作的技术,按照规则自动执行相应的流程任务,代替或辅助人类完成相关的计算机操作。一句话总结就是:用软件机器人自动化之前由人完成的任务。

那么什么是 IPA 呢?IPA (Intelligent Process Automation) = RPA+AI。简单来说就是使用 AI 来强化 RPA 的各项能力。比如:加强 RPA 的界面元素识别能力、赋能 RPA 来完成 RPA 任务执行过程中的智能决策等。我们通常把 RPA 比作抓手、AI 比作大脑。AI 负责思考,RPA 负责行动。RPA 是一个数字化平台,可以调用计算机所有软硬件能力。AI 可以作为其中一个智能组件存在,被 RPA 调用。AI 也可以作为 RPA 的一部分进行赋能,比如智能化机器人调度逻辑。

目前,主要有 CV 和 NLP 两个领域的 AI 技术在 RPA 中应用比较广泛。

 

1. 计算机视觉

CV (Computer Vision) 计算机视觉是一个专门研究如何从数字图像中提取有用信息的领域。在 RPA 中,常见的 CV 技术有模板匹配、光学字符识别、目标检测等:

  • Template Matching 模板匹配:模板匹配是大图中定位小图(模板)的算法。比如在桌面中定位一个图标的位置、寻找窗体中的一个按钮等。
  • OCR (Optical Character Recognition) 光学字符识别:通过输入一张图像,OCR 模型分析处理后,输出图像上的结构化字符信息(字符的坐标、字符的具体值)。比如验证码识别、提取发票上的信息等。
  • OD (Object Detection) 目标检测:通过给计算机输入一张图像,让计算机分析出其中的物体。比如分析一个应用窗体内的所有控件(按钮、编辑框等)来进行后续的 RPA 操作。

2. 自然语言处理

NLP (Natural Language Processing) 自然语言处理是一个专门研究如何从文本中提取有用信息的领域。在 RPA 中,常见的场景有:

  • IDP (Intelligent Document Processing) 智能文档处理:比如合同文档自动解析:自动化处理大量合同文档、快速应对审阅、查找、校对等工作。文件信息分析提取:对企业招投标文件、内部文档资料等长篇幅文件进行解析。HR人岗精准匹配:对简历进行关键信息提取构建人才画像,匹配精准岗位。
  • 文本审核:黄反审核,识别文本中色情等低俗信息;识别宗教、枪支等反动信息。涉政识别,识别文本中涉政等敏感信息。广告过滤,识别和拦截广告信息,并对用户发言进行识别和分析。垃圾检测,识别文本中骂人、刷帖等垃圾信息。

 

3. 应用价值

RPA 应用价值主要体现在下面几个方面:

  • 提升企业效率:时间上,人类选手 5 x 8h = 40h。机器选手 7 x 24h = 168h 是人类的 4.2 倍!毕竟 RPA 机器人一天有 3 个工作日,上一天班加两天班…速度上,业务系统响应有多快,RPA 就能执行有多快。并且不会因为工作时间延长而出现疲劳或准确率降低等问题。
  • 降低人工风险:人类擅长抽象、推理。机器擅长重复。人类在疲倦、外界干扰、主观情感波动时,容易产生误操作、误判。RPA 机器人擅长不断地重复执行特定的工作。
  • 打通业务系统:不需要改造原有系统、不需要开发接口或 SDK 来实现对接。也就是大家所听到的“非侵入式”。典型应用就是:完成孤立应用间的数据转移。

 

4. 发展历程

RPA 发展历程大概可以概括为以下几个阶段:

  • 有人值守阶段:在这个阶段 RPA 以“虚拟助手”的身份出现,几乎涵盖了机器人自动化的主要功能、以及现有桌面自动化软件的全部操作。部署在员工PC机上,用于提高工作效率。缺点是难以实现端到端的自动化,做不到成规模应用。不过已能够有效减少业务平均处理时间,可有效改善客户体验并节省成本。
  • 无人值守阶段:在这个阶段 RPA 被称为“虚拟劳动力”,主要目标即实现端到端的自动化,以及虚拟员工分级。主要部署在VMS虚拟机上,能够编排工作内容,集中化管理机器人、分析机器人的表现等。缺点是对于 RPA 软件机器人的工作仍然需要人工的控制和管理。无人值守 RPA 机器人可以全天候工作 24 * 7,并用业务流程代替了人机交互,释放了更大的增效降本可能性。
  • 自主性 RPA 阶段:在这个阶段,RPA 的主要目标是实现端到端的自动化和成规模多功能虚拟劳动力。通常部署在云服务器和 SaaS 上,特点是实现自动分级、动态负载平衡、情景感知、高级分析和工作流。缺点是处理非结构化数据仍较为困难。但更多技术的融合,使得自主性 RPA 可从根本上提升业务价值并为用户带来更多优势。
  • 认知性 RPA 阶段:这个阶段将是未来RPA发展的方向。开始运用人工智能、机器学习以及自然语言处理等技术,以实现非结构化数据的处理、预测和分析、自动接受任务处理等。借助认知能力,决策过程全都由机器人执行,从而可以将所有漫长而复杂的任务自动化。

RPA 的核心模块 

1. 开发平台

达观 RPA 开发平台

开发平台是流程设计者设计流程的工具。主要有以下功能:

  • 流程设计:当我们有一个想法,我们想使它变为可自定执行的流程,我们就需要用它来设计一个流程。可视化编程界面、低代码编程,提供拖拉拽方式进行业务逻辑的设计。必须要有设计复杂流程的能力,如流程、子流程、第三方库、自定义组件等功能。也必须要有“封装”能力,从小流程封装为大流程。以及提供”复用“的概念,避免重复造轮子。另外还有几个流程设计过程中的必备工具:
  1. 元素分析器:界面上,我们肉眼看到的一个个按钮、编辑框等,在 RPA 的世界里都是一个个“元素”。很多可视化组件都是以一个元素作为输入参数,执行相应的动作,比如“点击按钮”、“在编辑框内输入文本”等。通过元素分析器,我们可以很方便地在屏幕上选择一个目标元素。有了元素分析器,流程设计者不必拥有过多的底层界面元素技术知识即可识别、定位元素,指哪儿就是哪儿。
  2. 元素录制器:顾名思义,通过录制一段用户的操作,自动地生成一堆可视化组件。在环境干扰比较小的时候,往往很有用。再结合调试进行微调,往往可以较快设计出一个流程原型。
  3. 数据抓取:这是一个特别有意思的功能,可以抓取屏幕上的结构化信息:任何看起来像列表、表格、树的数据都应支持被抓取。
  4. 智能组件包:也就是部分通过 AI 赋能的可视化组件,通过简单拖拽方式,可以完成像下面的一些功能:
  1. 图片抽取信息:身份证抽取、发票抽取、营业执照抽取、银行卡抽取、火车票抽取等。
  2. 文档抽取信息:采购类合同、银行业零售贷款合同、民事判决、债券募集说明书等。
  3. 文档智能分析:文本分类、文本审核、文本摘要、标签提取、观点提取、情感分析等。
  • 流程调试:流程开发过程中,我们可能需要实时进行调试来发现流程中存在的问题。比如随机断点、单步调试、单步进入、单步跳出、查看当前状态(如变量)等信息。利用调试功能,我们可以很方便地停留在流程的任一步骤,检查当前的上下文状态,以便调整、优化流程。
  • 版本管理:流程开发好以后,我们需要发布到控制台。这个过程也就是“发版”。成熟的 RPA 产品应当有完善的版本化支持,可以为当前流程发布特定的版本。也应支持回滚到历史任意版本。当然,也应该允许多个流程设计者同时修改同一个流程。
  • 画中画:主要目的是提供环境隔离。通过提供一层虚拟会话,将机器人的运行和当前宿主机隔离开。让机器人在执行的同时,业务老师也能正常使用电脑,互不干扰。
  • 代码支持:也是专家模式,直接调用底层 API、Block API 等。提供了任意复杂度的扩展,允许有编程能力的流程设计同学进行 RPA 的能力扩展。

 

2. 控制中心

达观 RPA 控制中心

控制中心是 RPA 机器人的大脑,所有的任务都从这里下发,也可以说是 RPA 机器人的中央处理单元。主要有以下功能:

  • 流程管理:对已发布的可视化流程进行管理,也可以进行导入导出、查看特定流程版本等。
  • 机器人管理:管理 RPA 机器人。包含审核机器人上线、启用禁用机器人、是否共享机器人等功能。也可以通过远程桌面技术,直接查看机器人桌面。
  • 任务管理:任务是机器人运行流程的模板(static、静态),通过选择特定的流程、配置特定的参数,可以创建一个任务。任务创建好以后,控制中心会根据任务的调度信息对 RPA 机器人进行调度。
  • 作业管理:当任务开始运行,则会产生“作业”(runtime、动态)。包含机器人的运行时的各种各样的信息。比如运行日志、运行状态等。
  • 数据资产:简单理解就是云端的安全数据库,在权限满足的情况下,流程可以增删查改指定的数据。同时也有安全字段的概念,比如当一个字段为“加密”类型时,我们不应该能够在开发平台直接打印出它的值。
  • 权限管理:基于角色的权限管理模型。可以对不同的账号赋予不同的角色,对不同的角色赋予不同的功能。
  • 租户管理:多租户是一种单个软件实例可以为多个不同用户组提供服务的软件架构。SaaS 就是一种多租户架构。不同租户间数据完全隔离。
  • 运维管理:管理 RPA 服务器本身。可以对服务器进行资源监控、系统运行监控等。
  • 报表分析:控制中心提供了关于机器人所有的数据,我们可以通过这些数据来进行各种统计分析。比如,分析某个流程的执行成功率、某个机器人的执行效率等。
  • 日志审计:每一次操作,都应留痕。应包含 RPA 机器人的相关日志、也包含用户操作的相关日志。

 

3. 机器人

RPA 机器人:简单来说就是执行控制中心下发过来的任务。RPA 的执行器!

RPA 元素分析器

两个概念需要理解:用户界面树、元素选择器。

  • 用户界面树:用户界面的抽象数据结构呈现,包含静态数据和动态数据。树上的每个节点都是用户界面上的一个元素。针对每个元素,我们可以对它进行属性查看、操作测试。
  • 元素选择器:用于在用户界面树上定位某个或某组元素的方式。可以精准定位某个元素,比如找一个标题为 X 的窗体;也可以模糊定位某个元素,找一个按钮名称以 X 开头的元素。

那么为什么需要元素分析器呢?原因在于 UI 框架技术太多了!每种技术,所需要适配的方式都不同。比如,想要自动化 Web,我们需要理解 Web 的自动化技术;想要自动化 Java 程序,我们需要理解 Java 的自动化技术;想要自动化 SAP 程序,我们需要理解 SAP 自动化引擎技术。这个 UI 框架的适配应该交给 RPA 厂商来完成。我们需要一种统一、简单的方式来自动化我们所看到的一切 UI 元素。流程设计者只需要了解:哦!这里有一个按钮,我需要点击它!

从定位方式来看元素分析器的发展历程:

  • 绝对坐标定位:自动喝药辅助外挂。监控屏幕上特定坐标点的颜色变化,当血槽颜色变为灰色时,就喝一瓶金疮药(按下使用金疮药道具的按键)

    图像识别示意图1

  • 图像识别:在大图中找小图。循环监控屏幕上是否出现了“地鼠”,出现了以后,则操作鼠标点击目标位置。

图像识别示意图2

  • 选择器定位:DOM (Document Object Model) 文档对象模型,把整个 UI 界面抽象成一个“树”数据结构,使用 XPath、CSS Selector 等语法来定位。我们可以把选择器写得很“精确”,也可以把选择器写得很“模糊”。

               选择器定位 DOM 树示意图

  • 智能定位:使用 AI 赋能 RPA。比如使用目标检测相关算法来进行定位。

目标检测示意图RPA 最核心的两个任务:元素的定位和元素的操控

元素的定位:

  1. 基于屏幕坐标点(HitTest):主要是元素分析器的捕获功能,可以让流程设计者便捷地选择一个目标元素。
  2. 基于选择器:通过简单的选择器语法,选择 DOM 上的某个或某组元素。主要是流程运行过程中,为了在运行的环境中找到目标元素。
  3. 基于 CV:通过模板匹配或相关 AI 算法来定位目标元素。当业务程序不支持捕获时,它很有用!

元素的操作:

  1. 基于方法 AT (Assistive Technology):当业务程序支持 AT 时,我们可以直接调用 AT 方法来进行操作。比如调用一个按钮的点击功能、设置文本框的内容等。大部分业务程序都支持了 AT 方法!
  2. 基于消息:在 Windows 上,窗体之间可以通过消息来进行通讯。我们可以利用 Window Message 来操控元素。
  3. 基于键鼠模拟:在获取到目标元素后,如果目标元素不支持任何 AT 或消息,我们还可以简单粗暴地利用键鼠模拟来操作。这也是最模拟人工的一种方式,在所有场景都可以用,毕竟人也是通过这种方式来和计算机进行交互的。键鼠模拟本质上也是基于 Windows 消息的。

自动化技术可以按照是否有 GUI 来进行分类。RPA 同时支持两种自动化,对带 GUI 或 不带 GUI 的业务程序都是支持的。

  • 非 GUI 自动化编写简单:测试代码相对容易编写,调试容易。运行稳定,不容易受到环境变化影响。易于维护,不需要经常更新测试代码。运行效率高,相对于 GUI 自动化,非 GUI 自动化非常快。
  • GUI 自动化主要是覆盖范围广:大多遵循 UI 框架底层 Accessibility 规范。非侵入式,不需要业务应用的源代码或 SDK 接入。(其实本质上是被侵入了……在 UI 框架层!)最大程度模拟用户操作,用户怎么操作就怎么模拟。
  • 有一些造成 GUI 自动化不稳定的因素:
  1. 随机弹窗:当自动化脚本发现控件无法正常定位,或无法操作时,GUI 自动化框架自动进入“异常场景恢复模式”。在“异常场景恢复模式”下,GUI 自动化框架依次检测各种可能出现的对话框,一旦确认了对话框的类型,立即执行预定义的操作(比如:点击“确定”按钮),接着重试刚失败的步骤。
  2. 控件属性变化:绝对匹配比较精准,但”模糊匹配“弹性更大,可以提升控件的识别率。往往流程设计过程中需要权衡目标元素以及相邻层级之前的属性使用。
  3. 被测系统的 A/B 测试:开发流程时见到的界面和运行时见到的界面并不相同。需要在测试用例脚本中做分支处理,正确识别出不同的分支。
  4. 还有一些随机的页面延迟造成控件识别失败:引入重试机制,可以是步骤级别、页面级别、业务流程级别。

元素分析器的幕后技术

1. Win32 API

微软的 Windows 操作系统底层 API。优点就是看起来很高深、很强大、很底层,对标准 Windows 的控件支持还不错。缺点是很复杂,开发效率低下。不支持自定义控件。

  • 窗体识别:需要通过 FindWindow 和 EnumWindows 来查找到窗口句柄,然后再调用其它 API GetWindowText,GetWindowRect, GetWindowLong 等来获取窗口属性,以此来找到想要的控件或窗口。
  • 操控和获取属性:通过 SetWindowText 和 GetWindowText 来操作控件上显示的文字,通过SetForegroundWindow 设置顶层窗口,GetForegroundWindow 获取当前的顶层窗口,类似的还有 GetActiveWindow 和 SetActiveWindow。从理论上来说,通过 Windows API 和 Windows Message 可以完成对大部分控件或窗口的操作,也可以获取部分控件的部分属性。

2. MSAA 

MSAA(Microsoft Active Accessibility) 是一项提升 Windows 辅助控制能力的技术。MSAA 天生就不是设计给自动化测试的,它存在的意义在于提供一套接口,让开发人员可以方便的给残疾人开发可以使用的软件,比如屏幕阅读程序(鼠标移动到按钮的时候,可以发出声音,辅助视力障碍的人操作电脑),从而实现微软将电脑普及到每一个家庭的梦想。MSAA 主要是基于 COM 的技术。通过 IAccessible 来表示 UI 界面元素的信息。提供了如 AccessibleObjectFromWindow 等 API 来获取它。MSAA 可以查询元素信息,比如特定位置的元素信息。注册事件,当元素信息改变时得到通知。比如当按钮 disable 了或字符串变化。操作界面元素,比如按钮、下拉框、菜单等。

  1. 优点:比起 Windows API 来说,用户只需要跟 IAccessible 打交道,通过这个接口能获得的控件信息相对丰富很多,基本操作也不需要通过 Windows Message 的方式来实现。另外一个比较大的优点就是,自定义控件的支持,当然了,并不是说开发写一个自定义控件,这个控件就可以通过 MSAA 来识别,而是说当开发人员在实现自定义控件的时候,可以实现 IAccessible 的接口,并且通过这个接口,把一些的属性和操作暴露出来,测试人员就可以将这个控件当作标准控件,并通过MSAA来自动化。看起来麻烦了点,但是最起码对自动化自定义控件提供了可能。
  2. 缺点:天生不足,MSAA 从来就不是给自动化测试设计的,所以也不会考虑自动化测试的需求,获取到的控件信息比 Windows API 多,但是相对自动化测试的需求来说还是远远不够,而且仅仅支持一个基本操作,其它的操作还必须通过 Windows Message。另外就是微软推出 WPF 以后,MSAA 的局限性越加明显(这也是因为 WPF 的控件属性更加丰富、更具定制性、更自由,用 MSAA 难以描述),这也是微软推出 UIAutomation 的一个的原因。

它是如何工作的:提供信息的应用称为 Server;负责处理事件通知 NotifyWinEvent;获取元素信息 WM_GETOBJECT。Server 通过 IAccessible 来返回元素信息。Client 可以通过 AccessibleObjectFromWindow、AccessibleObjectFromPoint、AccessibleObjectFromEvent、accNavigate、get_accParent 来获得 IAccessible。

3. UIA 用户界面自动化

UIA 是微软新一代的 Accessibility 框架,在所有支持 WPF 的操作系统上都支。UIA 提供了大多数 UI 元素可编程访问的能力。它抽象了大部分 UI 框架的共有属性,比如 WPF 按钮的 Content 属性、Win32 按钮的 Caption 属性、HTML 图像的 ALT 属性,都被映射成 UIA 的 Name 属性。另外,UIA 也兼容 MSAA。从架构上来讲,UIA 在针对标准控件的时候,通过 UI Automation Proxy 调用了 MSAA Server,基本上覆盖了 MSAA 的功能。

4. JAB

JAB (Java Access Bridge)主要是为 Java 应用提供元素信息的框架。主要服务于屏幕阅读器或其它辅助控制程序。利用 JAB 我们可以访问到 Oracle 系列应用、金蝶、用友等厂商开发的业务程序。

5. SAP

SAP 提供了 Scripting Engine 来进行用户界面自动化。SAP Scripting Engine 是一套基于 COM 的接口,提供了 SAP 全面的脚本化支持。需要在 RZ11 transaction 下,将 sapgui/user_scripting 参数设置为 TRUE。

6. Citrix Virtual Channel

Citrix 提供了 Virtual Channel 的机制来满足 Client 和 Server 之间的通讯需求。利用 Virtual Channel,我们可以向 Citrix 虚拟桌面发送任意指令、获取业务所需信息。Citrix 是基于 ICA (Independent Computing Architecture) 协议来实现的。

Citrix Virtual Channel

7. RDP Virtual Channel

RDP (Remote Desktop Protocol) 是微软开发的一套远程桌面协议。RDP 也提供了 Virtual Channel 机制来满足 Client 和 Server 之间的通讯需求。

RDP Virtual Channel

8. 浏览器控制

  • Selenium:开源的浏览器控制框架,支持大多数浏览器。市面上大多的网页爬虫程序都是用 Selenium 来实现的。另外 Selenium 对编程语言非常友好,支持绝大多数编程序言的接入。但……Selenium 太有名了,很多业务网站针对 Selenium 做了很多反自动化的操作,导致 Selenium 操作网页时,会出现诸如验证码、随机校验窗体等验证过程。另外 Selenium 对 IE 支持得不太好。
  • IE自动化:MSHTML/Trident – IWebBrowser2 接口。IE 浏览器使用的是 Trident 浏览器引擎,是 IE4 在 1997 年发布的。通过提供 IWebBrowser 接口来进行自动化操控。Windows 10 上的 IE11 已在 2022-06-15 号停止维护。
  • Chrome Extension:Chrome 浏览器插件是允许开发者自定义用户使用体验的一种技术。可以利用 Web 技术,如 HTML、CSS、JavaScript 来自定义浏览体验。
  • CDP (Chrome Devtools Protocol):DevTools 协议是 Chrome、Chromium,或任何基于 Blink 引擎的浏览器都支持的一种通讯协议。该协议可以对浏览器进行检查、调试、监控等。Blink 是 Chromium 的渲染引擎。

9. 办公自动化

Microsoft Office 自动化主要是通过 COM 技术的 IDispatch 接口来实现。通过 IDispatch,我们可以用任意支持 COM 调用的语言进行自动化,比如 Python、VBS 等。