Python結合Pywinauto 進行 Windows UI 自動化
Pywinauto是基於Python開發的,用於自動化測試的指令碼模組,主要操作於Windows標準圖形介面。它可以允許你很容易的傳送滑鼠、鍵盤動作給Windows的對話方塊和控制元件。
其中,最主要功能為對windows標準控制元件的一系列動作可程式設計處理。包括對視窗的指定、滑鼠或鍵盤操作、獲得控制元件屬性等等。程式的開始為對所需應用的啟 動或連線。獲得程式連線後,pywinauto通過視窗的名稱、類名、是否可見等屬性尋找匹配的視窗,進而通過類似方法尋找使用者所需的控制元件,並獲得相應的 控制代碼。之後,使用者可通過易理解的程式設計方式對指定控制元件進行相關操作的程式設計,包括滑鼠點選、鍵盤輸入、判斷控制元件間關係、獲取控制元件屬性等。
文件參考:
舉個例子
#! /usr/bin/env python
#coding=GB18030
'''
FuncName: johnny-pywinauto.py
Desc: study pywinauto
Date: 2016-10-10 14:30
Author: johnny
Home:http://blog.csdn.net/z_johnny
'''
from pywinauto import application
import SendKeys
import time
class Pywin(object):
"""
pywin framwork main class
tool_name : 程式名稱,支援帶路徑
windows_name : 視窗名字
"""
SLEEP_TIME = 1
def __init__(self):
"""
初始化方法,初始化一個app
"""
self.app = application.Application()
def run(self, tool_name):
"""
啟動應用程式
"""
self.app.start_(tool_name)
time.sleep(1)
def connect(self, window_name):
"""
連線應用程式
app.connect_(path = r"c:\windows\system32\notepad.exe")
app.connect_(process = 2341)
app.connect_(handle = 0x010f0c)
"""
self.app.connect_(title = window_name)
time.sleep(1)
def close(self, window_name):
"""
關閉應用程式
"""
self.app[window_name].Close()
time.sleep(1)
def max_window(self, window_name):
"""
最大化視窗
"""
self.app[window_name].Maximize()
time.sleep(1)
def menu_click(self, window_name, menulist):
"""
選單點選
"""
self.app[window_name].MenuSelect(menulist)
time.sleep(1)
def input(self, window_name, controller, content):
"""
輸入內容
"""
self.app[window_name][controller].TypeKeys(content)
time.sleep(1)
def click(self, window_name, controller):
"""
滑鼠左鍵點選
example:
下面兩個功能相同,下面支援正則表示式
app[u'關於“記事本”'][u'確定'].Click()
app.window_(title_re = u'關於“記事本”').window_(title_re = u'確定').Click()
"""
self.app[window_name][controller].Click()
time.sleep(1)
def double_click(self, window_name, controller, x = 0,y = 0):
"""
滑鼠左鍵點選(雙擊)
"""
self.app[window_name][controller].DoubleClick(button = "left", pressed = "", coords = (x, y))
time.sleep(1)
def right_click(self, window_name, controller, order):
"""
滑鼠右鍵點選,下移進行選單選擇
window_name : 視窗名
controller:區域名
order : 數字,第幾個命令
"""
self.app[window_name][controller].RightClick()
for down in range(order):
SendKeys.SendKeys('{DOWN}')
time.sleep(0.5)
SendKeys.SendKeys('{ENTER}')
time.sleep(1)
if __name__ == "__main__":
app = Pywin()
# 記事本例子
tool_name = "notepad.exe"
# 通過Spy++ 獲取window_name,即標題文字
window_name = u"無標題 - 記事本"
menulist = u"幫助->關於記事本"
# 通過Spy++ 獲取controller,即視窗類名
controller = "Edit"
content = u"johnny"
window_name_new = content + ".txt"
# 啟動程式,記事本只能開一個
app.run(tool_name)
app.connect(window_name)
app.max_window(window_name)
app.menu_click(window_name,menulist)
app.click(u'關於記事本', u'確定')
app.input(window_name,controller,content)
# Ctrl + a 全選
app.input(window_name,controller,"^a")
# 選擇複製
app.right_click(window_name,controller,3)
#選擇貼上
app.right_click(window_name,controller,4)
SendKeys.SendKeys('{ENTER}')
# Ctrl + v 貼上
app.input(window_name,controller,"^v")
# Ctrl + s 儲存
app.input(window_name,controller,"^s")
# 輸入檔名
app.input(u"另存為",controller,content)
# 儲存
app.click(u"另存為","Button")
try:
app.click(u"確認另存為","Button")
except:
pass
finally:
app.close(window_name_new)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 99
- 100
- 101
- 102
- 103
- 104
- 105
- 106
- 107
- 108
- 109
- 110
- 111
- 112
- 113
- 114
- 115
- 116
- 117
- 118
- 119
- 120
- 121
- 122
- 123
- 124
- 125
- 126
- 127
- 128
- 129
- 130
- 131
- 132
- 133
- 134
- 135
- 136
- 137
- 138
- 139
- 140
- 141
- 142
- 143
- 144
- 145
- 146
- 147
- 148
- 149
其他
1.安裝
pip install pywinauto
pip install SendKeys
# SendKeys 需要VCForPython27.msi環境支援
- 1
- 2
- 3
- 1
- 2
- 3
2.SendKeys中特殊字元的鍵程式碼
BACKSPACE {BACKSPACE}、{BS} 或 {BKSP}
BREAK {BREAK}
CAPS LOCK {CAPSLOCK}
DEL 或 DELETE {DELETE} 或 {DEL}
DOWN ARROW(下箭頭) {DOWN}
END {END}
ENTER {ENTER} 或 ~
ESC {ESC}
HELP {HELP}
HOME {HOME}
INS 或 INSERT {INSERT} 或 {INS}
LEFT ARROW(左箭頭) {LEFT}
NUM LOCK {NUMLOCK}
PAGE DOWN {PGDN}
PAGE UP {PGUP}
PRINT SCREEN {PRTSC}(保留,以備將來使用)
RIGHT ARROW(右箭頭) {RIGHT}
SCROLL LOCK {SCROLLLOCK}
TAB {TAB}
UP ARROW(上箭頭) {UP}
F1 {F1}
F2 {F2}
F3 {F3}
F4 {F4}
F5 {F5}
F6 {F6}
F7 {F7}
F8 {F8}
F9 {F9}
F10 {F10}
F11 {F11}
F12 {F12}
F13 {F13}
F14 {F14}
F15 {F15}
F16 {F16}
數字盤加號 {ADD}
數字盤減號 {SUBTRACT}
數字盤乘號 {MULTIPLY}
數字盤除號 {DIVIDE}
原文地址:http://blog.csdn.net/z_johnny/article/details/52778064