我們以前講過怎樣使用 Python 在瀏覽器中實現頁面自動化操作,不管用哪種方式實現,都是透過定位頁面中的元素來進行相應的操作。
今天我們來聊聊如何在桌面上實現自動化操作。與瀏覽器頁面自動化操作類似,桌面自動化操作也是需要定位滑鼠在桌面的位置,然後根據定位的位置執行對應的操作。
我們今天的主角是pyautogui,pyautogui 是純Python 的GUI 自動化工具,透過它可以讓程式自動控制滑鼠和鍵盤的一系列操作來達到自動化測試的目的。
這個模組的安裝也是老一套:
安裝好了就可以直接使用了。
桌面操作最基本的就是滑鼠操作了,我們可以控制滑鼠的移動:
# 移动鼠标 pyautogui.moveTo(200,400,duration=2) pyautogui.moveRel(200,500,duration=2)
整個桌面是以左上角為座標軸的原點,所有的操作都以這個原點,來決定操作位置。
第一行是將滑鼠移到指定的像素(200,400)位置,第二行程式碼是將滑鼠依照目前點向右移動200px,向下移動400px這個方向移動。
兩行程式碼中都有一個共同的參數 duration,這個參數表示移動時間,也就是在指定時間內完成移動操作,單位是秒。
運行這兩行程式碼,觀察螢幕滑鼠的變化,是不是很神奇?
我們也可以取得滑鼠位置:
print(pyautogui.position())
這個很好理解,就是取得滑鼠在目前畫面中的座標位置,運行這行程式碼,我們會得到諸如下面的資訊:
#通常,我們的滑鼠有左右兩個按鍵,進階點的滑鼠中間還有個按鍵。
我的滑鼠只有兩個按鍵,中間沒有按鍵,唉~
#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自動操作 GUI 神器-PyAutoGUI的詳細內容。更多資訊請關注PHP中文網其他相關文章!