case1: 打开一个应用程序
import time
from pywinauto.application import Application
# case1: 打开一个应用程序
# 1、打开windows自带的应用程序:记事本
# app = Application(backend="uia").start("目标位置")
# 2、打开任意一个应用程序
# app = Application(backend="uia").start(r"D:\Program Files (x86)\Notepad++\notepad++.exe")
case2: pywinauto连接已打开的应用程序
# case2: pywinauto连接已打开的应用程序
# 1、进程号 任务管理器PID
# app = Application(backend="uia").connect(process=29664)
# print(app)
# 2、窗口句柄 inspect.exe
# app = Application(backend="uia").connect(handle=1902866)
# print(app)
case3: pywinauto选择应用程序的窗口
# case3: pywinauto选择应用程序的窗口
# 启动notepad++
# app = Application(backend="uia").start(r"notepad.exe")
# time.sleep(5)
# 方式一 app[窗口类名/窗口标题] 推荐使用该方式
# 1、使用类名来选择窗口
# dlg = app["Notepad"]
# 2、通过窗口标题选择窗口
# dlg = app["无标题 - 记事本"]
# 方式二 app.窗口类名/窗口标题 不适合中文标题窗口
# dlg = app.Notepad
# 打印窗口中所有控件
# dlg.print_control_identifiers()
case4: 窗口的操作方法
# case4: 窗口的操作方法
# 启动notepad++
# app = Application(backend="uia").start(r"notepad.exe")
# # 通过窗口标题选择窗口
# dlg = app["无标题 - 记事本"]
# 窗口最大化
# dlg.maximize()
# 窗口最小化
# dlg.minimize()
# 窗口恢复正常大小
# dlg.restore()
# # # 查看窗口当前显示状态:最大化是1 正常是0
# # statues = dlg.get_show_state()
# # print(statues)
# 获取窗口显示的坐标
# rect = dlg.rectangle()
# print(rect)
# 关闭窗口
# dlg.close()
case5:窗口控件的选择
# case5:窗口控件的选择
# 方式一 打印菜单栏
# menu = dlg.Menu
# print(menu.print_control_identifiers())
# 方式二 推荐使用
# menu = dlg["Menu"]
# print(menu.print_control_identifiers())
# 方式三 打印子控件
# menu = dlg.Menu
# file = menu.child_window(title="系统", control_type="MenuItem")
# file.print_control_identifiers()
case6:窗口控件基本属性获取
# case6:窗口控件基本属性获取
# 选择菜单
# menu = dlg["menu"]
# file = menu.child_window(title="系统", control_type="MenuItem")
# 查看控件类型:wrapper_object
# print(dlg.wrapper_object())
# print(menu.wrapper_object())
# print(file.wrapper_object())
# dir:查看对象所支持的方法
# print(dir(dlg.wrapper_object()))
# 控件的文本内容获取:texts
# print(file.texts())
# 获取窗口子元素
# print(dlg.children())
# 获取菜单子元素
# print(menu.children())
# 获取控件类名
# print(dlg.class_name())
# 获取控件的属性,返回字典
# print(file.get_properties())
case7:窗口和控件的截图处理
app = Application(backend="uia").start(r"D:\Program Files\PremiumSoft\Navicat Premium 16\navicat.exe")
dlg = app["Navicat Premium"]
# 打印窗口中所有控件
dlg.print_control_identifiers()
# menu = dlg["ToolbarWindow32"]
# print(menu.print_control_identifiers())
# file = menu.child_window(title="文件(F)", control_type="MenuItem")
# 方法:capture_as_image
# Pic = dlg.capture_as_image()
# print(Pic)
# Pic.save("01.png")
case8:菜单控件的操作方法
# menu = dlg["MenuBar"]
# print(menu.print_control_identifiers())
# 获取菜单的子菜单项
# print(menu.items())
# 通过下标去选择菜单项
# m = menu.item_by_index(1)
# print(m)
# 通过路径去选择菜单项
# m = menu.item_by_path("文件->新建连接...")
# print(m)
# 点击菜单项
# file.click_input()
# menu.menu.item_by_path("文件->新建连接...").click_input()
case9:pywinauto中的等待机制
import time
from pywinauto.application import Application
# # 启动notepad++
# app = Application(backend="uia").start(r"notepad.exe")
# # 通过窗口标题选择窗口
# dlg = app["无标题 - 记事本"]
# # 打印窗口中所有控件
# # dlg.print_control_identifiers()
# # 选择菜单
# menu = dlg["MenuBar"]
# # 选择菜单项:文件
# file = menu.child_window(title="文件")
# # 点击文件
# file.click_input()
# # 点击新建连接
# menu.item_by_path("文件->新建连接...").click_input()
# # 选择新建连接的窗口
# new_dlg = app["新建连接"]
# case9:pywinauto中的等待机制
# 1等待窗口处于可见状态
# new_dlg.wait(wait_for="ready",timeout=10,retry_interval=1)
# print("等待通过,当前新建连接的窗口处于可见状态")
# 2等待窗口不处于可见状态
# new_dlg.wait_not(wait_for_not="ready",timeout=10,retry_interval=1)
# print("等待通过,当前新建连接的窗口不处于可见状态")
# 3等待该进程的cpu的使用率低于某个阈值,仅适用于整个应用进程,不适应于窗口/元素
# threshold:该进程cpu占用率 timeout:超时时间 usage_interval:重试时间间隔
app = Application().connect(process=17260)
app.wait_cpu_usage_lower(threshold=5,timeout=5,usage_interval=1)
case10:pywinauto中等待机制之timings模块
from pywinauto.timings import wait_until,Timings
'''
等函数返回的结果为5的时候,继续往下执行
'''
# case10:pywinauto中等待机制之timings模块
# # 1 wait_until方法 参数
# timeout
# retry_interval
# func 执行的函数
# value 函数返回值比较的值,比较时间直到超时
# Op 比较方式(默认为相等)
# args 给执行函数传位置参数
# kwargs 给执行函数传关键字参数
# i = 0
# def work():
# global i
# i += 1
# print("当前i的值为",i)
# return i
#
# wait_until(10,1,work,5)
#
# print("等待通过")
# 将等待的计时器设置为默认值
Timings.defaults()
# 将所有时间加倍
Timings.slow()
# 将所有时间除2
Timings.fast()
case11:编辑类型的控件操作
import pywinauto
# case11:编辑类型的控件操作
app = pywinauto.Application().start("notepad.exe")
dlg = app["无标题 - 记事本"]
# dlg.print_control_identifiers()
# 选择编辑框
dlg["Edit"].type_keys("pywinauto自动化")
# 替换内容
# 菜单选择替换
dlg.menu_select("编辑->替换(R)")
# 选择"替换"窗口
app["替换"].print_control_identifiers()
# 选择查找编辑器
app["替换"]["Edit1"].type_keys("自动化")
# 选择查找替换为编辑器
app["替换"]["Edit2"].type_keys("_python")
# 选择全部替换按钮
app["替换"]["Button3"].click()
case12:键盘操作模块:pywinauto.keyboard
from pywinauto.keyboard import send_keys
# case12:键盘操作模块:pywinauto.keyboard
# Send_key(按键) 按F1
send_keys("{F1}")
# send_keys("{VK_F1}")
case13:键盘修饰符的使用
from pywinauto.keyboard import send_keys
# case13:键盘修饰符的使用
# "+" -- Shift
# "^" -- Ctrl
# "%" --Alt
# "^s" --Ctrl+S
case14:模拟用户鼠标操作 mouse模块
from pywinauto.keyboard import send_keys
from pywinauto import mouse
# case14:模拟用户鼠标操作 mouse模块
# # 鼠标单击 默认点击左键,以左上角为原点的坐标
# mouse.click(button="left",coords=(580,52))
# # 鼠标双击
# mouse.double_click(button="left",coords=(20,133))
# # 点击鼠标中键
# mouse.wheel_click(coords=(1000,500))
# # 按下鼠标 长按
# mouse.press(coords=(72,31))
# # 释放鼠标
# mouse.release(coords=(500,1000))
# # 滑动鼠标滚轮
# mouse.scroll(coords=(500,1000),wheel_dist=3)
# # 移动鼠标
# mouse.move(coords=(100,200))
# 移动鼠标位置
for i in range(0,1000,50):
mouse.move(coords=(i,1))
case15:任务栏通知区域的操作
from pywinauto import Application
# case15:任务栏通知区域的操作
# 系统托盘(通知区域)
app = Application(backend='uia').connect(path="explorer")
# app["任务栏"].print_control_identifiers()
# 底部状态栏
# icons = app["任务栏"]['用户通知提示区域']
# task = app["任务栏"].child_window(title="用户提示通知区域", auto_id="1504", control_type="ToolBar")
# task.print_control_identifiers()
# task.child_window(title="扬声器: 90%", auto_id="{7820AE73-23E3-4229-82C1-E41CB67D5B9C}", control_type="Button").click()
# 打开隐藏的系统托盘
task = app["任务栏"].child_window(title="通知 V 形", auto_id="1502", control_type="Button")
task.click()
# 选中通知溢出的窗口,然后进行相关的操作
# app["通知溢出"].print_control_identifiers()
app["通知溢出"]["联想电脑管家"].click()
1.navicat新建连接
from pywinauto.application import Application
# 启动程序
# app = Application(backend="uia").start(r"D:\Program Files\Navicat for MySQL\navicat.exe")
app =Application(backend="uia").connect(process=42292)
# 通过窗口标题选择窗口
dlg = app["Navicat for MySQL"]
# dlg.print_control_identifiers()
menu = dlg["Menu"]
# print(menu.wrapper_object())
# print(menu.items())
# menu.print_control_identifiers()
# 点击文件
file = menu.item_by_index(0)
file.click_input()
print(file.children())
# menu.item_by_path("文件->新建连接").click_input()
2.navicat双击打开连接
# 重要:当控件不能点击的时候获取位置进行点击
# 实现点击新建成的连接,
# 因为该数据库是treeView不可点击的,所以要通过鼠标定位点击
import pywinauto
from pywinauto import mouse
# 根据PID选择程序
app = pywinauto.Application(backend="uia").connect(handle=131914)
# 根据窗口标题选择窗口
dlg = app["Navicat Premium"]
# dlg.print_control_identifiers(depth=3)
# 选择树状视图控件
# [TVTFilterFrame][TPanel][TNavicatMainForm][#32769]
# dlg["TTreeView"].print_control_identifiers()
dlg["TPanel"].print_control_identifiers()
# 点击连接
db_name = dlg["TVirtualStringTree"].child_window(title="测试新建连接", control_type="TreeItem")
# db_name.click() # 会报错,不可以点击
# rectangle() 获取控件上下左右的位置;mid_point()获取中心点的位置
rect = db_name.rectangle().mid_point()
print(rect.x, rect.y)
mouse.double_click(rect.x, rect.y)
3.navicat右击删除连接
# 重要:点击后出现的窗口用viewwizard定位时消失的处理方法
# 就是通过app.windows()获取当前应用程序的所有窗口定位
# 实现点击删除连接,如何定位到该应用程序的其他窗口
from pywinauto import Application
from pywinauto import mouse
# 根据PID选择程序
app = Application("uia").connect(process=4176)
# 根据窗口标题选择窗口
dlg = app["Navicat Premium"]
# 选择树状视图控件
dlg["TTreeView"].print_control_identifiers()
# 点击连接
db_name = dlg["TTreeView"].child_window(title="测试新建连接", control_type="TreeItem")
# db_name.click() # 会报错,不可以点击
# rectangle() 获取控件上下左右的位置;mid_point()获取中心点的位置
rect = db_name.rectangle().mid_point()
print(rect.x, rect.y)
# 鼠标在控件中心点,右击
mouse.right_click(coords=(rect.x, rect.y))
# 获取该应用程序的所有窗口
print(app.windows())
# 选择右击出现的上下文窗口
# app["上下文"].print_control_identifiers()
# 打开连接
# app["上下文"]["MenuItem1"].click_input()
# 删除连接
app["上下文"]["MenuItem5"].click_input()
# 选择删除窗口
app["确认删除"]["删除"].click()
行为封装1.封装
# 将连接的动作封装起来
from pywinauto.application import Application
from pywinauto import mouse
class NavicatTest:
def __init__(self, path=None, precess=None):
if path:
self.app = Application('uia').start(path)
else:
# 为了不每次都重新打开navicat,运行一次打开新建连接页面后,使用句柄进行连接即可
self.app = Application('uia').connect(handle=12)
self.dlg = self.app['Navicat Premium']
def new_connect(self):
menu = self.dlg["Menu"]
# 点击文件
menu.child_window(title="文件").click_input()
# 点击新建连接
menu.item_by_path("文件->新建连接").click_input()
# 选择新建连接窗口
new_dlg = self.app["新建连接"]
# 连接名
new_dlg["常规"].Edit5.type_keys("1111")
# ip输入框
# new_dlg["常规"]["Edit1"],报错,此时应该更换.的方式
new_dlg["常规"].Edit1.type_keys("1111")
# 端口输入框
new_dlg["常规"].Edit4.type_keys("1111")
# 用户名输入框
new_dlg["常规"].Edit3.type_keys("1111")
# 密码输入框
new_dlg["常规"].Edit2.type_keys("1111")
# 点击确定按钮,Button类型的就可以直接调用click()
new_dlg["确定"].click()
def open_connect(self):
# 根据窗口标题选择窗口
# self.dlg = self.app["Navicat Premium"]
# 选择树状视图控件
self.dlg["TTreeView"].print_control_identifiers()
# 点击连接
db_name = self.dlg["TTreeView"].child_window(title="测试新建连接", control_type="TreeItem")
# db_name.click() # 会报错,不可以点击
# rectangle() 获取控件上下左右的位置;mid_point()获取中心点的位置
rect = db_name.rectangle().mid_point()
print(rect.x, rect.y)
mouse.double_click(rect.x, rect.y)
def del_connect(self):
# 选择树状视图控件
self.dlg["TTreeView"].print_control_identifiers()
# 点击连接
db_name = self.dlg["TTreeView"].child_window(title="测试新建连接", control_type="TreeItem")
# rectangle() 获取控件上下左右的位置;mid_point()获取中心点的位置
rect = db_name.rectangle().mid_point()
# 鼠标在控件中心点,右击
mouse.right_click(coords=(rect.x, rect.y))
# 获取该应用程序的所有窗口
# print(self.app.windows())
# 删除连接
self.app["上下文"]["MenuItem5"].click_input()
# 选择删除窗口
self.app["确认删除"]["删除"].click()
nav = NavicatTest(precess=12)
nav.new_connect()
行为封装2.参数化
from pywinauto.application import Application
from pywinauto import mouse
class NavicatTest:
def __init__(self, path=None, precess=None):
if path:
self.app = Application('uia').start(path)
else:
# 为了不每次都重新打开navicat,运行一次打开新建连接页面后,使用句柄进行连接即可
self.app = Application('uia').connect(handle=12)
self.dlg = self.app['Navicat Premium']
def new_connect(self, title, host, port, user, password):
'''新建连接'''
menu = self.dlg["Menu"]
# 点击文件
menu.child_window(title="文件").click_input()
# 点击新建连接
menu.item_by_path("文件->新建连接").click_input()
# 选择新建连接窗口
new_dlg = self.app["新建连接"]
# 连接名
new_dlg["常规"].Edit5.type_keys(title)
# ip输入框
# new_dlg["常规"]["Edit1"],报错,此时应该更换.的方式
new_dlg["常规"].Edit1.type_keys(host)
# 端口输入框
new_dlg["常规"].Edit4.type_keys(port)
# 用户名输入框
new_dlg["常规"].Edit3.type_keys(user)
# 密码输入框
new_dlg["常规"].Edit2.type_keys(password)
# 点击确定按钮,Button类型的就可以直接调用click()
new_dlg["确定"].click()
def open_connect(self, db_name):
'''打开连接
打开连接和打开数据库的方法是一样的,
参数传数据库即可打开数据库,传连接名即可打开连接'''
# 根据窗口标题选择窗口
# self.dlg = self.app["Navicat Premium"]
# 选择树状视图控件
self.dlg["TTreeView"].print_control_identifiers()
# 点击连接
db_name = self.dlg["TTreeView"].child_window(title=db_name, control_type="TreeItem")
# db_name.click() # 会报错,不可以点击
# rectangle() 获取控件上下左右的位置;mid_point()获取中心点的位置
rect = db_name.rectangle().mid_point()
print(rect.x, rect.y)
mouse.double_click(rect.x, rect.y)
def del_connect(self, title):
'''删除连接'''
# 选择树状视图控件
self.dlg["TTreeView"].print_control_identifiers()
# 点击连接
db_name = self.dlg["TTreeView"].child_window(title=title, control_type="TreeItem")
# rectangle() 获取控件上下左右的位置;mid_point()获取中心点的位置
rect = db_name.rectangle().mid_point()
# 鼠标在控件中心点,右击
mouse.right_click(coords=(rect.x, rect.y))
# 获取该应用程序的所有窗口
# print(self.app.windows())
# 删除连接
self.app["上下文"]["MenuItem5"].click_input()
# 选择删除窗口
self.app["确认删除"]["删除"].click()
def close_connect(self, title):
'''关闭连接'''
关闭连接和关闭数据库的方法是一样的,
参数传数据库即可关闭数据库,传连接名即可关闭连接'''
# 选择树状视图控件
self.dlg["TTreeView"].print_control_identifiers()
# 点击连接
db_name = self.dlg["TTreeView"].child_window(title=title, control_type="TreeItem")
# rectangle() 获取控件上下左右的位置;mid_point()获取中心点的位置
rect = db_name.rectangle().mid_point()
# 鼠标在控件中心点,右击
mouse.right_click(coords=(rect.x, rect.y))
# 获取该应用程序的所有窗口
# print(self.app.windows())
# 关闭连接
self.app["上下文"]["MenuItem2"].click_input()
def del_database(self, title):
'''删除数据库'''
# 选择树状视图控件
self.dlg["TTreeView"].print_control_identifiers()
# 点击连接
db_name = self.dlg["TTreeView"].child_window(title=title, control_type="TreeItem")
# rectangle() 获取控件上下左右的位置;mid_point()获取中心点的位置
rect = db_name.rectangle().mid_point()
# 鼠标在控件中心点,右击
mouse.right_click(coords=(rect.x, rect.y))
# 获取该应用程序的所有窗口
# print(self.app.windows())
# 删除数据库
self.app["上下文"]["MenuItem4"].click_input()
# 选择删除窗口
self.app["确认删除"]["删除"].click()
nav = NavicatTest(precess=12)
nav.new_connect('测试连接','127.0.0.1','3306','root','123456')
nav.open_connect('测试连接')