目錄
- 一、背景
- 二、自動(dòng)化的方案
- 三、思路和知識(shí)點(diǎn)
- 四、操作步驟
- 4.1 初識(shí) PyAutoGUI
- 4.2 坐標(biāo)系
- 4.3 點(diǎn)擊
- 4.4 輸入
- 4.5 漢字輸入
- 4.6 集成起來(lái)
- 五、數(shù)據(jù)源
- 六、總結(jié)
一、背景
大家好,我是安果!
我們經(jīng)常遇到需要進(jìn)行大量重復(fù)操作的時(shí)候,比如:網(wǎng)頁(yè)上填表,對(duì) web 版本 OA 進(jìn)行操作,自動(dòng)化測(cè)試或者給新系統(tǒng)首次添加數(shù)據(jù)等
這些操作的特點(diǎn)往往是:數(shù)據(jù)同構(gòu),大多是已經(jīng)有了的結(jié)構(gòu)化數(shù)據(jù);操作比較呆板,都是同一個(gè)流程的點(diǎn)擊、輸入;數(shù)據(jù)量大,極大消耗操作人精力
那么能不能自動(dòng)化呢?
二、自動(dòng)化的方案
如果你在 web 上進(jìn)行操作, Python 的 Selenium 可以滿足要求。如果需要對(duì) GUI 界面進(jìn)行操作,你恐怕得試驗(yàn)下“按鍵精靈”能不能滿足要求。對(duì)新系統(tǒng)添加初始數(shù)據(jù),SQL 導(dǎo)出導(dǎo)入是最高效的方式,不過(guò)可能需要進(jìn)行一些較復(fù)雜的處理。
曾經(jīng)多次遇到要求一條條手動(dòng)輸入舊數(shù)據(jù)的系統(tǒng)升級(jí)活動(dòng)。
但以上都存在一些問(wèn)題, Selenium 比較復(fù)雜,按鍵精靈功能上不太完善, SQL 需要一定的知識(shí)基礎(chǔ)
這里推薦一個(gè)更好的解決方案:PyAutoGUI
其實(shí) PyAutoGUI 最主要好處就是比較簡(jiǎn)單,應(yīng)急使用的話可以很快構(gòu)建一個(gè)可用的自動(dòng)化操作腳本。畢竟,數(shù)據(jù)處理任務(wù)本來(lái)就比較急迫,沒(méi)有時(shí)間使用復(fù)雜知識(shí),來(lái)構(gòu)建一個(gè)完善的腳本
三、思路和知識(shí)點(diǎn)
現(xiàn)在來(lái)說(shuō)一下基本思路與相關(guān)知識(shí)點(diǎn)
- PyAutoGUI 就是模擬鍵盤(pán)、鼠標(biāo)在界面上進(jìn)行操作。
- 這里只使用它的 click 功能來(lái)模擬鼠標(biāo)點(diǎn)擊。
- 為了獲取需要點(diǎn)擊的位置,設(shè)計(jì)了一個(gè)鼠標(biāo)坐標(biāo)獲取的程序。
- ASCII 碼的輸入比較簡(jiǎn)單。再解決漢字輸入問(wèn)題,就使得系統(tǒng)基本可用了。
本文以在 web 界面批量新增數(shù)據(jù)記錄為例,講解如何自動(dòng)化操作。這個(gè)例子只是演示之用,非常簡(jiǎn)單,大家自行理解、遷移。
四、操作步驟
4.1 初識(shí) PyAutoGUI
簡(jiǎn)單地說(shuō), PyAutoGUI 就是模擬鍵盤(pán)、鼠標(biāo)在界面上進(jìn)行操作的包。安裝時(shí)直接使用如下語(yǔ)句:pip install pyautogui即可。
編寫(xiě)一個(gè)簡(jiǎn)單的測(cè)試程序:
import pyautogui as pag
pag.PAUSE = 1.5
pag.click(63,191)
以上程序?qū)霂?kù),定義了每步驟的暫停時(shí)間 1.5 秒(用來(lái)留給操作時(shí)間),然后在屏幕左起 63 像素,上起 191 像素這個(gè)點(diǎn)上點(diǎn)擊了鼠標(biāo)。
4.2 坐標(biāo)系
PyAutoGUI 默認(rèn)的坐標(biāo)系從屏幕左上角開(kāi)始,x 軸向右增大,y 軸向下增大。所以顯示器上每個(gè)點(diǎn)都有自己的位置。
引申一下,當(dāng)知道界面上每個(gè)按鈕的位置時(shí),點(diǎn)擊這些點(diǎn),就是執(zhí)行相應(yīng)的操作了。
當(dāng)然,這一切的前提是界面不變。大多數(shù)應(yīng)用的界面、按鈕位置不會(huì)變來(lái)變?nèi)?。如果你有這方面需求,可以參考下 locateOnScreen() 函數(shù)。這個(gè)函數(shù)根據(jù)你提供的圖片,在屏幕上找到像素匹配的地方。這樣就不怕按鈕動(dòng)來(lái)動(dòng)去了。
為了獲取屏幕的坐標(biāo)系,寫(xiě)了一個(gè)簡(jiǎn)單的程序,用來(lái)獲取鼠標(biāo)在屏幕上的坐標(biāo)。大家可以自行下載運(yùn)行。
import pyautogui as pag
import os
try:
while True:
os.system('cls')
a = '%4d,%4d'%pag.position()
print(a)
except Exception as e:
print(e)
運(yùn)行以上程序,移動(dòng)鼠標(biāo)到各個(gè)按鈕上,就可以看到相應(yīng)的坐標(biāo)。
4.3 點(diǎn)擊
PyAutoGUI 的點(diǎn)擊很簡(jiǎn)單:
pyautogui.click(x=None, y=None, clicks=1, interval=0.0, button='left', duration=0.0)
其中x,y是坐標(biāo),clicks 是點(diǎn)擊次數(shù),interval 是點(diǎn)擊間隔,button 指代三個(gè)鼠標(biāo)按鈕的哪一個(gè),duiation 是點(diǎn)擊之間的間隔。
寫(xiě)如下程序,來(lái)進(jìn)行任務(wù)、時(shí)間和新建按鈕之間的跳轉(zhuǎn)。
pag.click(63,191)
pag.click(328,191)
pag.click(384,461)
pag.click(374,191)
4.4 輸入
輸入 ASCII 字符和鍵盤(pán)擊鍵、熱鍵分別如下:
- 輸入 ASCII 字符串是typewrite(message='test message.',interval=0.5)
- 退出鍵是press('esc')
- 按下是KeyDown('ctrl')
- 松開(kāi)是KeyUp('ctrl')
- 組合鍵是hotkey('ctrl','v')。
至于漢字,稍微復(fù)雜點(diǎn)。
4.5 漢字輸入
涉及漢字,無(wú)法用 ASCII 方案解決,需要導(dǎo)入包 pyperclip ,這個(gè)包封裝了系統(tǒng)剪貼板,大家知道怎么回事了吧。
import pyperclip
#以下讀入內(nèi)容,就是把內(nèi)容存入剪貼板。
pyperclip.copy('需要輸入的漢字')
#以下輸出內(nèi)容,就是粘貼。
pag.hotkey('ctrl','v')
其實(shí)就是用 pyperclip 模擬拷貝,用熱鍵 Ctrl+v 粘貼,實(shí)現(xiàn)了非 ASCII 字符的輸入。
4.6 集成起來(lái)
下面,把整個(gè)程序集成起來(lái)看:
import pyautogui as pag
import pyperclip
pag.PAUSE = 1.5
pag.FAILSAFE = True
to = ['測(cè)試任務(wù)1','測(cè)試任務(wù)2','測(cè)試任務(wù)3','測(cè)試任務(wù)4','測(cè)試任務(wù)5',\
'測(cè)試任務(wù)6','測(cè)試任務(wù)7','測(cè)試任務(wù)8','測(cè)試任務(wù)9','測(cè)試任務(wù)10']
for t in to:
pag.click(63,191)
pyperclip.copy(t)
pag.hotkey('ctrl','v')
pag.click(328,191)
pag.click(384,461)
pag.click(374,191)
以上程序,根據(jù) to 列表內(nèi)容,把操作分解為點(diǎn)擊和粘貼,實(shí)現(xiàn)了自動(dòng)化操作的目的。大部分編碼都很好理解,能跟鼠標(biāo)操作一一對(duì)應(yīng)起來(lái)??赡艽嬖陔y度的是數(shù)據(jù)源的問(wèn)題,總不能把所有數(shù)據(jù)都寫(xiě)入程序吧?
五、數(shù)據(jù)源
相較于復(fù)雜的現(xiàn)實(shí)數(shù)據(jù)源,最好的方式就是把數(shù)據(jù)轉(zhuǎn)成 csv 文件。這樣許多 Excel 都可以另存成這個(gè)文件,其本身又是基于文本的,可讀可寫(xiě),比較方便。其他諸如 SQL 數(shù)據(jù)庫(kù)、 XML 數(shù)據(jù)也可以導(dǎo)出轉(zhuǎn)換為 csv 文件。
假設(shè)現(xiàn)在有了 csv 格式數(shù)據(jù)源 data.csv ,需要這樣操作。
to = []
with open('data.csv')as f:
lines = f.readlines()
for line in lines:
to.append(tuple(line.split(',')))
以上代碼比較簡(jiǎn)單,把 csv 中存成的數(shù)據(jù)存儲(chǔ)到 to 這個(gè)數(shù)組里,每行數(shù)據(jù)都是一個(gè)元組,調(diào)用的時(shí)候,如4.6部分代碼所示,使用 for 循環(huán)加上元組下標(biāo)即可。
六、總結(jié)
本文使用 PyAutoGUI 包,對(duì)各種鼠標(biāo)點(diǎn)擊、輸入之類的機(jī)械重復(fù)操作進(jìn)行自動(dòng)執(zhí)行,可大幅提高工作效率。這里只使用了 click 功能和 pyperclip 包的 copy 功能。主要是為了簡(jiǎn)化編程,讓大家在緊張和繁瑣的操作中,快速編寫(xiě)一個(gè)自動(dòng)化執(zhí)行的小腳本。
以上就是python 利用PyAutoGUI快速構(gòu)建自動(dòng)化操作腳本的詳細(xì)內(nèi)容,更多關(guān)于python 用PyAutoGUI構(gòu)建自動(dòng)化操作腳本的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
您可能感興趣的文章:- Python腳本實(shí)現(xiàn)自動(dòng)登錄校園網(wǎng)
- python自動(dòng)化運(yùn)維之Telnetlib的具體使用
- 還在手動(dòng)蓋樓抽獎(jiǎng)?教你用Python實(shí)現(xiàn)自動(dòng)評(píng)論蓋樓抽獎(jiǎng)(一)
- Python 如何實(shí)現(xiàn)文件自動(dòng)去重
- Python爬蟲(chóng)之自動(dòng)爬取某車之家各車銷售數(shù)據(jù)
- python趣味挑戰(zhàn)之爬取天氣與微博熱搜并自動(dòng)發(fā)給微信好友
- Python實(shí)現(xiàn)智慧校園自動(dòng)評(píng)教全新版