無目標命令
在[上一章][界面元素]中箫津,我們講述了界面元素,以及如何選取一個界面元素作為目標婆硬,以便使用有目標的命令狠轻。當然,并非在所有的情況下彬犯,都能準確找到恰當?shù)慕缑嬖刈鳛槟繕讼蚵ァR虼耍覀冃枰獙W會使用“無目標命令”躏嚎,以備不時之需蜜自。
為什么沒有目標?
在[上一章][界面元素]中提到卢佣,我們在查找重荠、操作界面元素的時候,實際上都是在調用界面元素所在的軟件給我們提供的接口虚茶。UiBot 所做的戈鲁,實際上是把這些種類各異的接口統(tǒng)一起來了,讓編寫流程的人無需關注這些細節(jié)嘹叫。但是婆殿,仍然會有一些軟件,沒有給我們提供查找罩扇、操作界面元素的接口婆芦,或者雖然提供了接口,但在最終發(fā)布時關閉了喂饥。這些軟件包括:
- 虛擬機和遠程桌面
包含Citrix消约、VMWare、Hyper-V员帮、VirtualBox或粮、遠程桌面(RDP)、各種安卓模擬器(如靠譜助手)等捞高。這些程序都有單獨的操作系統(tǒng)在運行氯材,和UiBot所在的操作系統(tǒng)是完全隔離的,UiBot自然無法操作另一個操作系統(tǒng)里面的界面元素硝岗。
當然氢哮,如果條件允許的話,可以把UiBot和流程涉及到的軟件型檀,都安裝在虛擬機里冗尤,或者遠程計算機里。這樣一來,這些軟件提供的接口就可以被UiBot直接使用了生闲,因為它們還是運行在同一個操作系統(tǒng)里面的,本地計算機只是起到了一個顯示器的作用而已月幌。
- 基于DirectUI的軟件
以前碍讯,Windows軟件界面的開發(fā)框架都是微軟提供的,包括MFC扯躺、WTL捉兴、WinForm、WPF等录语。微軟很貼心的為這些框架制作出來的界面都提供了自動化操作的接口倍啥。近年來,
為了讓軟件界面更好看澎埠,也更容易制作虽缕,很多廠商或開發(fā)團隊推出了自己的Windows軟件界面開發(fā)框架。這類框架統(tǒng)稱為DirectUI蒲稳。用這些框架制作的界面氮趋,其界面元素都是“畫”出來的,雖然人眼可以看到江耀,但操作系統(tǒng)和其他程序都不知道界面元素到底在哪里剩胁。有的DirectUI框架提供了對外的接口,可以找到界面元素祥国,有的則根本沒有提供這樣的接口昵观,其他程序,包括UiBot舌稀,自然也無法找到界面元素啊犬。
實際上,UiBot Creator扩借、UiBot Worker本身的界面就是用一種DirectUI框架開發(fā)的椒惨,這種框架稱為electron。electron其實提供了界面元素的查找接口潮罪,但對外發(fā)布的版本默認都關閉了康谆。所以,細心的讀者可能會發(fā)現(xiàn)嫉到,UiBot里面的界面元素沃暗,反而是市面上任何RPA平臺,包括UiBot自己何恶,都無法找到的孽锥。
還有一個我們常用的基于DirectUI的軟件,就是微信的Windows客戶端。由于騰訊并未對外透漏惜辑,我們無法得知微信的Windows客戶端使用了哪種DirectUI框架唬涧。但事實表明,這種框架并未提供界面元素的接口盛撑,所以也是市面上任何RPA平臺都無法找到的碎节。不過,微信還提供了基于瀏覽器的網(wǎng)頁版抵卫,可以獲得界面元素狮荔,推薦大家在RPA流程中使用。
- 游戲
由于游戲的界面強調美觀和個性化介粘,所以殖氏,一般游戲的界面元素都是“畫”出來的,原理上和DirectUI類似姻采。這種界面通常也沒有提供接口雅采,告知我們界面元素的位置。和基于DirectUI的軟件不同的是偎谁,游戲界面變化速度快总滩,對時效性的要求更高,一般來說巡雨,RPA平臺并未針對游戲進行優(yōu)化闰渔,所以在游戲上使用的效果不會太好。
如果要在游戲上使用自動操作铐望,推薦使用按鍵精靈冈涧。按鍵精靈是專門為游戲設計的,內置了很多針對游戲的界面查找手段正蛙,比如單點顏色比對督弓、多點顏色比對、圖像查找乒验,等等愚隧。且運行效率更高。
無目標命令
我們在[上一章][界面元素]中介紹了“有目標”的命令锻全,相對的狂塘,UiBot也有“無目標”的命令。如下圖所示鳄厌,紅框中表示有目標的命令荞胡,藍框中表示無目標的命令。
如果遇到了沒有目標的Windows軟件了嚎,“有目標命令”自然就不能再用了泪漂,但仍然可以用“無目標命令”廊营。
在圖中這些無目標的命令里面,最重要的是“模擬移動”萝勤,因為“模擬移動”需要我們在命令中指定一個坐標點露筒,在執(zhí)行這條命令的時候,鼠標指針也會移動到這個坐標點敌卓;移動之后邀窃,我們再使用“模擬點擊”命令,模擬按下左鍵假哎,才能正確的按下某個按鈕;或者正確的在某個輸入框上設置焦點鞍历,之后舵抹,再使用“輸入文本”命令,才能在焦點所在的輸入框里面輸入一段文本劣砍。
比如惧蛹,有一個輸入框,其中間的坐標是x:200, y:300刑枝。那么我們就需要先用“模擬移動”香嗓,并設定移動的坐標為x:200, y:300;再用“模擬點擊”按下左鍵装畅,設置焦點靠娱;再用“輸入文本”,才能正常輸入掠兄。否則像云,直接用“輸入文本”的話,很大概率就輸入到其他輸入框里面了蚂夕。
這里迅诬,我們有必要先解釋一下Windows操作系統(tǒng)的屏幕坐標系。如果您之前了解Windows的屏幕坐標系婿牍,這一段可以跳過不看侈贷。
在Windows操作系統(tǒng)中,屏幕上的每一點都有一個唯一的坐標等脂,坐標由兩個整數(shù)組成俏蛮,一個稱為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所對應的點底靠,其位置大致如下圖中紅圈所示:
只要有x和y兩個整數(shù)值害晦,就可以確定屏幕上一個點的位置。在UiBot中暑中,有一些命令可以獲得屏幕上某點的位置壹瘟,并輸出到一個變量里。如何用一個變量來保存x和y兩個值呢鳄逾?我們在[后文][語言參考]中學習UiBot所使用的Botscript語言的時候會了解到稻轨,BotScript中有“字典”數(shù)據(jù)類型,可以保存多個值雕凹。所以殴俱,UiBot在輸出一個點的位置的時候,會輸出到一個字典類型的變量中枚抵。假設這個變量名為pnt
线欲,則使用pnt["x"]
和pnt["y"]
即可得到坐標的x和y兩個值。
假如我們要找的界面元素在屏幕上的固定位置汽摹,那么用固定的坐標李丰,配合無目標命令,即可正常模擬操作逼泣。但這種情況往往比較少見嫌套,因為Windows是多窗口系統(tǒng),每個窗口的位置都可以被拖動圾旨,導致窗口里面的界面元素的位置也會發(fā)生變化踱讨。而且,在微信這樣的軟件中砍的,聯(lián)系人的位置也不是固定的痹筛,而是根據(jù)最近聯(lián)系的時間排序的,位置隨時可能發(fā)生變化廓鞠。
所以帚稠,在UiBot中,一般不推薦直接寫固定的坐標床佳,因為變化的情況太多了滋早,很難一一考慮周全。通常砌们,如果使用無目標的命令杆麸,需要搭配其他命令使用搁进,讓其他命令能根據(jù)某種特征,找到界面元素的坐標昔头,然后把找到的坐標當作變量饼问,傳給這些無目標命令。
在UiBot中揭斧,無目標命令的最佳拍檔莱革,是圖像命令。
圖像命令
除了常用的“鼠標”讹开、“鍵盤”類之外盅视,UiBot的“圖像”類命令也是很強大的。在UiBot Creator的命令區(qū)旦万,找到“圖像”左冬,單擊展開,可以看到其中包含了如下圖所示的幾個命令:
我們首先來看“查找圖像”這條命令纸型,其作用是:首先指定一個圖像文件,格式可以是bmp梅忌、png狰腌、jpg等(推薦使用png格式,因為它是無損壓縮的)牧氮,然后在屏幕上的指定區(qū)域琼腔,按照從左到右,從上到下的順序依次掃描踱葛,看這個圖像是否出現(xiàn)在指定區(qū)域當中丹莲。如果出現(xiàn),則把其坐標值保存在一個變量中尸诽,否則發(fā)生異常甥材。
看起來好像很復雜,又要指定圖像文件性含,又要指定掃描的區(qū)域洲赵。實際上,使用UiBot Creator的話商蕴,操作非常簡單叠萍。
比如,我們要模擬點擊微信(Windows版)窗口上的“登錄”按鈕绪商。[前文][為什么沒有目標苛谷?]提到,微信Windows版是基于DirectUI的格郁,無法獲取到界面元素作為目標腹殿。所以独悴,需要用到圖像命令。
假設我們已經啟動了微信赫蛇,并打開了登錄界面绵患。下面,在UiBot Creator中編輯一個流程塊悟耘,并以雙擊或拖動的方式落蝙,插入一條“查找圖像”命令。點擊命令上的“查找目標”按鈕(如下圖左)暂幼,和有目標命令類似筏勒,UiBot Creator也會暫時隱藏,圖標會變成一個箭頭和一張圖片的樣子(如下圖右)旺嬉。此時管行,按下左鍵,并向右下方拖動邪媳,直到畫出一個藍框捐顷,且藍框中已經包含了要找的圖像,松開鼠標左鍵雨效,大功告成迅涮!
看起來,上面的操作只是畫了一個藍框徽龟,但是叮姑,UiBot Creator已經幫我們做了兩件事情:
判斷藍框落在哪個窗口上,并記錄這個窗口的特征据悔,將來找圖的時候传透,也需要先找到這個窗口,并在這個窗口的范圍內找圖极颓。
對藍框所框住的部分截圖朱盐,自動保存為一個png格式的文件,并自動把這個文件保存在當前所編寫的流程所在目錄的res子目錄中菠隆。這就是將來要查找的圖片托享。
用鼠標單擊這條“查找圖像”命令,將其置為高亮狀態(tài)浸赫,右邊的屬性欄會顯示出這條命令的屬性闰围,如下圖所示:
其中,畫紅框的兩條屬性既峡,也是最重要的兩條屬性羡榴,就是前面所說的,UiBot Creator幫我們做的兩件事情运敢。其他各個屬性里面校仑,“相似度”是一個0-1之間的數(shù)字忠售,可以包含小數(shù)位,這個數(shù)字越接近1迄沫,UiBot在查找圖像時稻扬,越嚴格要求每個點都必須匹配上,通常取0.9羊瘩,表示允許出現(xiàn)一小部分不匹配的情況泰佳,只要大體匹配即可〕韭穑“光標位置”屬性的含義是逝她,當找到圖像時,由于圖像是一個矩形睬捶,而命令輸出只是一個點的坐標黔宛,究竟要返回矩形中的哪個點的坐標,通常取“中心”即可擒贸⊥位危“激活窗口”屬性表示在找圖之前,是否需要先把所查找的窗口放到前臺顯示介劫。如果窗口被遮住了徽惋,即使窗口上有我們要找的圖像,也無法正確找到蜕猫,所以這個屬性通常也設為“是”。
其他的屬性通常不用改哎迄,保持默認值就好回右。在“輸出到”屬性中,已經指定了一個變量名objPoint漱挚,如果成功的找到了圖像翔烁,會把結果保存在這個變量中。我們來看看這個變量中保存了什么內容:在命令區(qū)的“基本命令”類中找到“輸出調試信息”旨涝,將其插入到查找圖像命令的后面蹬屹,并且在屬性中指定輸出內容為objPoint(注意objPoint不加雙引號,否則會把"objPoint"當作字符串輸出)白华。如圖所示:
假設要查找的圖像確實能在屏幕上看到慨默,運行這個流程塊后,得到結果:
{ "x" : 116, "y" : 235 }
具體的數(shù)值在不同的計算機上可能有所不同弧腥,但原理不變厦取。這個值是一個“字典”數(shù)據(jù)類型,當這個值保存在變量objPoint中的時候管搪,只需要寫 objPoint["x"]
和 objPoint["y"]
即可得到其中的x和y值虾攻。
下面铡买,得到了圖像的中心位置,只需要用鼠標去點擊這個位置霎箍,即可模擬微信的登錄操作了奇钞。選用“鼠標”類中包含的“模擬移動”和“模擬點擊”命令,即可很好的完成任務漂坏。
如下圖景埃,“模擬移動”命令最關鍵的屬性,就是要操作的屏幕位置樊拓,分別輸入查找圖像的結果 objPoint["x"]
和 objPoint["y"]
即可纠亚。移動完成后,再來一個“模擬點擊”筋夏,讓左鍵在登錄按鈕的中心點下去蒂胞。至此条篷,我們已經模擬出點擊“登錄”按鈕的全套操作。
上面三條命令很容易看懂鸿染,即使是從來沒有學過UiBot的用戶,也能大致了解其含義乞巧。但是,僅僅為了點一個登錄按鈕蚕冬,還需要三條命令才能完成,顯然過于復雜了是辕。這時候囤热,請再回頭看一下UiBot提供的“圖像”類下的所有命令获三,其中第一條命令叫“點擊圖像”,它其實就是“查找圖像”棺聊、“模擬移動”贞谓、“模擬點擊”三條命令的組合,只要插入一條“點擊圖像”命令犀暑,并按下命令上面的“查找目標”按鈕,拖動鼠標選擇要查找的窗口和要查找的圖像徊都,即可快速完成模擬點擊微信“登錄”按鈕的功能。雖然是無目標的命令颂鸿,但其操作便捷程度并不遜于有目標的命令。
有了上述基礎房轿,對于其他幾條圖像類的命令所森,包括“鼠標移動到圖像上”、“判斷圖像是否存在”等等纷妆,您應該可以舉一反三了晴弃,本文不再贅述上鞠。
OCR命令
使用“圖像”類命令旗国,可以在無法獲取界面元素的情況下注整,找到準確的操作位置肿轨。但還不能像有目標的命令那樣,把界面元素中的內容讀出來驼唱。仍以微信Windows版為例玫恳,我們可以依靠圖像命令來登錄微信并切換不同的聯(lián)系人,但對于聯(lián)系人發(fā)來的聊天內容掀序,仍然無法獲取到(雖然這些內容用肉眼很容易看到)不恭,如圖所示财饥。此時钥星,就需要祭出UiBot的“OCR”類命令了。
![很難直接獲取微信中的聊天文字]!(https://upload-images.jianshu.io/upload_images/3353491-c28872835a6cb4a6.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
OCR的全稱是“光學字符識別”暴拄,這是一項歷史悠久的技術乖篷,早在上個世紀透且,OCR就可以從紙質的書本中掃描并獲得其中的文字內容秽誊。如今,OCR的技術也在不斷演進锅论,已經融入了流行的深度學習等技術最易,識別率不斷提高藻懒。我們現(xiàn)在用OCR去識別屏幕上的文字,由于這些文字不像紙質書本一樣存在印刷模糊归敬、光線不好等問題,所以識別率是非常高的椅亚。
當然什往,術業(yè)有專攻别威,OCR是RPA的好伙伴驴剔,但OCR的專業(yè)性較強丧失,需要深厚的積累才能做好。通常RPA廠商不會自己去做OCR琳拭,而是直接接入第三方的OCR服務白嘁。在UiBot中膘流,默認接入的就是百度云的OCR服務呼股,因為百度云的OCR技術在國內廠商中還是比較強大的彭谁,不僅能識別界面上的文字、數(shù)字等则奥,還對發(fā)票逞度、身份證妙啃、火車票等票證的圖像進行了特別優(yōu)化揖赴,能較為準確的識別其中的關鍵內容(如發(fā)票號碼燥滑、發(fā)票金額等)。
為了能夠正常接入百度云的OCR赃蛛,首先需要滿足以下三個要求:
要能夠接入互聯(lián)網(wǎng)呕臂。百度云是基于互聯(lián)網(wǎng)的云服務歧蒋,而不是本地運行的軟件州既,個人使用的話吴叶,必須接入互聯(lián)網(wǎng)。如果是企業(yè)用途敌呈,不能接入互聯(lián)網(wǎng)磕洪,可能需要和百度云進行商務磋商析显,購買其離線服務签赃。
可能需要向百度付費锦聊。百度云OCR服務是收費的孔庭,但提供了每天若干次(通用文字識別每天5000次,證照等識別每天500次)的免費額度怎抛。個人使用的話马绝,免費額度也基本夠用了富稻。當然椭赋,百度可能會隨時修改免費額度和收費價格等政策,我們無法預估您需要向百度付多少費用苟跪。
由于百度云是收費的件已,不可能UiBot的用戶都共用一個賬號篷扩。所以每個用戶要申請自己的百度云賬號茉盏,以及百度云OCR服務的賬號(一般稱為Access Key和Secret Key)鸠姨,申請方法很簡單讶迁,請點擊這里查看我們的在線教程巍糯。
UiBot中包含了以下的OCR命令:
其中祟峦,紅框里的命令類似于“圖像”類中的“點擊圖像”宅楞、“鼠標移動到圖像上”,“查找圖像”命令搓幌,只不過不需要傳入圖像了溉愁,只需要在屬性中標明要找的文字即可拐揭。
藍框里的命令和綠框里的命令類似堂污,只不過前者需要提供一個圖像文件龄砰,后者需要提供一個窗口换棚、以及窗口中的一個區(qū)域固蚤,UiBot會在流程運行到這一行的時候夕玩,自動在窗口的指定區(qū)域截圖并保存為一個文件燎孟,然后采用和前者一樣的方式去執(zhí)行。
我們先試一下“屏幕OCR”命令领迈。雙擊或拖動插入一條“屏幕OCR”命令狸捅,點擊命令上的“查找目標”按鈕(此時UiBot Creator的窗口會暫時隱藏)尘喝;把鼠標移動到微信窗口上朽褪,微信窗口會被紅框藍底的遮罩遮椎拊嗤堰;此時拖動鼠標,劃出一個要進行文字識別的區(qū)域告匠,這個區(qū)域會用紫色框表示后专。如下圖所示戚哎。
這樣的一條命令建瘫,會在運行的時候尸折,自動找到微信的窗口实夹,并在紫色框指定的位置(相對于微信窗口的位置)截圖亮航,然后識別截圖里面的文字缴淋,最后把識別到的文字保存在變量sText中重抖。
先不要急著運行钟沛,我們還需要選中這條命令恨统,在“屬性”中填寫我們在百度云上申請的Access Key和Secret Key。注意Access Key和Secret Key都是字符串畴蒲,所以需要保留左右兩邊的雙引號模燥。OCR命令完成之后涧窒,為了看到效果锭亏,最好加入一條“輸出到調試窗口”命令慧瘤,并指定輸出變量sText锅减。注意sText是變量名怔匣,而不是字符串每瞒,所以兩邊不加雙引號剿骨。
運行這個流程塊浓利,即可看到效果钞速。只要微信窗口存在贷掖,且窗口大小沒有發(fā)生變化,就能識別出當前聊天人(或微信群)的名字渴语。
下面羽资,再測試一下“圖像特殊OCR識別”命令。所謂“特殊”遵班,是指我們要測試的是某種特定的圖像屠升,如身份證潮改、火車票等。假設我們在D:\\1.png
文件中保存了如下的圖像:
插入一條“圖像特殊OCR識別”命令汇在,按圖示修改其屬性。除了前文提到的Access Key和Secret Key之外脏答,還需要指定要識別的圖片的文件名糕殉,以及選擇OCR引擎為“火車票識別”。其他屬性均保持默認值殖告,運行后阿蝶,可以在輸出欄看到識別的結果。這個結果實際上是一個JSON文檔黄绩,如果需要進一步處理羡洁,需要采用UiBot提供的JSON類命令,但與本章關系不大爽丹,略過不表筑煮。
注意事項
在上一章中,我們學習了有目標的命令粤蝎,而在這一章中學習了無目標的命令真仲。其實,在大多數(shù)情況下初澎,無目標命令也不是對著一個固定的屏幕位置進行操作秸应,而是結合圖像、OCR等命令碑宴,動態(tài)的在屏幕上找到要操作的位置软啼。
那么,我們該選擇有目標的命令墓懂,還是無目標的命令呢焰宣?只要能獲得恰當?shù)慕缑嬖刈鳛槟繕耍蛻搩?yōu)先考慮有目標的命令捕仔。因為無目標的命令匕积,特別是它們所依賴的圖像、OCR等命令榜跌,有以下的缺點:
- 速度遠遠慢于有目標的命令闪唆;
- 可能受到遮擋的影響,當圖像被遮擋時钓葫,即使只遮擋了一部分悄蕾,也可能受到很大影響;
- 往往需要依賴圖像文件,一旦丟失圖像文件就不能正常運行帆调;
- OCR命令還必須連接互聯(lián)網(wǎng)才能運行奠骄。
當然,這些缺點也是可以緩解的番刊,以下技巧能幫您更好的使用圖像含鳞、OCR命令:
首先,請牢記一個“小”字芹务。在截圖時蝉绷,盡量截取較小的圖像,只要能表達出所操作的界面元素的基本特征即可枣抱。在指定查找的區(qū)域時熔吗,盡量縮小區(qū)域。這樣不僅速度會有所改善佳晶,而且也不容易受到遮擋的影響桅狠。比如下圖中的“登錄”按鈕,沒必要像左圖一樣宵晚,把整個按鈕作為一幅圖像來查找垂攘,只要像右圖一樣選擇最關鍵的部分就可以了维雇。
其次淤刃,大部分圖像命令都支持“相似度”的屬性,這個屬性的初始值是0.9吱型,如果設置過低逸贾,可能造成“錯選”,如果設置過高津滞,可能造成“漏選”(“錯選”和“漏選”的概念請參考[上一章][目標編輯])铝侵。可以根據(jù)實際情況進行調整触徐,并測試其效果咪鲜,選擇最佳的相似度。
然后撞鹉,屏幕的分辨率和屏幕的縮放比例對圖像命令可能有非常關鍵的影響疟丙。因為在不同的分辨率下,軟件的界面顯示可能完全不一樣鸟雏,導致圖像命令失效享郊。所以,請盡量保持運行流程的計算機和開發(fā)流程的計算機的分辨率孝鹊、縮放比例都是一致的炊琉。在Windows 10操作系統(tǒng)上設置分辨率和縮放比例的界面如下圖所示:
最后,無論是圖像命令還是OCR命令又活,當需要使用圖像文件時苔咪,可以用一個絕對路徑來測試锰悼,如前面例子中的D:\\1.png
。但是团赏,這就要求在運行此流程的計算機上松捉,也必須在同一路徑下有同樣的文件,否則就會出錯馆里。有一個改進的方法隘世,就是在您的流程所在的文件夾中,可以看到一個名為res的文件夾鸠踪,把圖像或其他文件放在這個文件夾中丙者,并在流程中使用@res"1.png"
來代表這個文件即可。這樣的話营密,當前流程發(fā)布給UiBot Worker使用的時候械媒,也會自動帶上這個文件。并且無論UiBot Worker把這個流程放在哪個路徑下评汰,都會自動修改@res
前綴所代表的路徑纷捞,使其始終有效。
返回目錄
注: 上述內容經 UiBot 官方 授權發(fā)布被去,版權歸 UiBot 官方所有主儡,如需轉載請先聯(lián)系。
更多 RPA 相關的資訊惨缆,請關注公眾號:流程自動化機器人教程
由于簡書禁止直接在文章中插入公眾號二維碼糜值,請點擊 這里 了解添加該公眾號的細節(jié)。