最近对RPA(机械化流程自动化)概念颇感兴趣,所以对RPA软件UiPath做了一番学习研究。
RPA能实现不同软件窗口的自动化操作,那让我首先感到好奇的就是它是如何准确的表示一个窗口以及每个元素的。
下面是我的学习记录。
1.Selector.
UiPath中表示元素定位的叫做Selector选择器,并且提供了一个类似网页浏览器调试器中选取元素同样所见即所得方式的UiExplorer,Selector实际上就是一些XML标签,从上到下、由前到后表示所定位元素的结构。标签内的属性用于区分元素特征。一般表现形式如下:
#中文新打开的记事本
<wnd app='notepad.exe' cls='Notepad' title='无标题 - 记事本' />
<wnd ctrlid='137' />
个人总结来看,<wnd>标签表示窗体和控件元素,唯一确定一个程序窗体通常只需要app、cls、title三个属性,具体到控件通过ctrlid属性来区分。
一般的操作方式是,打开程序界面,用UiExplorer的Indicate Element点击程序,Selector Editor框内会显示选择器的详细信息,下方会有用于实际自动化操作的选择器XML表示方式。Property Explorer面板会显示该窗体或元素所有的属性信息。
这里还有一个问题是UiPath如何区分同一个程序的多个运行实例,如果你打开了多个记事本它怎么知道你要操作的是哪一个?单凭app、cls、title说不够也可以说够也行。为什么会这么说?首先从RPA的背后原理来说,能够操作调用软件的图形界面实际上是操作每个窗体以及当中的每个控件的句柄(Handle),以Open Application Activity打开记事本为例,每次打开的运行时窗体Handle值都是不一样的。下面两张图是两次运行时调试看到的Handle值,Notepad变量是保存打开后的程序,以供后面调用,类型是Window。
从运行机制上来看,app、cls、title、Handle足够准确定位某一具体运行的窗体而且是必须的,这是前面说不够的原因。句柄可以理解为操作系统为窗体分配的虚拟内存地址,为每一个在操作系统上运行的软件赋予的一个身份。当然句柄也不仅仅是一个数值,它在Windows里面是一个有多个属性的结构体;句柄机制也不仅仅是在窗体程序上,操作系统内部很多运行资源都会用到句柄。在这里我们相对的只需要了解RPA相关的知识,这样理解句柄已经足够了。进一步说,每个窗体都有一个唯一的句柄标识之后,ctrlid可以理解每个控件基于所属窗体之上都有一个唯一的句柄值。
因为句柄的存在,所以虽然我们从Property Explorer能看到窗体有很多其他属性,比如进程相关的pid,但都不适合用来区分进行RPA相关的操作。而这些属性与app、cls、title最大的区别在于它们都是由操作系统来管理的,作为应用层用户的我们不仅不便对它们进行管理也不需要对它们进行过多的关注。
我们来看看在做RPAd的时候,我们是在想些什么?在做RPA流程设计的时候,你在想打开哪个应用(app)要做什么;我标出它的标题(title)吧,这样我自己好区分;如果程序复杂一点,有个分类(cls)属性再帮我做一下甄别更好;具体到操作哪个控件看看ctrlid吧。接下来就是按照流程设计把一个个应用操作连接起来就是一个完整的RPA自动化操作了。你看,只需要关注我们所能够看到的属性已经足够。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。