我們以前講過怎樣使用 Python 在浏覽器中實現頁面自動化操作,不管用哪種方式實現,都是通過定位頁面中的元素來進行相應的操作。
今天我們來聊一聊如何在桌面實現自動化操作。與浏覽器頁面自動化操作類似,桌面自動化操作也是需要定位鼠標在桌面的位置,然後根據定位的位置執行對應的操作。
我們今天的主人公是 pyautogui,pyautogui 是一個純 Python 的 GUI 自動化工具,通過它可以讓程序自動控制鼠標和鍵盤的一系列操作來達到自動化測試的目的。
這個模塊的安裝也是老一套:
pip3 install pyautogui
安裝好了就可以直接使用了。
桌面操作最基本的就是鼠標操作了,我們可以控制鼠標的移動:
# 移動鼠標
pyautogui.moveTo(200,400,duration=2)
pyautogui.moveRel(200,500,duration=2)
整個桌面是以左上角為坐標軸的原點,所有的操作都以這個原點,來確定操作位置。
第一行是將鼠標移動到指定的像素(200,400)位置,第二行代碼是將鼠標按照當前點向右移動200px,向下移動400px這個方向移動。
兩行代碼中都有一個共同的參數 duration,這個參數表示移動時間,即在指定時間內完成移動操作,單位是秒。
運行這兩行代碼,觀察屏幕鼠標的變化,是不是很神奇?
我們還可以獲取鼠標位置:
print(pyautogui.position())
這個很好理解,就是獲取鼠標在當前屏幕中的坐標位置,運行這行代碼,我們會得到諸如下面的信息:
Point(x=400, y=900)
通常,我們的鼠標有左右兩個按鍵,高級點的鼠標中間還有個按鍵。
我的鼠標只有兩個按鍵,中間沒有按鍵,唉~
pyautogui針對這三個按鍵操作都有相應的處理:
# 鼠標點擊,默認左鍵
pyautogui.click(100,100)
# 單擊左鍵
pyautogui.click(100,100,button='left')
# 單擊右鍵
pyautogui.click(100,300,button='right')
# 單擊中間
pyautogui.click(100,300,button='middle')
鼠標點擊,如果不指定 button 參數,默認是點擊左鍵,前面兩個參數就是點擊坐標的位置。
運行這段代碼,看看你的桌面會發生什麼?
鼠標除了點擊操作,還有雙擊操作:
# 雙擊左鍵
pyautogui.doubleClick(10,10)
# 雙擊右鍵
pyautogui.rightClick(10,10)
# 雙擊中鍵
pyautogui.middleClick(10,10)
操作函數也很簡單,相信大家一眼就能看明白,如果一眼看不明白,請多看幾眼!
熟悉前端的小伙伴可能會馬上聯想到,鼠標操作有按下和釋放的過程,我們屏幕操作也有對應的控制:
# 鼠標按下
pyautogui.mouseDown()
# 鼠標釋放
pyautogui.mouseUp()
我們可以控制鼠標拖動到指定坐標位置,並且設置操作時間:
pyautogui.dragTo(100,300,duration=1)
這個運行效果和前面移動類似。
根據前面移動的經驗,我們也有按照方向拖動鼠標:
pyautogui.dragRel(100,300,duration=4)
在桌面操作中,我們有時候需要滾動鼠標到達向上或者向下的位置,這時候我們可以使用 scroll 這個函數來控制:
pyautogui.scroll(30000)
參數是整數,表示向上或向下滾動多少個單位,這個單位根據不同的操作系統可能不一樣。如果向上滾動,傳入正整數,向下滾動傳入負整數。
我們先來假設一個場景:我現在要在屏幕上找到一個紅色的點,你會怎麼做?通常的做法是拿到這個紅色點的顏色值,然後再對屏幕上的點逐個進行比較,直到找到為止。
pyautogui 為我們這個操作場景提供了支持,分別有三個函數可以完成這三件事情。
im = pyautogui.screenshot()
im.save('screenshot.png')
rgb = im.getpixel((100, 500))
print(rgb)
match = pyautogui.pixelMatchesColor(500,500,(12,120,400))
print(match)
第一個是獲取屏幕截圖函數,它可以返回一個 Pillow 的 image 對象; 第二個是獲取屏幕截圖中指定坐標點的顏色,返回 rgb 顏色值;第三個是將指定坐標點的顏色和目標的顏色進行比對,返回布爾值。
我們再來升級一下需求:
我現在要在屏幕上找到 edge 浏覽器的圖標,你會怎麼做?
通常的做法是先知道 edge 浏覽器的圖標長啥樣,是綠色還是藍色,是胖的還是瘦的,對吧?然後再在屏幕上去進行圖標的匹配,直到找到一個圖標跟我們目標圖標一樣,就得到了結果。
於是,我們的代碼如下:
# 圖像識別(一個)
oneLocation = pyautogui.locateOnScreen('1.png')
print(oneLocation)
# 圖像識別(多個)
allLocation = pyautogui.locateAllOnScreen('1.png')
print(list(allLocation))
你可以在桌面上將某個應用的圖標截取下來,保存為圖片,然後使用上面幾行代碼來識別,識別成功,你會返回類似下面的結果:
Box(left=20, top=89, width=33, height=34)
[Box(left=20, top=89, width=33, height=34)]
這就是圖片在桌面的位置,如果找不到圖片,就會返回 None。
鍵盤輸入有下面幾個常用的函數:
舉個例子,大家平時輸入感歎號(!)是怎麼操作鍵盤的?
按住 shift 按鍵,然後再按住 1 按鍵,就可以了。用 pyautogui 控制就是:
pyautogui.keyDown('shift')
pyautogui.press('1')
pyautogui.keyUp('shift')
運行上面的代碼,如果你的鼠標是放在編輯框中,你會得到一個感歎號!
我們還可以直接輸出內容:
pyautogui.typewrite('python', 1)
第一個參數是輸出的內容,第二個參數是間隔時間,單位是秒。
運行上面代碼,你的編輯器裡面就會每隔1秒鐘按順序輸出 python 的6個字母。
有時我們需要輸入鍵盤的一些特殊的符號按鍵,比如 換行、方向鍵等,這些有相對應的鍵盤字符串表示:
pyautogui.typewrite(['p','y','t','h','o','n','enter'])
運行上面代碼,編輯器裡面就會輸出 python 之後換行。
其他特殊按鍵對應的字符串請參考官方說明。
如果我要復制一個內容,大部分情況下會使用快鍵鍵 ctrl + c,按照上面講的,我們應該這麼實現:
pyautogui.keyDown('ctrl')
pyautogui.keyDown('c')
pyautogui.keyUp('c')
pyautogui.keyUp('ctrl')
這樣寫起來很麻煩,而且需要掌控按鍵的按下和釋放的順序。
pyautogui 為我們提供了一個快捷的函數:
pyautogui.hotkey('ctrl','c')
實現的效果和上面的4行代碼相同。
當你在模擬一個桌面操作的時候,如果有分支操作需要根據實際情況來判斷,你是不是需要有一個地方可以讓你選擇走哪個分支?
pyautogui 貼心地考慮到了這種情況,你可以通過彈出一個選擇框來中斷當前的操作,選擇操作分支。
way = pyautogui.confirm('領導,該走哪條路?', buttons=['農村路', '水路', '陸路'])
print(way)
這裡就是我們 HTML 頁面的 confirm 選擇框,選擇了選項之後,我們可以獲取到選擇的選項,然後基於這個選項做判斷,進入相應的操作分支。
除了選擇確認框之外,還有其他一些提示信息框:
# 警告框
alert = pyautogui.alert(text='警告!敵軍來襲!', title='警告框')
print(alert)
# 密碼框
password = pyautogui.password('請輸入密碼')
print(password)
# 普通輸入框
input = pyautogui.prompt('請輸入指令:')
print(input)
pyautogui 的基本知識就給大家介紹到這裡,這個 python 模塊的功能十分強大,函數都非常簡單,對 python 初學者比較友好。學了這些基本知識之後,你可以運用這些基本知識的組合,去實現一些有趣的桌面自動化操作,快去嘗試一把吧!
【python學習】
學Python的伙伴,歡迎加入新的交流【君羊】:1020465983
一起探討編程知識,成為大神,群裡還有軟件安裝包,實戰案例、學習資料