界面元素
我们在[简介][简介]一章中曾提到,RPA的一大特色是“无侵入”,也就是说,虽然RPA是配合其他软件一起工作的,但并不需要其他软件提供接口。而是直接针对其他软件的操作界面,模拟人的阅读和操作。但是,
一般的软件界面上都会有多个输入框、按钮,计算机怎么知道我们到底要操作什么地方呢?本章所述的“界面元素”将解决这个问题。
什么是界面元素
如果您之前了解什么是“控件”,对不起,请先暂时忘掉这个概念。因为“控件”和“界面元素”有共同点,但又不完全一样,一定要尽量避免概念混淆。
除了IT专家之外,一般人在使用计算机的时候,都是在和操作系统的图形界面打交道。无论是常用的Windows或Mac OS X,还是非IT人士不太常用的Linux,都有一套自己的图形界面。随着Web浏览器的大行其道,也有越来越多的图形界面选择在浏览器上展现。这些图形界面各有各的特色,但当我们用鼠标点击的时候,其实鼠标下面都是一个小的图形部件,我们把这些图形部件称为“界面元素”。
比如,下图是一个普通的Windows窗口,也是典型的图形用户界面。在这个窗口中,有哪些界面元素呢?
首先,上面的菜单栏里面的各个选项,如“文件”、“主页”、“共享”、“查看”都是独立的界面元素。菜单栏里面的图标和下面的文字,如“复制”、“粘贴”等都是独立的界面元素,左边的导航栏里面的“快速访问”、“桌面”、“下载”等都是独立的界面元素;当然,窗口主要区域(红框包含的范围)里面显示的每个文件也都是独立的界面元素。
界面元素之间还有嵌套的组合关系。比如,红框包含的范围是一个大的界面元素,里面的每个文件又是独立的界面元素。
在UiBot中,界面元素的作用,就是作为“有目标”的命令中的目标使用。
[前文][可视化视图]中提到,UiBot在命令区已经放置了很多作为“预制件”使用的命令。其中,最常用的是如图所示的几类:
其中,“界面元素”和“文本”类别下面的所有命令,都是有目标的;“鼠标”和“键盘”下面的包含“目标”两个字的命令,也都是有目标的。如下图红框所示。
所谓有目标的命令,就是在命令中指定了一个界面元素。在运行的时候,会先查找这个界面元素是否存在。如果存在,则操作会针对这个界面元素进行。比如界面元素是一个按钮,那么命令“点击目标”就是点击这个界面元素。如果不存在,则会反复查找,直到超过指定的时间(也称为“超时”。超时时间可以在“属性”中设置),会输出一个出错信息,流程也会直接停止运行。
相反,对于无目标的命令,在命令中就不需要指定界面元素了。比如“模拟点击”命令是没有目标的,在运行的时候,鼠标当前在什么位置,就点击什么位置;再比如“模拟按键”命令也是没有目标的,在运行的时候,键盘的输入焦点在什么位置,就在什么位置模拟一个按键操作。
显然,在用UiBot的时候,应该优先使用有目标的命令,因为有目标的命令会准确很多。只有当找不到目标的时候,才退而求其次,使用无目标的命令。
所以,在用UiBot的时候,如何选取一个目标是很关键的。只要准确的选到了目标,模拟操作相对来说就比较简单了。下面介绍选取目标的方法。
目标选取
UiBot提供了一种全自动的选取目标的方式,我们以“鼠标”类别中的“点击目标”命令为例来说明。
假设我们要做一个最简单的流程,只有一个步骤:点击Windows的开始菜单按钮(默认位置在左下角)。首先,新建一个流程,然后,打开其中唯一的流程块,接着,在“可视化”视图中找到“点击目标”命令,用拖动或者双击的方式将其插入组装区。以上步骤您应该已经很熟悉了,如果还不熟悉,请回过头去阅读[基本概念][基本概念]这一章。
在组装区中,现在已经有一条命令了。我们会注意到,这条命令上有一个按钮,文字是“选择目标”,还有一个瞄准器样子的图标。如下图所示:
点击这个按钮,UiBot的界面暂时隐藏起来了,出现了一个红边蓝底的半透明遮罩,我们称之为“目标选择器”。鼠标移动到什么地方,这个目标选择器就出现在什么地方,直到我们单击鼠标左键,目标选择器消失,UiBot的界面重新出现。在按下的时候,目标选择器所遮住的界面元素,就是我们选择的目标。
前文提到,界面元素可能是嵌套的,鼠标所在的位置,可能已经落到了多个界面元素的范围之内。此时,目标选择器会自动选择您最有可能需要的界面元素,并将其遮住。所以,在按下鼠标之前,请先耐心移动鼠标,直到目标选择器不多不少的恰好遮住了您要操作的界面元素为止。
我们可以试一下,用目标选择器遮住开始菜单按钮,注意是恰好遮住,不多不少。当遮罩变成了下图所示的状态时,再单击左键完成选择。当然,下图是在Windows 10操作系统中的样子,对于其他版本的Windows操作系统,样子可能会有区别,但原理不变。
一旦选中之后,UiBot的界面重新出现,刚才按下的“选择目标”按钮也变成了目标界面元素的缩略图,这个缩略图仅供参考,帮助您记得刚才选中的是哪个目标,而不会对流程的运行有任何的影响。而且,这个缩略图实际上还是一个按钮,按下去以后,作用和刚才的“选择目标”一模一样。如果前面选择的目标不合适,或者不小心选错了,按这个按钮重来一次就好。
对于有目标的命令,我们稍微留意一下,就会发现在命令的属性中,有一条属性被称为“目标”。当我们还没有选择目标的时候,这个属性的值是一对花括号 {}
,如下图左(此时实际上没有选择目标,所以如果运行的话,是一定会出错的)。而当我们选择了目标以后,这个属性的值会比较长,但仍然是被一对花括号所包围起来的,如下图右。
不妨把这个长长的值粘贴到这里,它完整的样子其实是:
{"wnd":[{"app":"explorer","cls":"Shell_TrayWnd"},{"cls":"Start","title":"开始"}]}
当我们在[后文][语言参考]中学习完UiBot的编程语言BotScript以后,就会知道这一长串内容实际上是BotScript中的一个“字典”数据类型。当然,现在并不需要掌握这些细节,只要知道这是一段特殊的数据即可。UiBot在运行流程的时候,根据这段数据,就可以寻找我们指定的界面元素了。
如果您有过Windows的应用开发经验(如果没有,也没关系,这一段可以跳过去,不影响后续阅读),就会知道Windows上的应用程序实际上有很多开发框架,包括SDK、MFC、WTL、WinForm、WPF、QT、Java等等,如果再算上运行在IE和Chrome浏览器中的Web应用,类型就更多了。这些应用程序其实都提供了界面元素的查找、操作接口,从技术上来说,UiBot无非就是调用这些接口而已。但是,这些接口的调用方法各不相同,甚至差异很大,即使是IT专家,也很难在短时间内对所有这些接口都驾轻就熟,更不用说一般用户了。
但如果用UiBot,它们都是一样的“界面元素”,对它们进行查找和操作没有任何差异。比如,MFC程序中可能有一个按钮,Chrome浏览器中可能也有一个按钮,看起来都是按钮,但对这两个按钮分别模拟点击,技术上的差异几乎可以说是天壤之别。而在UiBot中,您完全无需关心这些区别,UiBot已经把这些差异帮我们抹平了。从而实现了“强大”、“简单”、“快捷”三个指标的统一及平衡。
目标编辑
在上一节中,我们看到UiBot的目标选择器是自动工作的。只要我们把鼠标移动到希望作为目标的界面元素上,遮罩会恰好遮住这个界面元素,并且会生成一段数据,UiBot在运行的时候,用这段数据即可找到目标。
当然,凡是自动工作,都难免会出错。在使用目标选择器的时候,常见的问题是:
- 无论如何移动鼠标,都无法使遮罩恰好遮住要作为目标的界面元素(通常是遮罩太大,遮住了整个窗口)
- 遮罩可以恰好遮住界面元素,但用生成的数据查找目标时,发生了:
- 错选:能找到界面元素,但找到的界面元素不是我们当初选取的
- 漏选:我们当初选取的界面元素明明存在,却找不到了
对于第一种情况,也就是无法遮住目标的情况,我们会在后面用比较多的篇幅详细叙述。这里主要讨论的是第二种情况,也就是明明可以遮住目标,但在运行的时候,却发生错选或漏选的情况。
我们在上一节中提到,当选取目标时,UiBot会生成类似于这样的一串数据,用来描述目标:
{"wnd":[{"app":"explorer","cls":"Shell_TrayWnd"},{"cls":"Start","title":"开始"}]}
UiBot在运行流程的时候,就是根据这串数据中的描述,来查找目标的。所以,当发生错选或者漏选的时候,实际上就是这串数据出现了问题,需要对它进行修改。
如何修改呢?我们首先在“属性”栏,找到“目标”属性,这串数据就显示在后面的输入框里。既然是输入框,理论上可以直接编辑其内容,但输入框太小,编辑起来非常困难。需要修改目标的时候,推荐按输入框右边的按钮,如图中红框所示:
按下这个按钮,会弹出一个“目标编辑器”的窗口。上半部分是缩略图,表示作为目标的界面元素的大致样子,UiBot在查找目标的时候,并不会使用这张图片,仅仅是让您查阅参考的。下半部分是“控件筛选器”,把描述目标的那串数据用一个树形结构重新展示出来了,如图所示:
实际上,这个树形结构里面,保存的是界面元素的某些特征,每一项都是一个特征,这些特征是UiBot自动选取的,只有当这些特征全部满足的时候,才会认为找到了界面元素。而且,由于界面元素是相互嵌套的,UiBot不仅会记录作为目标的界面元素的特征,还会保存它的上面若干级的界面元素的特征。每一级的特征都必须全部满足才行。
以上图中Windows的开始菜单按钮为例,其中0: Object
那一行及其下面的内容,代表的是开始菜单按钮的上一级界面元素(实际上是Windows任务栏)的特征,而1: Object
那一行及其下面的内容,代表的才是开始菜单按钮本身的特征。在流程运行的时候,UiBot会逐级查找,首先找到第一级的Windows任务栏,然后再在任务栏里面,找所有特征全部满足的开始菜单按钮。
这样严格的特征匹配,显然很容易造成“漏选”。比如,我们可以看到,Windows为开始菜单按钮设定了一个“标题”,也就是title那一行,其内容是“开始”(这个标题通常不会让用户看到,但却是实际存在的)。UiBot会把这个标题作为特征的一部分,因为一般来说,按钮的标题是不会变的。但是,如果有一天,这个按钮的标题发生了变化,就造成了漏选。
那么,该怎么修改呢?我们看到,在title前面有一个勾选框,默认是处于已勾选状态的。只需要点一下这个勾选框,将其置为未勾选的状态,UiBot在找界面元素的时候,就不会再使用这个特征,即使标题发生了变化,也能找到。
但是,如果去掉了太多的特征,漏选是不太容易发生了,却会发生错选。举个极端一些的例子:如果把cls: "Start"
和title: "开始"
这两行全都取消勾选,显然,0: Object
所代表的Windows任务栏下面的任何一个界面元素,就都可以满足条件了,这就造成了错选。
所以,如果界面元素比较复杂,或者特征经常发生变化,如何准确的编辑目标,既不发生错选也不发生漏选,还是需要一定技巧的。很遗憾,这方面并没有特定的规则,只能多多尝试,积累经验。下面有几条公共的经验,请读者先记住,然后再在实践中总结自己的经验。
- 有的特征名称您可能暂时不理解,比如
cls、aaname
等,可以暂时不管它们; - 善用通配符
*
,这个通配符代表“匹配任意内容”。比如有一个界面元素,其title
特征的值是“姓名:张三”,后面的“张三”可能会变,但前面的“姓名:”不变。所以,可以用title: "姓名:*"
来作为特征,而不是把这条特征去掉; - 去掉特征的时候要慎重。因为去掉特征虽然可以减少漏选,但会增加错选。在流程运行的时候,漏选一般比较容易发现,但错选未必能马上发现。
关于最后一条,值得特别说明一下:UiBot在运行一个流程的时候,大多数的“有目标”命令在找不到目标的时候,都会抛出一个异常(除非是“判断目标是否存在”这样的命令),流程会马上停下来,并且报错(除非您使用了Try...Catch来捕获异常,具体用法请参考[后文][语言参考])。所以比较容易发现。而当发生错选的时候,UiBot并不知道,还会继续往下运行,错误就不太容易发现了。
最后,需要提醒的是:同样的界面元素,在不同的操作系统、不同的浏览器上,可能特征也会发生变化。特别是IE和Chrome浏览器,在显示同一个页面的时候,同样的界面元素可能会有完全不同的特征,而且,对于IE,还会把版本号作为一条特征。如下图所示,同样用IE和Chrome打开百度的首页,并且把百度的搜索框作为目标来选取,其特征具有较大的差异。
所以,在用UiBot制作流程,并且在别人的计算机上使用的时候,请尽量保持开发环境和生产环境的一致性,以减少不必要的错误。
进阶:目标选取之前的设置
在用遮罩选取目标的时候,很常见的一种情况是:遮罩无论如何只能遮住整个窗口,或窗口的客户区,而无法选取里面的具体界面元素。如下图,只能选中Chrome浏览器的整个页面,不能选取里面的输入框和按钮。
对于这种情况,有两种可能性,一种是界面真的无法选取(我们会在[下一章][无目标命令]详细讨论),另一种是界面其实可以选取,但没有正确的设置。哪些界面需要设置才能正常选取呢?下面做一个总结。
Chrome浏览器
Chrome浏览器需要安装扩展程序,并启用了扩展程序,才能正常选取。请留意您的Chrome浏览器地址栏右边的一排小图标,要有如下图所示的这个图标(颜色可能是灰色,但不影响正常工作)才行,鼠标移动上去,还有文字提示“UiBot Native Message Plugin”。
如果没有安装扩展程序,则需要遵循以下步骤进行安装:
- 关闭Chrome浏览器;
- 打开UiBot Creator,随便选择一个流程。在菜单中选择“帮助”->"安装Chrome扩展";
- 打开Chrome浏览器,稍等片刻,浏览器会提示已添加新的扩展,如下图。此时请务必选择“启用扩展程序”;
- 如果仍然有问题,请按照下图所示,打开Chrome的扩展程序管理功能,并启用UiBot Native Message Plugin。
除了IE、Chrome浏览器之外,我们还经常用到百度浏览器、360安全浏览器、QQ浏览器等国产浏览器。这些浏览器都采用了Chrome内核或IE内核,理论上UiBot也可以支持获取其中的界面元素。但是,由于其设置方式各不相同,还经常发生变化,为了简单起见,推荐大家在RPA流程中还是使用原生的Chrome浏览器或IE浏览器。
跨域网页
有时候,在一个网页当中,会通过引用的方式,或者iframe嵌套的方式,在其中内嵌一个其他域名下的网页。对于这种情况,我们称为“跨域网页”。在这种情况下,出于安全的考虑,不同的浏览器会有不同的策略。我们来实际体验一下:
打开Chrome浏览器,浏览http://mail.qq.com
,即QQ邮箱页面,切换到QQ登录,然后按F12键,打开Chrome的开发者模式,按Ctrl+Shfit+C
组合键,进入Chrome的元素查看功能,并将鼠标移动到“QQ登录”区域,左键点击后,我们会看到如下图的提示:
可以很清楚的看到,当前网页的域名是mail.qq.com
,但在其中又嵌入了一个域名为xui.ptlogin2.qq.com
的网页。两个域名不完全一样,这就是典型的跨域网页。
在这种情况下,IE浏览器并不会对跨域做特殊处理。而Chrome浏览器出于安全因素考虑,会禁止对iframe下的页面进行访问,包括元素的选取、执行JS等操作。也就是说,我们无法选取QQ登录中的界面元素,包括登录QQ号、QQ密码等,更无法自动化操作。
怎么处理这种情况呢?要么选择用IE浏览器,要么通过启动参数命令,来关闭Chrome的安全设置。下文叙述Chrome的安全设置关闭方法,请注意,在关闭之前,需要先选择一个临时目录用于存放Chrome的用户数据,假设选为D:\temp
。
右键点击Google Chrome图标,选择 属性->快捷方式,在“目标”一栏填入启动参数,具体格式如下:<Chrome安装路径> --disable-web-security --user-data-dir=用户数据目录
。比如,我们的Chrome安装在C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
下,用户数据目录为D:\temp
,那么套用格式,我们在Chrome目标窗口应填入C:\Program Files (x86)\Google\Chrome\Application\chrome.exe --disable-web-security --user-data-dir=D:\temp
,如下图:
在经过以上操作后,我们再打开Chrome,会看到Chrome地址栏会有如下的提示,并且安装的扩展程序也消失不见了。不要着急,这是因为Chrome的用户数据目录发生了变化,只要重新安装UiBot的Chrome扩展程序,即可自动化操作。
经过以上设置,Chrome即可支持跨域访问。
SAP客户端程序
SAP客户端程序需要在设置中打开脚本支持,才能正常选取。我们以SAP 710客户端为例:
- 打开SAP客户端程序,进入登录主界面;
- 输入rz11事务码并进入相应界面;
- 在事务界面输入sapgui/user_scripting,并点击display;
- 查看Current Value当前值选项,如果为TRUE则已经开打选项,不需要做任何改动;如果为FALSE则需要点击Change Value改变此处为TRUE;
- 点击设置按钮,选择Options项;
- 切换到Scripting选项卡,勾选"Enable Scripting"选项,并取消勾选"Notify When a Script Attaches to Running Man GUI"和"Notify When a Script Opens a Connection"选项。
设置完成后,即可象普通的Windows软件一样,用UiBot对SAP客户端进行界面元素的获取和操作。除了前文中介绍的“鼠标点击”、“键盘输入”等操作之外,我们来看一个新的例子,用UiBot自动设置单选框的内容:
在“界面元素”类的命令下,找到“设置元素勾选”命令,拖动插入到组装区。按下“查找目标”,可以看到UiBot的界面元素选择遮罩可以准确的遮住SAP客户端中每个单选框的位置。选中我们关注的单选框,并在命令属性栏的“是否勾选”选择“是”即可。如图所示:
运行此流程,即可看到SAP客户端的单选框被UiBot自动设置为“Display inbound call”一项。
Java程序
UiBot支持Swing、AWT、JNPL、Applet等多种Java应用程序。除Swing以外,其他Java程序都需要安装Java扩展程序。
可以按照如下步骤去安装Java扩展程序:
打开UiBot Creator,随便选择一个流程。在菜单中选择“帮助”->"安装Java扩展";
安装成功之后,UiBot Creator将会有对应的安装成功提示出现。需要注意的是,如果需要操作的Java程序是以管理员权限进行安装,那么同样需要以管理员权限启动UiBot Creator,才能顺利安装Java扩展程序。
安装后,即可象普通的Windows软件一样,用UiBot对Java程序进行界面元素的获取和操作。
进阶:网页目标
目前,越来越多的PC软件系统都选择采用B/S(Browser/Server)架构,用户无需额外安装软件,只需要采用浏览器即可直接使用。这种B/S架构的软件系统给RPA带来了便利,因为有很多办法可以查找和操作浏览器中的网页界面元素,不至于像很多C/S(Client/Server)的PC软件系统一样根本无法获取到界面元素。
但是,由于查找和获取网页界面元素的办法很多,也带来了更高的复杂度,往往需要一些特殊的技巧,本节特别讲述这些技巧。
我们先来看一个例子,如下图,展示了用Chrome浏览器显示的百度主页上的一个二维码,以及UiBot获取到的特征信息:
可以看到,这个网页上的界面元素的特征分为两部分,一部分是wnd
信息,另一部分是html
信息。wnd
信息和其他C/S软件类似,而html
信息则是其他C/S软件所不具备的。实际上,wnd
信息标明了这个网页所在的浏览器窗口,html
信息才是网页上的界面元素的关键信息。下面针对html
这部分特性进行解释。这里会需要您了解一点html的基础知识,当然,不太了解也没关系,跟着我们进行一些实际操作,自然能够掌握这些特征应该如何运用。
-
html
:代表这是一个网页界面元素; -
url
:对应浏览器地址栏中显示的URL,其实并不参与界面元素的特征匹配。仅在“绑定外部浏览器”命令中(在“浏览器”类命令中可以找到)用到,用于选择想要绑定的浏览器活动标签页; -
title
:与url类似,对应浏览器标签页的标题,不参与界面元素的特征匹配,也仅在“绑定外部浏览器”命令中使用; -
tagName
:代表这个网页界面元素的html标签类型,常见的有div、a、input
等等。熟悉html的读者对此一定倍感亲切,不熟悉也没关系,打个比方:如果说html代表人类,那么tagName
则代表这个元素是亚洲人、美洲人或者欧洲人; -
attrMap
:代表这个网页界面元素的更具象的html描述,我们同样拿上面这个比方:attrMap就像是这个元素的户口本,更为详细的描述了这个元素属于哪个国家和省份,父母是谁,是否独生子,等等; -
index
:一般起辅助作用,说明在满足特征条件情况下,元素出现的顺序。UiBot的index是从数字1开始的,当index没有填写或取0时,则会选择第一个出现的元素。
以上说明可能比较枯燥,我们以一个具体的例子来说明网页目标的获取方法。我们经常希望用RPA自动查阅电商网站上某种商品的销量,并保存下来。比如,需要在天猫上获取Intel i5 8500这种商品的月销量,这个数字在天猫页面上的固定位置有显示,如图:
当我们用RPA来自动获取这个数字的时候,根据前面所学的内容,我们通常会这样操作:
- 从UiBot Creator的命令区选择“获取元素文本”命令,如下图:
- 在"获取元素文本"命令上点击“查找目标”按钮,并选择销量数字,如Intel i5 8500页面的"98",如下图:
- 用“输出调试信息”命令查看抓取到的值(当然,也可以用于其他用途,如转换成数字、保存到Excel表格等,本文暂不赘述其他用途),如下图:
看起来,好像工作得很好,毫无问题的获得了Intel i5 8500的月销量:98。但是,如果我们在其他商品上再去运行这个流程(使用Chrome浏览器,只需切换页面的标签即可,UiBot始终会在激活的标签工作),就会发现出问题了。
可以看到,在等待一定时间之后,UiBot最终因为没有找到目标而抛出了异常。那么,问题到底出在什么地方?我们应该如何做,才能让UiBot顺利找到目标呢?
点击"获取元素文本"命令,查看命令的属性,并具体打开“目标”属性进行查看,如下图:
细心的读者可能已经发现了:原来"aaname"
这条特征已经被固定在"98"了。这显然是不合理的:我们本来就是为了获取销量,如果把销量的数值98也加到特征里面,那是毫无意义的!因为销量一旦发生变化,特征就无法匹配了,造成“漏选”的问题。怎么办呢?我们可以很自然的想到:取消aaname
特征的勾选状态,或把aaname
的特征采用"*"
进行通配,即可跳过这条造成“漏选”的特征。如下图:
请注意,这里不必纠结上面图片框里显示的98,那只是一张参考图,在实际查找目标的时候不会起到任何作用。也不必纠结title
和url
这两条特征,因为前文已经提到,这两条特征也不会参与到查找目标的过程中。
修改完成之后,再次运行这个流程块,看看是否能正确获取其他商品的月销量。如下图:
奇怪的事情发生了,之前的异常确实没有出现,并且获取到了内容。但是并不是我们想要的"77",而是"月销量"几个字,这是怎么回事呢?
我们观察一下页面上的内容,发现修改"aaname"之后,虽然不会发生“漏选”,但由于文字“月销量”的特征和“77”完全一致,造成了“错选”。仔细查看即可发现,"月销量"文字和"77"的tagName、attrMap
等特征完全一样,好比是一个户口本里的同一家人,已经无法区分了。怎么办呢?可以使用"index"
特征来定位他们的不同。上文提到,UiBot的index
是从数字1开始的,当index没有填写或取0时,则匹配第一个。从页面上看,"月销量"这个元素在销量数字的前面,如果它是第一个,那么销量数字就应该是第二个,因此,我们猜测,当的index
取2的时候,就可以找到销量数字了。不妨填上试一下。
现在验证一下。在UiBot Creator工具栏上,点击“运行”按钮,直接运行当前的流程块。可以看到,在其他商品的页面上,也可以正确的拿到了其月销量数据了。
以上范例是对特征的一些简单总结,在实际操作过程中,我们可以根据上面的规律,对需要定位的目标进行相应的修改尝试。因为操作的目标可能千变万化,这方面并没有特定的规则,只能多多尝试,积累经验。希望以上内容可以为您的实际操作中提供一些参考,帮助您顺利的找到操作的目标。
返回目录
注: 上述内容经 UiBot 官方 授权发布,版权归 UiBot 官方所有,如需转载请先联系。
更多 RPA 相关的资讯,请关注公众号:流程自动化机器人教程
由于简书禁止直接在文章中插入公众号二维码,请点击 这里 了解添加该公众号的细节。