聊聊 PC 端自動化最佳方案 - Pywinauto

1. 前言

大家好钦扭,我是安果!

上一篇文章善玫,聊到 PC 端的一種自動化方案:WinAppDriver

聊聊 PC 端自動化最佳方案 - WinAppDriver

有小伙伴后臺給我留言洒敏,說「 pywinauto 」作為 WinAppDriver 的替代方案矗蕊,也能完美完成 PC 端的自動化

2. 介紹

Pywinauto,完全由 Python 構(gòu)建的一個模塊杠河,可以用于自動化 Windows 上的 GUI 應(yīng)用程序

同時碌尔,它支持鼠標(biāo)浇辜、鍵盤操作,在元素控件樹較復(fù)雜的界面七扰,可以輔助我們完成自動化操作

項(xiàng)目地址:https://github.com/pywinauto/pywinauto

支持的應(yīng)用為下面 2 大類:

  • Win32 API

    包含 MFC奢赂、VB6、VCL颈走、simple WinForms controls and most of the old legacy apps

  • MS UI Automation

    包含 WinForms膳灶、WPF、Store apps立由、Qt5, browsers

其中

win32 API 的 backend 為「 win32 」

MS UI Automation 的 backend 為「 uia 」

3. 元素控件

和 WinAppDriver 類似轧钓,在編寫自動化腳本之前,我們需要先獲取元素控件的各類屬性值

獲取元素控件有 2 種方式:

  • 窗口內(nèi)置方法

  • 檢查工具

其中

窗口對象內(nèi)置的 2 個方法都可以打印出當(dāng)前頁面的元素控件樹

# 窗口對象中內(nèi)置方法锐膜,打印窗體內(nèi)所有元素控件
# 方式一:
窗體對象.print_control_identifiers()

# 方式二
窗體對象.dump_tree()

常用的檢查工具也包含 2 種毕箍,分別是:Inspect.exe、Spy++

4. 實(shí)戰(zhàn)一下

在實(shí)戰(zhàn)之前道盏,我們先安裝依賴包 pywinauto

# 安裝依賴
pip3 install pywinauto

接下來而柑,我們還是以上篇文章中的例子來講解完整的實(shí)現(xiàn)過程

4-1 打開微信客戶端

首先,通過檢查工具判斷應(yīng)用的 backend 屬性值荷逞,PC 端微信的 backend 為「 uia 」

然后媒咳,實(shí)例化一個「 Application 」類

最后,使用該對象內(nèi)置的函數(shù)創(chuàng)建一個應(yīng)用對象

import pywinauto
from pywinauto.application import Application

# 獲取應(yīng)用對象
# 三種方式任選一種
# 方式一:應(yīng)用進(jìn)程pid(連接)
app = Application(backend='uia').connect(process=pid)

# 方式二:應(yīng)用完整路徑(連接)
app = Application(backend='uia').connect(path="D:\Program Files (x86)\Tencent\WeChat\WeChat.exe")

# 方式三:打開應(yīng)用(打開)
app = Application(backend='uia').start('D:\Program Files (x86)\Tencent\WeChat\WeChat.exe')

需要指出的是种远,獲取應(yīng)用對象有上面 3 種方式涩澡,可以按需使用

4-2 獲取窗體對象

通過檢查工具獲取窗體的屬性列表,然后使用應(yīng)用對象 + 窗體屬性獲取微信首頁的窗體對象

image

實(shí)現(xiàn)代碼如下:

from pywinauto.win32functions import SetFocus

# 獲取窗口對象
# 通過title及ClassName獲取窗體對象
self.weixin_pc_window = self.app.window(title=u"微信", class_name="WeChatMainWndForPC")

self.weixin_pc_window.set_focus()

4-3 切換到聊天列表

獲取左側(cè)聊天切換按鈕坠敷,獲取其坐標(biāo)位置妙同,模擬點(diǎn)擊進(jìn)入到聊天列表頁面

from pywinauto import mouse

def __get_element_postion(self, element):
    """獲取元素的中心點(diǎn)位置"""
    # 元素坐標(biāo)
    element_position = element.rectangle()
    # 算出中心點(diǎn)位置
    center_position = (int((element_position.left + element_position.right) / 2),
                           int((element_position.top + element_position.bottom) / 2))
    return center_position

def start(self):
    # 1、獲取左側(cè)【聊天】切換元素
    chat_list_element = self.weixin_pc_window.child_window(title="聊天", control_type="Button")
    # 2膝迎、點(diǎn)擊進(jìn)入到聊天列表
    mouse.click(button='left',
                    coords=self.__get_element_postion(chat_list_element))

4-4 進(jìn)入聊天頁面粥帚,輸入內(nèi)容并發(fā)送

獲取「 文件聊天助手 」元素,點(diǎn)擊進(jìn)入到聊天頁面限次,找到輸入框元素茎辐,使用內(nèi)置方法輸入內(nèi)容,最后使用鍵盤模擬點(diǎn)擊「 Enter 」鍵掂恕,發(fā)送消息

from pywinauto import mouse

# 3拖陆、點(diǎn)擊【文件傳輸助手】進(jìn)入到聊天頁面
file_helper_element = self.weixin_pc_window.child_window(title="文件傳輸助手", control_type="ListItem")

mouse.click(button='left',
                    coords=self.__get_element_postion(file_helper_element))
# 4、獲取輸入框元素懊亡,模擬輸入
        edit_element = self.weixin_pc_window.child_window(title=r"輸入", control_type="Edit")

sleep(2)
# 輸入內(nèi)容
edit_element.type_keys("星安果")
# 使用鍵盤模擬回車依啰,即:發(fā)送
send_keys('{ENTER}')

4-5 釋放資源

完成操作后,可以調(diào)用應(yīng)用對象的「 kill() 」函數(shù)關(guān)閉進(jìn)程店枣,釋放掉資源

def teardown(self):
    """釋放資源"""
    # 結(jié)束進(jìn)程速警,釋放資源
    self.app.kill()

5. 最后

上例中使用 pywinauto 完成了一個簡單的發(fā)送消息的自動化步驟

實(shí)際項(xiàng)目中叹誉,結(jié)合鼠標(biāo)、鍵盤可以實(shí)現(xiàn)很多復(fù)雜場景的自動化闷旧,對這部分有興趣的可以點(diǎn)擊文末的「 閱讀原文 」去了解

pywinauto 和 WinAppDriver 都能很好的完成 PC 端的自動化长豁,但是由于 WinAppDriver 支持 Appium,在腳本語法簡潔性方面可能更有優(yōu)勢

文中的所有源碼我已經(jīng)上傳到公眾號后臺忙灼,關(guān)注公眾號「 AirPython 」后匠襟,回復(fù)關(guān)鍵字「 winauto 」獲取完整源碼

如果你覺得文章還不錯,請大家 點(diǎn)贊该园、分享酸舍、留言 下,因?yàn)檫@將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強(qiáng)動力里初!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末啃勉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子双妨,更是在濱河造成了極大的恐慌淮阐,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,084評論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件刁品,死亡現(xiàn)場離奇詭異枝嘶,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)哑诊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,623評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來及刻,“玉大人镀裤,你說我怎么就攤上這事〗煞梗” “怎么了暑劝?”我有些...
    開封第一講書人閱讀 163,450評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長颗搂。 經(jīng)常有香客問我担猛,道長,這世上最難降的妖魔是什么丢氢? 我笑而不...
    開封第一講書人閱讀 58,322評論 1 293
  • 正文 為了忘掉前任傅联,我火速辦了婚禮,結(jié)果婚禮上疚察,老公的妹妹穿的比我還像新娘蒸走。我一直安慰自己,他們只是感情好貌嫡,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,370評論 6 390
  • 文/花漫 我一把揭開白布比驻。 她就那樣靜靜地躺著该溯,像睡著了一般。 火紅的嫁衣襯著肌膚如雪别惦。 梳的紋絲不亂的頭發(fā)上狈茉,一...
    開封第一講書人閱讀 51,274評論 1 300
  • 那天,我揣著相機(jī)與錄音掸掸,去河邊找鬼氯庆。 笑死,一個胖子當(dāng)著我的面吹牛猾漫,可吹牛的內(nèi)容都是我干的点晴。 我是一名探鬼主播,決...
    沈念sama閱讀 40,126評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼悯周,長吁一口氣:“原來是場噩夢啊……” “哼粒督!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起禽翼,我...
    開封第一講書人閱讀 38,980評論 0 275
  • 序言:老撾萬榮一對情侶失蹤屠橄,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后闰挡,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體锐墙,經(jīng)...
    沈念sama閱讀 45,414評論 1 313
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,599評論 3 334
  • 正文 我和宋清朗相戀三年长酗,在試婚紗的時候發(fā)現(xiàn)自己被綠了溪北。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,773評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡夺脾,死狀恐怖之拨,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情咧叭,我是刑警寧澤蚀乔,帶...
    沈念sama閱讀 35,470評論 5 344
  • 正文 年R本政府宣布,位于F島的核電站菲茬,受9級特大地震影響吉挣,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜婉弹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,080評論 3 327
  • 文/蒙蒙 一睬魂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧镀赌,春花似錦汉买、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,713評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垫卤。三九已至,卻和暖如春出牧,著一層夾襖步出監(jiān)牢的瞬間穴肘,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,852評論 1 269
  • 我被黑心中介騙來泰國打工舔痕, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留评抚,地道東北人。 一個月前我還...
    沈念sama閱讀 47,865評論 2 370
  • 正文 我出身青樓伯复,卻偏偏與公主長得像慨代,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子啸如,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,689評論 2 354

推薦閱讀更多精彩內(nèi)容