V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rekulas
V2EX  ›  程序员

rpa 软件的元素识别是如何实现的

  •  
  •   rekulas ·
    del-xiong · 2024-04-08 14:09:27 +08:00 · 2385 次点击
    这是一个创建于 513 天前的主题,其中的信息可能已经有所发展或是发生改变。

    之前一直以为 rpa 大多是基于图像识别的自动化操作,认为技术含量不会太高适合小白做自动化工作,最近接触测试了几款流行 rpa 软件,才发现自己的思维早就落后了,原来只需要鼠标点点,rpa 就能识别各种软件内部元素(比如指定文字的按钮,特定图标的按钮等等)并进行互动操作,大大刷新了我的认知。

    在感叹的同时,我也很好奇这些软件是如何实现的,众所周知如果一款软件用主流框架( win32 编程 net 编程)开发 gui 识别很简单,但是现在的桌面软件 ui 框架五花八门,光是基于 h5 的就是数款,rpa 是如何做到能识别几乎每一款软件的元素的,如果基于逆向工程的话也能实现,但是逆向需要定向分析,也不是鼠标点点就能搞定的(还是说逆向工程已经进化到这种智能识别的地步了?)

    我怀疑的是 rpa 厂商针对大部分主流 ui 框架做了深入兼容,不过只是个人愚见,不知道有没有做过类似工作的朋友能解释一二。

    另外是否存在开源或低成本的类 rpa 解决方案,毕竟一款 rpa 一年几千上万的价格对个人还是不友好

    6 条回复
    rekulas
        1
    rekulas  
    OP
       2024-04-08 14:15:38 +08:00
    @liedownpls
    @imrockpan

    发现 v2 有几个做 rpa 的朋友 不知道能否解答我的疑问 冒昧 at 一下
    GeneralL
        2
    GeneralL  
       2024-04-08 14:48:27 +08:00
    Windows 桌面应用会使用系统 Win32 API 或者 MSAA 还有 UIA ,系统级别接口无法抓取元素的情况下会辅助使用基于 OCR 的图像识别技术抓取,好像各家都会有自己的 OCR 引擎,但是相比 win GUI 接口抓取,速度会稍微慢一些,以上是作为使用者的感受,不知道有没有厂商开发人员有细节信息。
    imrockpan
        3
    imrockpan  
       2024-04-08 21:28:42 +08:00
    @rekulas 谢邀 (知乎体 🤣) 我的 RPA 是一款浏览器插件哈,它只在浏览器中运行,准确的说是 Browser RPA 或 Web RPA 。因此,它无法识别浏览器之外的 App ,至少目前是这样。

    我就说说我知道哈,在网页里,鼠标点一下,就能识别内部元素,这个并不难。网页都是由 HTML 构建出来的,不管用什么 UI 框架 (React, Vue...),最终,出来的都是标准的 HTML ,所以,这个很好处理。稍微有点难度的是,页面嵌套 (iframe) 和 Shadow DOM 这两种情况,不过都是可解的。如果要做数据提取的话,还有一种情况也比较麻烦,就是自定义字体 (从源码里提取到的是字体编码,只有从视觉上才能看出是什么字),这个就需要先截图,再做 OCR 识别。

    另一个就是事件处理,如:点击元素、滚动页面、输入文字 等,这些事件都比较好模拟。但,键盘事件就不好模拟,它不会触发 native 行为,比如:模拟按下 Ctrl + C ,它并不会真的去复制东西,除非网页程序特意处理了这个事件。这是浏览器的一些安全行为,网页端暂时无解。在插件里,可以申请 debugger 权限来做,不过这个权限会有一个醒目的提示:“xxx” started debugging this browser ,很烦,会让用户觉得插件很危险!考虑到键盘事件很少用到,也可以通过其它方法达到目的,比如,复制 & 粘贴 可以通过 Clipboard API 实现,所以,就做了些取舍,但这已足够了。

    开源的 RPA ,可以看看 UI.Vision RPA 和 Automa ,其它的就不知道了。如果对我的 RPA 感兴趣,也可以来看看热闹哈,它叫:[Tapicker]( https://www.tapicker.com/)
    rekulas
        4
    rekulas  
    OP
       2024-04-09 22:01:53 +08:00
    @imrockpan 多谢回复, 基于网页的自动化我都熟悉, 这 2 个工具也看了下, 不过都是偏向于模拟自动化操作的, 我主要想了解下任意桌面软件的元素定位相关的, 资料不是很多
    rekulas
        5
    rekulas  
    OP
       2024-04-11 11:01:11 +08:00
    这 2 天偶然发现个小工具 accexplorer 能做到类似解析,目前测试能解析原生 flutter electron 等多种软件的元素,感觉跟 rpa 的技术有点像,怀疑可能是类似技术升级而来
    automationIan
        6
    automationIan  
       6 天前
    目前市面上 RPA 产品的桌面识别技术主要是 UIAutomationClient COM 来完成的,当然因为 Windows 的多套 UI 框架问题,UIAutomationClient 在一些老旧的场景无法找到目标元素,这里一般会用 MSAA (Microsoft Active Accessibility) 解析元素结构。
    那这些框架是怎么查询到第三方软件结构的呢?
    以上说的 UIAutomationClient 和 Microsoft Active Accessibility 其实都是代理层,核心还是 Windows UI 渲染知道当前渲染的结构内容,至于怎么知道的,像 WPF 和 Winform 一类基本上是微软对渲染框架做的封装,对于第三方软件,也是 Windows 渲染的结构。再将这些结构发给 UIAutomationClient 做代理,这样就可以从 UIAutomationClient 拿到第三方元素结构信息 (对于渲染这块 理解不深,大概是这个意思)。
    可以参考的软件有 inspect.exe ,它包含 UIA 和 MSAA 两种框架 ,

    当然 这是较为普遍的自动化方式,针对 WPF 和 WinForm 还有 注入内存的方式。

    其他客户端 比如 Java ,使用 Java Access Bridge ,是通过 Windwos 将结构代理到 Java Access Bridge 上,当然 也可以注入目标软件的 JVM 获取元素结构

    SAP 有自己独立的自动化框架可以使用

    QT 也是能用 UIAutomationClient 代理就用,不能用 也是注入内存的方式获取结构

    以上基本涵盖大部分的 桌面客户端的 技术方向
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1154 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 17:58 · PVG 01:58 · LAX 10:58 · JFK 13:58
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.