轉載注意:本文由思想瞭望者於2020年7月3日首發於博客園,轉載請註明出處!安全
現象:用UiPath自動操縱IE下載文件另存爲時,許多同行遇到不能穩定點擊「保存」按鈕旁邊的小三角按鈕的問題。如方圖1紅框所示。服務器
(圖1:小三角按鈕)app
緣由:IE的下載通知條其實有兩種狀態,一是常見的「通知」(如圖2),二是「警報」(如圖3)。當咱們用UiPath在IE點擊一個網頁的下載連接,會先彈出「下載通知」,而後「下載通知」有可能很快轉變成「下載警報」。對於UiPath來講已是兩個下載通知條了(只是外觀相近而已),可是人眼看起來好像按鈕仍是那個按鈕,除了底色在黃白間漸變,並無感受到什麼不一樣。工具
(圖2:下載通知)測試
(圖3:下載警報)優化
多數時候「下載通知」和「下載警報」的完整Selector是相同的,但有時候兩者會有細微然而關鍵的差別致使UiPath難以穩定點擊那個小三角按鈕。spa
有趣的是,一方面下載通知條的「警報」狀態每每很是短暫,容易被人無心中忽略。另外一方面,當下載通知條處於「警報」狀態時,光標移到上面會令它瞬間轉變爲「通知」狀態,因而難以經過Indicate on screen (UiPath Studio)或者Indicate Element(UI Explorer)捕捉到「警報」狀態的對應Selector。設計
許多人不知道IE的這個行爲,覺得二者是一個東西。因此針對「下載通知」優化了Selector以後,一旦出現「下載警報」便會報錯報異常,因而再想辦法針對「下載警報」調整Selector,結果又致使「下載通知」不能穩定點擊了,就顯得一頭霧水摸不着方向。code
有的人利用兩個狀態容易互相轉化的特色,有許多土辦法來完成這個點擊動做,包括但不限於:blog
這些我認爲只能視爲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精英羣」參與深度探討