04 【UiBot 開發(fā)者指南】- 無目標命令

無目標命令

在[上一章][界面元素]中,我們講述了界面元素,以及如何選取一個界面元素作為目標,以便使用有目標的命令。當然,并非在所有的情況下,都能準確找到恰當的界面元素作為目標。因此,我們需要學會使用“無目標命令”,以備不時之需。

為什么沒有目標?

在[上一章][界面元素]中提到,我們在查找、操作界面元素的時候,實際上都是在調用界面元素所在的軟件給我們提供的接口。UiBot 所做的,實際上是把這些種類各異的接口統一起來了,讓編寫流程的人無需關注這些細節(jié)。但是,仍然會有一些軟件,沒有給我們提供查找、操作界面元素的接口,或者雖然提供了接口,但在最終發(fā)布時關閉了。這些軟件包括:

  • 虛擬機和遠程桌面

包含Citrix、VMWare、Hyper-V、VirtualBox、遠程桌面(RDP)、各種安卓模擬器(如靠譜助手)等。這些程序都有單獨的操作系統在運行,和UiBot所在的操作系統是完全隔離的,UiBot自然無法操作另一個操作系統里面的界面元素。

當然,如果條件允許的話,可以把UiBot和流程涉及到的軟件,都安裝在虛擬機里,或者遠程計算機里。這樣一來,這些軟件提供的接口就可以被UiBot直接使用了,因為它們還是運行在同一個操作系統里面的,本地計算機只是起到了一個顯示器的作用而已。

  • 基于DirectUI的軟件

以前,Windows軟件界面的開發(fā)框架都是微軟提供的,包括MFC、WTL、WinForm、WPF等。微軟很貼心的為這些框架制作出來的界面都提供了自動化操作的接口。近年來,
為了讓軟件界面更好看,也更容易制作,很多廠商或開發(fā)團隊推出了自己的Windows軟件界面開發(fā)框架。這類框架統稱為DirectUI。用這些框架制作的界面,其界面元素都是“畫”出來的,雖然人眼可以看到,但操作系統和其他程序都不知道界面元素到底在哪里。有的DirectUI框架提供了對外的接口,可以找到界面元素,有的則根本沒有提供這樣的接口,其他程序,包括UiBot,自然也無法找到界面元素。

實際上,UiBot Creator、UiBot Worker本身的界面就是用一種DirectUI框架開發(fā)的,這種框架稱為electron。electron其實提供了界面元素的查找接口,但對外發(fā)布的版本默認都關閉了。所以,細心的讀者可能會發(fā)現,UiBot里面的界面元素,反而是市面上任何RPA平臺,包括UiBot自己,都無法找到的。

還有一個我們常用的基于DirectUI的軟件,就是微信的Windows客戶端。由于騰訊并未對外透漏,我們無法得知微信的Windows客戶端使用了哪種DirectUI框架。但事實表明,這種框架并未提供界面元素的接口,所以也是市面上任何RPA平臺都無法找到的。不過,微信還提供了基于瀏覽器的網頁版,可以獲得界面元素,推薦大家在RPA流程中使用。

  • 游戲

由于游戲的界面強調美觀和個性化,所以,一般游戲的界面元素都是“畫”出來的,原理上和DirectUI類似。這種界面通常也沒有提供接口,告知我們界面元素的位置。和基于DirectUI的軟件不同的是,游戲界面變化速度快,對時效性的要求更高,一般來說,RPA平臺并未針對游戲進行優(yōu)化,所以在游戲上使用的效果不會太好。

如果要在游戲上使用自動操作,推薦使用按鍵精靈。按鍵精靈是專門為游戲設計的,內置了很多針對游戲的界面查找手段,比如單點顏色比對、多點顏色比對、圖像查找,等等。且運行效率更高。

無目標命令

我們在[上一章][界面元素]中介紹了“有目標”的命令,相對的,UiBot也有“無目標”的命令。如下圖所示,紅框中表示有目標的命令,藍框中表示無目標的命令。

有目標和無目標的命令

如果遇到了沒有目標的Windows軟件,“有目標命令”自然就不能再用了,但仍然可以用“無目標命令”。
在圖中這些無目標的命令里面,最重要的是“模擬移動”,因為“模擬移動”需要我們在命令中指定一個坐標點,在執(zhí)行這條命令的時候,鼠標指針也會移動到這個坐標點;移動之后,我們再使用“模擬點擊”命令,模擬按下左鍵,才能正確的按下某個按鈕;或者正確的在某個輸入框上設置焦點,之后,再使用“輸入文本”命令,才能在焦點所在的輸入框里面輸入一段文本。

比如,有一個輸入框,其中間的坐標是x:200, y:300。那么我們就需要先用“模擬移動”,并設定移動的坐標為x:200, y:300;再用“模擬點擊”按下左鍵,設置焦點;再用“輸入文本”,才能正常輸入。否則,直接用“輸入文本”的話,很大概率就輸入到其他輸入框里面了。

這里,我們有必要先解釋一下Windows操作系統的屏幕坐標系。如果您之前了解Windows的屏幕坐標系,這一段可以跳過不看。

在Windows操作系統中,屏幕上的每一點都有一個唯一的坐標,坐標由兩個整數組成,一個稱為x,另一個稱為y。例如坐標x:200, y:300的含義就是這個點的坐標的x值是200,y值是300。x是以屏幕左邊為0開始計算,從左到右分別是0,1,2,3...,以此類推。y是以屏幕上邊為0開始計算,從上到下分別是0,1,2,3...,以此類推。所以,坐標x:200, y:300所對應的點,其位置大致如下圖中紅圈所示:

Windows的屏幕坐標系

只要有x和y兩個整數值,就可以確定屏幕上一個點的位置。在UiBot中,有一些命令可以獲得屏幕上某點的位置,并輸出到一個變量里。如何用一個變量來保存x和y兩個值呢?我們在[后文][語言參考]中學習UiBot所使用的Botscript語言的時候會了解到,BotScript中有“字典”數據類型,可以保存多個值。所以,UiBot在輸出一個點的位置的時候,會輸出到一個字典類型的變量中。假設這個變量名為pnt,則使用pnt["x"]pnt["y"]即可得到坐標的x和y兩個值。

假如我們要找的界面元素在屏幕上的固定位置,那么用固定的坐標,配合無目標命令,即可正常模擬操作。但這種情況往往比較少見,因為Windows是多窗口系統,每個窗口的位置都可以被拖動,導致窗口里面的界面元素的位置也會發(fā)生變化。而且,在微信這樣的軟件中,聯系人的位置也不是固定的,而是根據最近聯系的時間排序的,位置隨時可能發(fā)生變化。

所以,在UiBot中,一般不推薦直接寫固定的坐標,因為變化的情況太多了,很難一一考慮周全。通常,如果使用無目標的命令,需要搭配其他命令使用,讓其他命令能根據某種特征,找到界面元素的坐標,然后把找到的坐標當作變量,傳給這些無目標命令。

在UiBot中,無目標命令的最佳拍檔,是圖像命令。

圖像命令

除了常用的“鼠標”、“鍵盤”類之外,UiBot的“圖像”類命令也是很強大的。在UiBot Creator的命令區(qū),找到“圖像”,單擊展開,可以看到其中包含了如下圖所示的幾個命令:

UiBot Creator里面列出的“圖像”類命令

我們首先來看“查找圖像”這條命令,其作用是:首先指定一個圖像文件,格式可以是bmp、png、jpg等(推薦使用png格式,因為它是無損壓縮的),然后在屏幕上的指定區(qū)域,按照從左到右,從上到下的順序依次掃描,看這個圖像是否出現在指定區(qū)域當中。如果出現,則把其坐標值保存在一個變量中,否則發(fā)生異常。

看起來好像很復雜,又要指定圖像文件,又要指定掃描的區(qū)域。實際上,使用UiBot Creator的話,操作非常簡單。

比如,我們要模擬點擊微信(Windows版)窗口上的“登錄”按鈕。[前文][為什么沒有目標?]提到,微信Windows版是基于DirectUI的,無法獲取到界面元素作為目標。所以,需要用到圖像命令。

假設我們已經啟動了微信,并打開了登錄界面。下面,在UiBot Creator中編輯一個流程塊,并以雙擊或拖動的方式,插入一條“查找圖像”命令。點擊命令上的“查找目標”按鈕(如下圖左),和有目標命令類似,UiBot Creator也會暫時隱藏,圖標會變成一個箭頭和一張圖片的樣子(如下圖右)。此時,按下左鍵,并向右下方拖動,直到畫出一個藍框,且藍框中已經包含了要找的圖像,松開鼠標左鍵,大功告成!

使用“查找圖像”命令并指定圖像和查找范圍

看起來,上面的操作只是畫了一個藍框,但是,UiBot Creator已經幫我們做了兩件事情:

  1. 判斷藍框落在哪個窗口上,并記錄這個窗口的特征,將來找圖的時候,也需要先找到這個窗口,并在這個窗口的范圍內找圖。

  2. 對藍框所框住的部分截圖,自動保存為一個png格式的文件,并自動把這個文件保存在當前所編寫的流程所在目錄的res子目錄中。這就是將來要查找的圖片。

用鼠標單擊這條“查找圖像”命令,將其置為高亮狀態(tài),右邊的屬性欄會顯示出這條命令的屬性,如下圖所示:

“查找圖像”命令的屬性

其中,畫紅框的兩條屬性,也是最重要的兩條屬性,就是前面所說的,UiBot Creator幫我們做的兩件事情。其他各個屬性里面,“相似度”是一個0-1之間的數字,可以包含小數位,這個數字越接近1,UiBot在查找圖像時,越嚴格要求每個點都必須匹配上,通常取0.9,表示允許出現一小部分不匹配的情況,只要大體匹配即可。“光標位置”屬性的含義是,當找到圖像時,由于圖像是一個矩形,而命令輸出只是一個點的坐標,究竟要返回矩形中的哪個點的坐標,通常取“中心”即可?!凹せ畲翱凇睂傩员硎驹谡覉D之前,是否需要先把所查找的窗口放到前臺顯示。如果窗口被遮住了,即使窗口上有我們要找的圖像,也無法正確找到,所以這個屬性通常也設為“是”。

其他的屬性通常不用改,保持默認值就好。在“輸出到”屬性中,已經指定了一個變量名objPoint,如果成功的找到了圖像,會把結果保存在這個變量中。我們來看看這個變量中保存了什么內容:在命令區(qū)的“基本命令”類中找到“輸出調試信息”,將其插入到查找圖像命令的后面,并且在屬性中指定輸出內容為objPoint(注意objPoint不加雙引號,否則會把"objPoint"當作字符串輸出)。如圖所示:

用“輸出調試信息”查看結果

假設要查找的圖像確實能在屏幕上看到,運行這個流程塊后,得到結果:

{ "x" : 116, "y" : 235 }

具體的數值在不同的計算機上可能有所不同,但原理不變。這個值是一個“字典”數據類型,當這個值保存在變量objPoint中的時候,只需要寫 objPoint["x"]objPoint["y"] 即可得到其中的x和y值。

下面,得到了圖像的中心位置,只需要用鼠標去點擊這個位置,即可模擬微信的登錄操作了。選用“鼠標”類中包含的“模擬移動”和“模擬點擊”命令,即可很好的完成任務。

如下圖,“模擬移動”命令最關鍵的屬性,就是要操作的屏幕位置,分別輸入查找圖像的結果 objPoint["x"]objPoint["y"] 即可。移動完成后,再來一個“模擬點擊”,讓左鍵在登錄按鈕的中心點下去。至此,我們已經模擬出點擊“登錄”按鈕的全套操作。

用“輸出調試信息”查看結果

上面三條命令很容易看懂,即使是從來沒有學過UiBot的用戶,也能大致了解其含義。但是,僅僅為了點一個登錄按鈕,還需要三條命令才能完成,顯然過于復雜了。這時候,請再回頭看一下UiBot提供的“圖像”類下的所有命令,其中第一條命令叫“點擊圖像”,它其實就是“查找圖像”、“模擬移動”、“模擬點擊”三條命令的組合,只要插入一條“點擊圖像”命令,并按下命令上面的“查找目標”按鈕,拖動鼠標選擇要查找的窗口和要查找的圖像,即可快速完成模擬點擊微信“登錄”按鈕的功能。雖然是無目標的命令,但其操作便捷程度并不遜于有目標的命令。

有了上述基礎,對于其他幾條圖像類的命令,包括“鼠標移動到圖像上”、“判斷圖像是否存在”等等,您應該可以舉一反三了,本文不再贅述。

OCR命令

使用“圖像”類命令,可以在無法獲取界面元素的情況下,找到準確的操作位置。但還不能像有目標的命令那樣,把界面元素中的內容讀出來。仍以微信Windows版為例,我們可以依靠圖像命令來登錄微信并切換不同的聯系人,但對于聯系人發(fā)來的聊天內容,仍然無法獲取到(雖然這些內容用肉眼很容易看到),如圖所示。此時,就需要祭出UiBot的“OCR”類命令了。

![很難直接獲取微信中的聊天文字]!(https://upload-images.jianshu.io/upload_images/3353491-c28872835a6cb4a6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

OCR的全稱是“光學字符識別”,這是一項歷史悠久的技術,早在上個世紀,OCR就可以從紙質的書本中掃描并獲得其中的文字內容。如今,OCR的技術也在不斷演進,已經融入了流行的深度學習等技術,識別率不斷提高。我們現在用OCR去識別屏幕上的文字,由于這些文字不像紙質書本一樣存在印刷模糊、光線不好等問題,所以識別率是非常高的。

當然,術業(yè)有專攻,OCR是RPA的好伙伴,但OCR的專業(yè)性較強,需要深厚的積累才能做好。通常RPA廠商不會自己去做OCR,而是直接接入第三方的OCR服務。在UiBot中,默認接入的就是百度云的OCR服務,因為百度云的OCR技術在國內廠商中還是比較強大的,不僅能識別界面上的文字、數字等,還對發(fā)票、身份證、火車票等票證的圖像進行了特別優(yōu)化,能較為準確的識別其中的關鍵內容(如發(fā)票號碼、發(fā)票金額等)。

為了能夠正常接入百度云的OCR,首先需要滿足以下三個要求:

  • 要能夠接入互聯網。百度云是基于互聯網的云服務,而不是本地運行的軟件,個人使用的話,必須接入互聯網。如果是企業(yè)用途,不能接入互聯網,可能需要和百度云進行商務磋商,購買其離線服務。

  • 可能需要向百度付費。百度云OCR服務是收費的,但提供了每天若干次(通用文字識別每天5000次,證照等識別每天500次)的免費額度。個人使用的話,免費額度也基本夠用了。當然,百度可能會隨時修改免費額度和收費價格等政策,我們無法預估您需要向百度付多少費用。

  • 由于百度云是收費的,不可能UiBot的用戶都共用一個賬號。所以每個用戶要申請自己的百度云賬號,以及百度云OCR服務的賬號(一般稱為Access Key和Secret Key),申請方法很簡單,請點擊這里查看我們的在線教程。

UiBot中包含了以下的OCR命令:

UiBot的OCR命令

其中,紅框里的命令類似于“圖像”類中的“點擊圖像”、“鼠標移動到圖像上”,“查找圖像”命令,只不過不需要傳入圖像了,只需要在屬性中標明要找的文字即可。

藍框里的命令和綠框里的命令類似,只不過前者需要提供一個圖像文件,后者需要提供一個窗口、以及窗口中的一個區(qū)域,UiBot會在流程運行到這一行的時候,自動在窗口的指定區(qū)域截圖并保存為一個文件,然后采用和前者一樣的方式去執(zhí)行。

我們先試一下“屏幕OCR”命令。雙擊或拖動插入一條“屏幕OCR”命令,點擊命令上的“查找目標”按鈕(此時UiBot Creator的窗口會暫時隱藏);把鼠標移動到微信窗口上,微信窗口會被紅框藍底的遮罩遮??;此時拖動鼠標,劃出一個要進行文字識別的區(qū)域,這個區(qū)域會用紫色框表示。如下圖所示。

選擇OCR目標

這樣的一條命令,會在運行的時候,自動找到微信的窗口,并在紫色框指定的位置(相對于微信窗口的位置)截圖,然后識別截圖里面的文字,最后把識別到的文字保存在變量sText中。

先不要急著運行,我們還需要選中這條命令,在“屬性”中填寫我們在百度云上申請的Access Key和Secret Key。注意Access Key和Secret Key都是字符串,所以需要保留左右兩邊的雙引號。OCR命令完成之后,為了看到效果,最好加入一條“輸出到調試窗口”命令,并指定輸出變量sText。注意sText是變量名,而不是字符串,所以兩邊不加雙引號。

完成一條OCR命令

運行這個流程塊,即可看到效果。只要微信窗口存在,且窗口大小沒有發(fā)生變化,就能識別出當前聊天人(或微信群)的名字。

下面,再測試一下“圖像特殊OCR識別”命令。所謂“特殊”,是指我們要測試的是某種特定的圖像,如身份證、火車票等。假設我們在D:\\1.png文件中保存了如下的圖像:

要進行特殊OCR的圖像

插入一條“圖像特殊OCR識別”命令,按圖示修改其屬性。除了前文提到的Access Key和Secret Key之外,還需要指定要識別的圖片的文件名,以及選擇OCR引擎為“火車票識別”。其他屬性均保持默認值,運行后,可以在輸出欄看到識別的結果。這個結果實際上是一個JSON文檔,如果需要進一步處理,需要采用UiBot提供的JSON類命令,但與本章關系不大,略過不表。

特殊OCR的屬性設置

注意事項

在上一章中,我們學習了有目標的命令,而在這一章中學習了無目標的命令。其實,在大多數情況下,無目標命令也不是對著一個固定的屏幕位置進行操作,而是結合圖像、OCR等命令,動態(tài)的在屏幕上找到要操作的位置。

那么,我們該選擇有目標的命令,還是無目標的命令呢?只要能獲得恰當的界面元素作為目標,就應該優(yōu)先考慮有目標的命令。因為無目標的命令,特別是它們所依賴的圖像、OCR等命令,有以下的缺點:

  • 速度遠遠慢于有目標的命令;
  • 可能受到遮擋的影響,當圖像被遮擋時,即使只遮擋了一部分,也可能受到很大影響;
  • 往往需要依賴圖像文件,一旦丟失圖像文件就不能正常運行;
  • OCR命令還必須連接互聯網才能運行。

當然,這些缺點也是可以緩解的,以下技巧能幫您更好的使用圖像、OCR命令:

首先,請牢記一個“小”字。在截圖時,盡量截取較小的圖像,只要能表達出所操作的界面元素的基本特征即可。在指定查找的區(qū)域時,盡量縮小區(qū)域。這樣不僅速度會有所改善,而且也不容易受到遮擋的影響。比如下圖中的“登錄”按鈕,沒必要像左圖一樣,把整個按鈕作為一幅圖像來查找,只要像右圖一樣選擇最關鍵的部分就可以了。

選擇較小的截圖

其次,大部分圖像命令都支持“相似度”的屬性,這個屬性的初始值是0.9,如果設置過低,可能造成“錯選”,如果設置過高,可能造成“漏選”(“錯選”和“漏選”的概念請參考[上一章][目標編輯])。可以根據實際情況進行調整,并測試其效果,選擇最佳的相似度。

然后,屏幕的分辨率和屏幕的縮放比例對圖像命令可能有非常關鍵的影響。因為在不同的分辨率下,軟件的界面顯示可能完全不一樣,導致圖像命令失效。所以,請盡量保持運行流程的計算機和開發(fā)流程的計算機的分辨率、縮放比例都是一致的。在Windows 10操作系統上設置分辨率和縮放比例的界面如下圖所示:

設置分辨率和縮放比例

最后,無論是圖像命令還是OCR命令,當需要使用圖像文件時,可以用一個絕對路徑來測試,如前面例子中的D:\\1.png。但是,這就要求在運行此流程的計算機上,也必須在同一路徑下有同樣的文件,否則就會出錯。有一個改進的方法,就是在您的流程所在的文件夾中,可以看到一個名為res的文件夾,把圖像或其他文件放在這個文件夾中,并在流程中使用@res"1.png"來代表這個文件即可。這樣的話,當前流程發(fā)布給UiBot Worker使用的時候,也會自動帶上這個文件。并且無論UiBot Worker把這個流程放在哪個路徑下,都會自動修改@res前綴所代表的路徑,使其始終有效。


返回目錄

注: 上述內容經 UiBot 官方 授權發(fā)布,版權歸 UiBot 官方所有,如需轉載請先聯系。

更多 RPA 相關的資訊,請關注公眾號:流程自動化機器人教程
由于簡書禁止直接在文章中插入公眾號二維碼,請點擊 這里 了解添加該公眾號的細節(jié)。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • ORA-00001: 違反唯一約束條件 (.) 錯誤說明:當在唯一索引所對應的列上鍵入重復值時,會觸發(fā)此異常。 O...
    我想起個好名字閱讀 5,957評論 0 9
  • Swift1> Swift和OC的區(qū)別1.1> Swift沒有地址/指針的概念1.2> 泛型1.3> 類型嚴謹 對...
    cosWriter閱讀 11,641評論 1 32
  • 回顧一下2019春節(jié)檔的兩部國產電影,《新喜劇之王》和《瘋狂外星人》。相信很多朋友都看過,為什么把這兩部放一起呢,...
    九五自尊閱讀 592評論 0 3
  • 進入高三,頻繁的考試就成為了家常便飯。后天又要進行聯考了,我覺得有必要給學生們做個動員,好讓他們更有信心的去面對本...
    雪后山閱讀 999評論 2 14
  • . 忘記昨天,珍惜今天,期待明天。 .
    情愫mst閱讀 269評論 0 0

友情鏈接更多精彩內容