书接前文,在我们的上一篇微文“RPA经验分享 | 理论指导实践 UiPath的基本IT术语”中,我们给大家介绍了UiPath的一些IT术语。下面就让我们来一起学习UiPath中如何快速配置和建立稳定的选择器。
![aa83346a32b3136dec1f4c56f01ae431.png](https://i-blog.csdnimg.cn/blog_migrate/b315df41f9febf2522deee0e937f75a7.jpeg)
![2103a15498c96e33900186d8169d1638.png](https://i-blog.csdnimg.cn/blog_migrate/4298b49e2589a3da770ef7a92b6e4258.jpeg)
重点知识1:了解Selector
UI就是很多个互相嵌套的容器,使用UI Explorer工具可以帮助我们了解UiPath怎么去识别某个UI中的元素,了解Selector的工作原理。
![ab6c5b180a69bd1bb7bc2418a2bafdff.png](https://i-blog.csdnimg.cn/blog_migrate/dba3591bad3dd00a485123a8cd372b7d.jpeg)
1) 点击工具栏上的Select Target Elements,再点击UI界面中的某个元素。
![ede0819d5cfb23b587230fc49bc465e1.png](https://i-blog.csdnimg.cn/blog_migrate/c8dea2109fa0a2ca020e7a586620ca4c.jpeg)
2) 该UI元素的Selector显示在下面的模块(SelectorEditor Panel)里,而左边的模块(VisualTree Panel)里是一个完整的UI树状图,包含了UI所有的元素。
![f91a3cf4c883b53aa4b32342023f4c05.png](https://i-blog.csdnimg.cn/blog_migrate/4b8cd1c12db5e98598bab6fac93bdc67.jpeg)
3) 点击Highlight工具,然后在UI Tree里选中某个元素,此时UI中对应的元素会被黄色的矩形框起来,方便查看。
![453f908f75bfda4e90d1610428546fb1.png](https://i-blog.csdnimg.cn/blog_migrate/a2b185df3c64996c325d7ea0e1b51d02.jpeg)
4) 如果某个元素未被识别(在选取这个元素时没有出现蓝色的矩形框),可以更改UiFrameworks的选项,再重新指定元素。
UiFrameworks用于更改确定UI元素及其Selector的技术
Default:UiPath的专有方法。通常适用于所有类型的用户界面。
Active Accessibility:Microsoft早期提供的一种使应用程序可访问的解决方案。当Default方法不起作用,而软件是比较旧的版本时,推荐尝试这种方法。
UI Automation:Microsoft改良过的访问模式。当Default方法不起作用,而软件是比较新的版本时,推荐尝试这种方法。
![247320d923d4178873a4876393ad4f92.png](https://i-blog.csdnimg.cn/blog_migrate/2a1fd5fabf1290f7be9445569bbacc93.jpeg)
5) 上面的模块(Property Explorer Panel)显示的是未优化的原始Selector,它包含了目标元素的完整路径。下面的模块则是优化过的最终Selector。
UiPath默认使用第一层和最后一层容器来构成最终的Selector,因此优化过的Selector里的元素会少一些。
选择或者取消选择某一行,可以在最终的Selector里添加或删除元素。
![198fd1dd66300f6cff7bd2ca521ff7b6.png](https://i-blog.csdnimg.cn/blog_migrate/b64b366e83546b3bd4befc6865b6403c.jpeg)
6) 优化后的Selector是标准的XML代码,它由两部分构成:
元素类型:wnd和uia。元素的类型一目了然,比如window,control,HTML,Java等等.
属性(Attributes):元素类型后面的部分,它是Selector识别特定元素的关键。
下列代码的第一行表示名为applicationframehost.exe的应用程序,该程序的Class是ApplicationFrameWindow,标题是All Calendars - Calendar。如果任一条件不匹配,就找不到这个应用程序。
![3db7d0cb9362255f34b0e876a8922b57.png](https://i-blog.csdnimg.cn/blog_migrate/222c5f5a6d5e1ed881e01c120280938e.jpeg)
7) 属性显示在右边的模块(Selector Attributes Panel)。选择或者取消选择某个属性,会相应的更改Selector。
![0548eaa96cde4c31051038ed66a187a7.png](https://i-blog.csdnimg.cn/blog_migrate/9f69f4893209f358ae0f4feaacc0c399.jpeg)
总结:Selector就是UI元素和相关属性的列表,UiPath根据这些信息去匹配屏幕上已有的元素。
注意:在一些情况下,当UiPath和目标应用程序时用不同的权限打开的,Selector可能无法正常作用。推荐总是用相同的权限打开程序。
重点知识2:如何建立稳定的Selector
实例:用Basic方式录制一个Sequence,在名为SelectorsTest.txt的文本文件里录入一段文字。
分析:
1) 查看Type Into活动的属性面板,打开Selector Editor。
2) 关掉SelectorsTest.txt,打开五个新记事本并运行Sequence,30秒后UiPath将报错。
* 这种提示大部分都是Selector出现问题。
![501c9436fbb9c197d803f75c13d08fd0.png](https://i-blog.csdnimg.cn/blog_migrate/ce8f057a3d93bdfc2763db5fa9d02001.jpeg)
3) 问题出在title属性上。由于指定了标题,当SelectorsTest.txt没有打开时,程序就无法正常运行。
![71c450b08820524ba0223547b3f6327c.png](https://i-blog.csdnimg.cn/blog_migrate/f7470deda5a3649ddd8cc8f863de8173.jpeg)
4) 考虑到你是想让这个程序在任何文本文件里都可以运行,还是只在指定的文件里运行,这可以是一个bug,也可以不是。
5) 如果想要程序在任何文本文件里运行,只要删除title属性就可以了。
6) 重新运行程序。虽然打开了五个记事本,但程序只会在最上层的记事本里运行。
*SelectorEditor和UI Explorer有所不同。在Selector Editor的Edit Attributes模块里,该Selector包含的所有UI元素的相关属性都会列出来。而在UI Explorer里,只会显示选中的那个UI元素的相关属性。
点击左下角的Openin Explorer可以在UIExplorer里查看和修改更多的UI元素和属性。你也可以在Selector Editor的Edit Selector模块里手动修改代码。
重点知识3. 自定义Selector
1)Full Selector和PartialSelector
FullSelector:包含了确定该UI元素位置的所有必要信息,其中包括顶级窗口的信息。
![7b804f9551c3a314b68a5c0927224266.png](https://i-blog.csdnimg.cn/blog_migrate/5ed28639ae392c9782eab9222a8ab492.jpeg)
PartialSelector:不包括顶级窗口的信息,但是嵌套在一个包含了顶级窗口信息的容器中,比如Attach Window活动,Open Application活动。
![5f1371599dcbcf534da3292fd8c2af75.png](https://i-blog.csdnimg.cn/blog_migrate/bd8d1e2866ead32d9e27f4dc6261850a.jpeg)
除了是否包含顶级窗口的信息,FullSelector和PartialSelector没有什么区别。在同一个窗口执行多个操作时建议使用Partial Selector;需要在多个窗口之间切换时建议使用Full Selector。如果可能受到其他应用程序或窗口的干扰,最好使用Partial Selector。
*FullSelector也可以在AttachWindow或者Open Application等的容器中使用。
*录制功能的Basic模式使用的都是Full Selector,Desktop模式使用的都是Partial Selector。
2) 动态Selector:通配符
* (星号):代替任意个字符。
? (问号):代替任意一个字符。
实例1:如何让UiPath识别出一个名为“DailyReport - ”加上当天的日期的文本文件。
方法:将动态的部分,在这里即日期,用*表示。
![fbfd677850f83b0333dd566330ced3eb.png](https://i-blog.csdnimg.cn/blog_migrate/4f6ab404b7d39072cfa15fae56a1ffbe.jpeg)
![1639f079783e499409a48bd16bcd322e.png](https://i-blog.csdnimg.cn/blog_migrate/31a71b7a82f611154f3dbac5f51e9997.jpeg)
实例2:首先在亚马逊首页查询书A的价格,接着用Basic模式录制下列操作:选中并清空搜索栏,输入书B的名称并查询,读取书B的价格并用Message Box显示。
运行程序30秒钟后,将收到下面的错误信息。
![4e994f3c754e2e7268d4bfb8d9fd19fe.png](https://i-blog.csdnimg.cn/blog_migrate/c833cd55f8a5d3bee415a473fba70e12.jpeg)
分析:由于首先查询了书A,在录制过程中浏览器的标题包含书A的名称。但是在录制结束后,浏览器的标题已经变成了书B,因此UiPath无法识别出浏览器窗口来运行程序。
![702d7c5463ae7d2761737c614f219310.png](https://i-blog.csdnimg.cn/blog_migrate/6ac587e482a73cfd4cec2effe1593985.jpeg)
方法:可以直接去掉title属性。但是更好的方法是,把书A的名称替换为通配符*。GetText活动的Selector也需要相应的修改。
3) 动态Selector:Attach to Live Element
如果不使用通配符的方法修改Selector,还可以使用Attach to Live Element。
找到出错的Selector,点击Selector Editor右上角的Attach to Live Element,然后再次点击UiPath运行时没能识别出的元素,比如实例2中的搜索栏。UiPath会将之前的Selector和这一次的进行对比,用*代替其中不同的部分。
![dfca6c34468ad9d40827d7bc211ecda8.png](https://i-blog.csdnimg.cn/blog_migrate/a911253f50c1835549daf6a112afc77a.jpeg)
4) 动态Selector:Index
Index告诉UiPath应该选择第几个UI元素。
实例:在记事本中录制一个更改字体的Sequence,并把它改成选择第四种字体。
方法:录制完成后,从Selector Editor中打开UI Explorer。如果我们去掉字体名称的属性,它将会被自动替换为idx=4。
![c0bfcf2b5dde3560f422af303787a0d6.png](https://i-blog.csdnimg.cn/blog_migrate/d58c356ba251d23b3c4ef780ff4a8e44.jpeg)
![3fcee327db84d2b279781938824c7724.png](https://i-blog.csdnimg.cn/blog_migrate/f23a95400fe5f68cdebe6e1091cc315c.jpeg)
*如果在一个Selector中出现了Index属性,这是一个信号,说明现有的属性不足以让UiPath识别出目标UI元素,因此需要依靠Index属性来找到它。但是这样的Selector是不可靠的,我们应该尝试添加其他上级元素或者属性而避免使用Index。
*应尽量避免使用大于2的Index属性,尝试添加其他的属性来确保Selector的稳定性。
5) 动态Selector:变量
实例:用户输入一个0-9的数字,在Windows自带的计算器中标亮这个数字。
方法:
- 添加一个InputDialog方法,要求用户输入0-9的数字,输出变量digit
- 添加一个Highlight方法,然后随便指定一个计算器中的数字,这里指定0。
- 用UIExplorer查看计算器的UI元素,找出哪一个属性与数字有关。
![887d7e584b21f1ed073fde1902b5e254.png](https://i-blog.csdnimg.cn/blog_migrate/38ecbbe30ba62b74c3264b9bc83d0f1a.jpeg)
![08960f19ac227176dce7aa89e4335c10.png](https://i-blog.csdnimg.cn/blog_migrate/05d219cbc2cefd2fa4f739019da6a708.jpeg)
包含有数字的属性只有Automationid,需要保留。Name属性与数字的英文有关,它是动态的,必须去掉。稳妥起见,可以把cls='Button'属性和整个NumberPad元素去掉。最终的Selector如下图所示。
![37ff5c3c597c06c72701d558b41820be.png](https://i-blog.csdnimg.cn/blog_migrate/657d4162661389653f5647a82d329c47.jpeg)
最终得到的Selector复制到Highlight活动的Selector里,然后在属性面板里把Selector里修改为。
- 一定要在属性面板里修改,因为Selector Editor里的Selector是不带引号的。
- 另一个思路是声明一个String型的变量,然后用Replace方法把Selector里的0替换为该变量。
*创建更可信的Selector
实例:
http://rpachallenge.com网站提供了一个关于RPA的练习。在这个网站上,每点一次Submit,信息的排列顺序和位置都会改变。如何让UiPath总能定位到First Name的文本框并填入Mack的名字?
分析:
1) 首先使用UI Explorer分析First Name文本框的Selector,该Selector有一个id属性是唯一的。
![b2f2a25bbb6929b32ffefa324d1af8ef.png](https://i-blog.csdnimg.cn/blog_migrate/c1cce26463891edadb9ceba015d79ce5.jpeg)
2) 点击网页上的Submit按钮进入下一页,新的First Name文本框的id属性值和上一个不同。这说明id属性是动态的,无法每次都定位到First Name文本框。
![686222d489745566b8de43f991f317f7.png](https://i-blog.csdnimg.cn/blog_migrate/98d729c30d3573cafc0a9ce010bd021f.jpeg)
3) 文本框元素里没有任何一个属性与First Name有关。但是它的上级元素有一个aaname属性提到了First Name,我们把这个元素添加到Selector里。
4) 该元素里的css-selector属性是唯一的,但是只要网页设计稍作调整,这个属性就会发生变动,因此要把它去掉。
![12de0354ee1c7813feeacebab5a42c42.png](https://i-blog.csdnimg.cn/blog_migrate/438c3bb4198220531a6cdd99d985d5e3.jpeg)
5) 去掉css-selector属性后,UiPath会自动为该元素添加idx='2'属性,这说明现有的属性可能不足以确定该元素的位置。其原因是:除了css-selector属性外,该元素和它的上级元素的其他属性(aaname/ parentidid/ id)是相同的。只要把该元素的上级元素也选上,idx='2'就会消失。记得去掉新添加的元素的css-selector属性。
![600ec1a1301cbafa518205c26357c272.png](https://i-blog.csdnimg.cn/blog_migrate/ae550a3e9607965242e0cae58408bb09.jpeg)
6) 这个Selector是能用的,但是它存在很大的缺陷:一是该Selector仅能在特定的网页结构下运行;二是为Selector添加过多的上级元素会让它变得不稳定,因为上级元素只要稍有变化就会发生错误。
*点击对号按钮可以检查当前Selector的有效性。
![7f256fbe526784b4ec4dc01f8c38d243.png](https://i-blog.csdnimg.cn/blog_migrate/9f14c02bbc2b189d30bcb3780ae5a93d.jpeg)
方法:此处提供两种更稳妥的方法解决上述问题。
1) 使用Anchor Base方法:
在该方法的容器中,左边放锚点(anchor)活动,右边放要运行的其他活动。
![cd6eec14cb016b5dae039b2a190d96b2.png](https://i-blog.csdnimg.cn/blog_migrate/f14d0aae912c8fff511d17b3c897a741.jpeg)
FindElement活动或FindImage活动可以作为锚点。Find Element活动同样通过Target里的各种属性来定位UI元素,但不同的是它会输出一个UIElement对象。稍后,我们将用这个对象创建一个更可信的Selector。
![3c387654840bf65f5003f5a68788fe04.png](https://i-blog.csdnimg.cn/blog_migrate/aacd64460f7bca985fed6beec8054d69.jpeg)
先指定网页上的FirstName标签(Label)作为锚点,标签的Selector通常非常稳定。
![b3198775ab1f905e9db335771e6ae08d.png](https://i-blog.csdnimg.cn/blog_migrate/00cbd9a5524c2c10739578d7cabf7d55.jpeg)
在Anchor Base容器的右边,添加Type Into活动用来在文本框里输入Mack的名字。指定First Name标签右边的文本框作为TypeInto活动的目标元素,可以看到它的Selector里只有一个tag属性,并没有id等动态属性。
AnchorBase活动的原理是UiPath将以指定的锚点作为参考,选取屏幕上离它最近的符合Selector条件(webctrl tag='INPUT')的UI元素,这样做缩小了搜索范围。
![fd4ee9985593c9c055a15f42fcd1ca85.png](https://i-blog.csdnimg.cn/blog_migrate/134be68ee1999d23f8ffe194c85c2cd5.jpeg)
AnchorBase活动有一个非常有用的属性AnchorPosition。它的默认值是Auto,但是如果锚点相对于目标元素的位置总是固定的,就可以把它改为其他值。在本例中它不是固定的,因为有时候文本框在标签的左边,有时候在下边。
![7721b178ba02c1c1705f4cbe6369d778.png](https://i-blog.csdnimg.cn/blog_migrate/1f2fbb8ab07846c2cf2033a80ebac4ea.jpeg)
由于AnchorBase活动通过锚点和目标元素在屏幕上的相对位置来进行定位,因此它无法在后台运行。
2) 使用Select Relative Selector
打开UI Explorer,先指定First Name文本框。点击左上角工具栏里的Select Relative Element。
![9aa3756ab2a347eb7c1b96623243d6e2.png](https://i-blog.csdnimg.cn/blog_migrate/6ed6ed0af217ee1b55d266cb48849f04.jpeg)
此时进入选取模式,选取FirstName的标签文字。这样做会在列表中添加新的关于FirstName标签的元素:webctrl和nav。nav的up属性可以导航到父元素,再从它的子元素列表里选择目标元素(...that locates the First Name label,navigates up to the parent element level and then selects the input in the listof children elements.)。同时别忘了去掉文本框的id属性。
- nav支持的其他属性有next和prev,分别表示前往结构树的下一个或者上一个元素(...which go to the next or the previouselements in the tree respectively.)。
![1873789e8a03dcc6ba75b74731d3aa18.png](https://i-blog.csdnimg.cn/blog_migrate/a3545871fe4ab3a00f17cb28d5dc7028.jpeg)
添加一个TypeInto活动,把得到的Selector 复制到该活动的Selector属性里,大功告成。
使用SelectRelative Selector功能,程序是可以在后台运行的,因为该功能基于应用程序的内部结构而非屏幕上的位置。
本文转自公众号“伊路人生”