UiPath不能稳定点击IE下载通知条“保存”按钮旁小三角按钮的问题
转载注意:本文由思想瞭望者于2020年7月3日首发于博客园,转载请注明出处!
现象:用UiPath自动操纵IE下载文件另存为时,许多同行遇到不能稳定点击“保存”按钮旁边的小三角按钮的问题。如下方图1红框所示。
(图1:小三角按钮)
原因:IE的下载通知条其实有两种状态,一是常见的“通知”(如图2),二是“警报”(如图3)。当我们用UiPath在IE点击一个网页的下载链接,会先弹出“下载通知”,然后“下载通知”有可能很快转变成“下载警报”。对于UiPath来说已经是两个下载通知条了(只是外观相近而已),但是人眼看起来好像按钮还是那个按钮,除了底色在黄白间渐变,并没有感觉到什么不同。
(图2:下载通知)
(图3:下载警报)
多数时候“下载通知”和“下载警报”的完整Selector是相同的,但有时候二者会有细微然而关键的差异导致UiPath难以稳定点击那个小三角按钮。
有趣的是,一方面下载通知条的“警报”状态往往非常短暂,容易被人无意中忽略。另一方面,当下载通知条处于“警报”状态时,光标移到上面会令它瞬间转变为“通知”状态,于是难以通过Indicate on screen (UiPath Studio)或者Indicate Element(UI Explorer)捕捉到“警报”状态的对应Selector。
许多人不知道IE的这个行为,以为两者是一个东西。所以针对“下载通知”优化了Selector之后,一旦出现“下载警报”便会报错报异常,于是再想办法针对“下载警报”调整Selector,结果又导致“下载通知”不能稳定点击了,就显得一头雾水摸不着方向。
有的人利用两个状态容易互相转化的特点,有许多土办法来完成这个点击动作,包括但不限于:
- 连续尝试单击那个小三角直至点击成功(用Retry Scope或者While/Do While),其实是他们的Selector只能处理其中一种情况,所以他们就不断重试直到下载通知条对应的状态出现。
- 让光标先滑过下载通知条(用Hover),使下载通知条直接进入“下载通知”状态。
这些我认为只能视为Work around,而不是针对问题的Solution。
下面给大家展示一下我可以提供的线索。
首先以我的笔记本为例。环境信息如下:
(图4:笔记本系统信息)
(图5:IE版本信息)
(图6:网页所处安全区域及区域安全级别)
在笔记本环境下,对于同一个下载链接,不论出现的是“下载通知”还是“下载警告”,我都捕获到了一样的完整Selector。因此在我的笔记本上,对于这个下载链接我可以写出一个通用的Selector来覆盖全部下载场景。
1 <wnd app='iexplore.exe' cls='IEFrame' title='邮件 - XX XXXXXX - Outlook - Internet Explorer' aastate='可调大小, 可移动, 可设定焦点' /> 2 <wnd cls='Frame Notification Bar' aastate='可设定焦点' /> 3 <wnd aaname='通知' cls='DirectUIHWND' /> 4 <ctrl automationid='IENotificationBar' name='通知' role='tool bar' text='通知' /> 5 <ctrl name='保存' role='split button' text='保存' /> 6 <ctrl name='6' role='drop down button' text='6' />
但是在我的服务器上,我观察到IE有不一样的行为。服务器的环境信息如下。
(图7:系统信息)
(图8:IE版本信息)
(图9:网页所处安全区域及区域安全级别)
当出现“下载通知”时,小三角按钮的完整Selector如下。
1 <wnd app='iexplore.exe' cls='IEFrame' title='邮件 - XXXXXXXXXX@cn.gt.com - Internet Explorer' aastate='可调大小, 可移动, 可设定焦点' /> 2 <wnd cls='Frame Notification Bar' aastate='可设定焦点' /> 3 <wnd aaname='通知' cls='DirectUIHWND' /> 4 <ctrl automationid='IENotificationBar' name='通知' role='tool bar' text='通知' /> 5 <ctrl name='保存' role='split button' text='保存' /> 6 <ctrl role='drop down button' />
而出现“下载警报”时,小三角按钮的完整Selector如下。
1 <wnd app='iexplore.exe' cls='IEFrame' title='邮件 - XXXXXXXXXX@cn.gt.com - Internet Explorer' aastate='可调大小, 可移动, 可设定焦点' /> 2 <wnd cls='Frame Notification Bar' aastate='可设定焦点' /> 3 <wnd aaname='通知' cls='DirectUIHWND' aastate='中级警报' /> 4 <ctrl automationid='IENotificationBar' aastate='中级警报' name='通知' role='tool bar' text='通知' /> 5 <ctrl name='保存' role='split button' text='保存' /> 6 <ctrl role='drop down button' />
可见,区别在于行号#3和#4出现了“aastate='中级警报'”的属性,而这个属性在“下载通知”的完整Selector中则完全没有出现。经过实际测试,正是这个属性影响到小三角按钮点击动作的稳定性。而由于许多人并没有捕捉到或者仔细观察过“下载警报”的完整Selector,因此不容易发现这个细微的问题。
而且可以合理推测,随着安全区域的不同,以及对应的区域安全级别的不同,有可能会出现“初级警报”或者“高级警报”。再加上IE的Selector会随着系统语言变化。因此这里隐藏的变化比较多,要用一个Selector搞定各种场景还是有点困难的。
顺便也可以理解许多同行开发的IE下载文件动作在自己的机器上就是好的,部署到生产服务器就各种不稳定的情况。
我的解决方案:
RPA永远只有更好的办法,没有最好的办法。我就拿我的办法来抛砖引玉一下。大家可以发挥想象力,看看有没有更好的做法。
我会针对“下载通知”和“下载警报”分别设计一套逻辑,出现哪个用哪个。我习惯先用Pick看看能不能搞定,结果目前看来一直很稳定,可供大家参考。如果Pick不行的话,可以考虑依次尝试用两种Selector去先后点击,一个点不了的话另一个就会成功的。
(图10:仅供参考)
这个问题相信不止是UiPath会遇到,其它的RPA工具在做IE自动化的时候应该也会遇到的,因此还是有必要稍微研究一下。
欢迎加入“UiPath精英群”参与深度探讨