pywinauto学习笔记

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('测试连接')
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值