轉載注意:本文由思想瞭望者於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精英群”參與深度探討