編輯類控件的基本操作
通過記事本來進行測試
import pywinauto
app = pywinauto.Application().start("notepad.exe")
# 選擇主窗口
dlg = app["無標題 - 記事本"]
dlg.print_control_identifiers()
輸入內容
選擇編輯框並輸入Hello World!
dlg["Edit"].type_keys("Hello World!")
替換
通過菜單選擇替換
選擇替換窗口
app["替換"]
選擇查找編輯框並輸入
World
選擇替換爲編輯框並輸入
Python
點擊全部替換按鈕
dlg.menu_select("編輯->替換(R)")
app["替換"].print_control_identifiers()
app["替換"]["Edit1"].type_keys("World")
app["替換"]["Edit2"].type_keys("Python")
app["替換"]["Button3"].click()
鍵盤操作
鍵盤操作模塊:pywinauto.keyboard
send_keys
方法
按F5:
send_key("{VK_F5}")
按F5:
send_key("{F5}")
按回車:
send_key("{VK_RETURN}")
按字母A:
send_key('A')
常用按鍵
ESC:VK_ESCAPE
TAB:VK_TAB
Shift:VK_SHIFT
Ctrl:VK_CONTROL
Alt:VK_MENU
空格:VK_SPACK
退格:VK_BACK
左win:VK_LWIN
右win:VK_RWIN
鍵盤修飾符
+
:按Shift^
:按Ctrl%
:按Alt
例如^s
相當於輸入ctrl+s
鼠標操作
鼠標操作模塊:pywinauto.mouse
click:點擊
double_click:雙擊
right_clik:右擊
wheel_click:中間點擊
press:按下
repleace:釋放
move:移動
scrool:滾動
from pywinauto import mouse
# 鼠標單擊(默認左鍵)
mouse.click(coords=(580,52))
# 鼠標右鍵
mouse.right_click(coords=(1000,500))
# 鼠標雙擊
mouse.double_click(button="left",coords=(155,50))
# 點擊鼠標中鍵
mouse.wheel_click(coords=(1000,500))
# 按下鼠標
mouse.press(coords=(72,31))
# 釋放鼠標
mouse.release(coords=(1000,500))
# 滑動鼠標滾輪
mouse.scroll(coords=(1000, 500), wheel_dist=1)
# 移動鼠標位置
mouse.move(coords=(0, 0))
for i in range(0, 1000, 50):
mouse.move(coords=(i, i))
# 部分無法直接點擊的控件:獲取控件中心點位置,雙擊點擊
rect = db_name.rectangle().mid_point()
mouse.double_click(coords=(rect.x, rect.y))
查看系統提示
在時鐘附近有表示正在運行的應用程序的圖標,也就是「系統托盤」,也被稱爲「通知區域」。
可以通過啓動Explorer.exe
應用程序,在任務欄
的用戶提示通知區域
找到工具欄控件
from pywinauto import Application
app = Application("uia").connect(path="explorer")
icons = app['任務欄']['用戶提示通知區域']
結合Selenium實現文件上傳
import pywinauto
from pywinauto.keyboard import send_keys
from selenium import webdriver
url= "https://www.layui.com/demo/upload.html"
browser = webdriver.Chrome()
browser.get(url=url)
browser.find_element_by_xpath("//button[@id='test1']").click()
# 使用pywinauto來選擇文件
app = pywinauto.Desktop()
# 選擇文件上傳的窗口
dlg = app["打開"]
dlg.print_control_identifiers()
# 選擇文件地址輸入框
dlg["Toolbar3"].click()
send_keys("C:\images")
send_keys("{VK_RETURN}")
# 選中文件名輸入框
dlg["文件名(&N):Edit"].type_keys("9.png")
# 點擊打開
dlg["打開(&O)"].click()
連接Navicat並操作
import pywinauto
from pywinauto import mouse
from pywinauto.keyboard import send_keys
class NavicatTest:
def __init__(self, path=None, precess=None):
# 初始化一個應用程序對象
if path:
self.app = pywinauto.Application(backend="uia").start(path)
else:
self.app = pywinauto.Application(backend="uia").connect(process=precess)
# 選擇主窗口
self.dlg = self.app["Navicat for MySQL"]
def new_connect(self, title, host, port, user, password):
"""
新建連接
"""
# 選擇菜單欄
menu = self.dlg["Menu"]
# 點擊文件
menu.child_window(title="文件", control_type="MenuItem").click_input()
# 點擊新建連接
menu.item_by_path("文件->新建連接...").click_input()
# 選擇新建連接窗口
new_dlg = self.app["新建連接"]
# 連接名稱輸入框
new_dlg["常規"].Edit5.type_keys(title)
# ip輸入框
new_dlg["常規"].Edit1.type_keys(host)
# 端口輸入框
new_dlg["常規"].Edit4.type_keys(port)
# 用戶名輸入框
new_dlg["常規"].Edit3.type_keys(user)
# 密碼輸入框
new_dlg["常規"].Edit2.type_keys(password)
# 點擊確定按鈕
new_dlg["確定"].click()
def open_connect(self, title):
"""
打開連接或者數據庫
:param title: 連接名或者數據庫名
:return:
"""
# 獲取控制座標中心點,進行點擊,打開連接
db_name = self.dlg["TTreeView"].child_window(title=title, control_type="TreeItem")
rect = db_name.rectangle().mid_point()
print(rect.x, rect.y)
mouse.double_click(coords=(rect.x, rect.y))
def del_connect(self, title):
"""刪除連接"""
# 獲取控件中心點位置
db_name = self.dlg["TTreeView"].child_window(title=title, control_type="TreeItem")
rect = db_name.rectangle().mid_point()
# 鼠標在控件中心點,右擊
mouse.right_click(coords=(rect.x, rect.y))
# 刪除連接
self.app["上下文"]["MenuItem5"].click_input()
# 選擇刪除窗口
self.app["確認刪除"]["刪除"].click()
def close_coonnect(self, title):
"""
關閉連接或者數據庫
:param title: 連接名或者數據庫名
:return:
"""
# 獲取控件中心點位置
db_name = self.dlg["TTreeView"].child_window(title=title, control_type="TreeItem")
rect = db_name.rectangle().mid_point()
# 鼠標在控件中心點,右擊
mouse.right_click(coords=(rect.x, rect.y))
# 刪除連接
self.app["上下文"]["MenuItem2"].click_input()
def del_database(self, database):
db_name = self.dlg["TTreeView"].child_window(title=database, control_type="TreeItem")
rect = db_name.rectangle().mid_point()
mouse.right_click(coords=(rect.x, rect.y))
self.app["上下文"]["MenuItem4"].click_input()
# 選擇刪除窗口
self.app["確認刪除"]["刪除"].click()
def new_database(self, title, database, charset="utf8 -- UTF-8 Unicode"):
"""新建數據庫"""
db_name = self.dlg["TTreeView"].child_window(title=title, control_type="TreeItem")
rect = db_name.rectangle().mid_point()
mouse.right_click(coords=(rect.x, rect.y))
dlg = self.app["上下文"]
# 點擊新建連接
dlg.MenuItem8.click_input()
# 獲取新建連接的窗口
# self.app["新建數據庫"].print_control_identifiers()
# 數據數據庫名
self.app["新建數據庫"]["常規"].Edit3.type_keys(database)
self.app["新建數據庫"]["常規"].Edit2.type_keys(charset)
# 鍵盤回車鍵,點擊確定
send_keys("{VK_RETURN}")
def new_find_dlg(self):
"""新建查詢窗口"""
find = self.dlg["TTreeView"].child_window(title="查詢", control_type="TreeItem")
# 獲取查詢的左邊
rect = find.rectangle().mid_point()
# 鼠標右擊
mouse.right_click(coords=(rect.x, rect.y))
# 選擇出現的小窗口
dlg = self.app["上下文"]
# 點擊新建連接
dlg.MenuItem1.click_input()
def find_sql(self, database, title, sql):
"""查詢sql"""
title = "無標題 @{} ({}) - 查詢".format(database, title)
find_dlg = self.app[title]
find_dlg["TabControl"].print_control_identifiers()
# 獲取編輯框
edit = find_dlg["TabControl"].Pane4
# 獲取編輯窗口控件位置
rect = edit.rectangle().mid_point()
mouse.click(coords=(rect.x, rect.y))
sql = "^a{}".format(sql.replace(" ", "{VK_SPACE}")) + ";"
send_keys(sql)
# 使用運行快捷鍵
send_keys("^r")
if __name__ == '__main__':
nav = NavicatTest(precess=1320)
# 新建連接
nav.new_connect(title="python666", host="localhost", port=3306, user="root", password="mysql")
# 打開連接
nav.open_connect("win")
# 關閉連接
nav.close_coonnect("test")
# 打開數據庫
nav.open_connect("test")
# 新建查詢窗口
nav.new_find_dlg()
# 查詢數據
sql = "SELECT * FROM students"
nav.find_sql("test", "win", sql)
# # 刪除連接
nav.del_connect("localhost_3306")