当前位置:   article > 正文

pywinauto的初级入门

pywinauto

第一次尝试这种方法记录自己学过的一些东西,后续会将一些重要的知识点慢慢记录进来,hello,my blog~

安装

pip installer pywinauto

使用须知

pywinauto官方文档

确定app的可访问技术

1、win32 API(backend=“win32”)
一般是MFC、VB6、VCL,简单的WinForms控件和大多数旧的应用程序
2、MS UI Automoation API(backend=“uia”)
一般是WinForms、WPF、Store app,Qt5,浏览器

启动应用程序

1、Applicant
作用范围:单个进程
2、desktop
作用范围:跨进程

辅助工具

spy++ / inspect.exe

详细使用

开启app

启动notepad

from pywinauto.application import Application
app = Application(backend='uia').start("notepad.exe")
  • 1
  • 2

启动qq

from pywinauto.application import Application
app = Application(backend='uia').start(r"D:\\Program Files\\Tencent\\QQ\\Bin\\QQScLauncher.exe")
  • 1
  • 2

或者

import pywinauto
app = pywinauto.Application(backend='uia').start(r"D:\\Program Files\\Tencent\\QQ\\Bin\\QQScLauncher.exe")
  • 1
  • 2

连接已经打开的应用程序

1、通过进程号连接
任务管理器 查看
PID即为进程号
PID即为进程号 :5460

app = Application(backend='uia').connect(process="XXX")
  • 1

2、通过窗口句柄连接

app = Application(backend='uia').connect(handle="XXX")
  • 1

或者通过inspect查看
在这里插入图片描述
ProcessID and NativeWindowHandle

选择程序窗口

1、根据窗口标题/类名选择
推荐使用
在这里插入图片描述

window = app["QQ"] # window = app["TXGuiFoundation"] 
window.print_control_identifiers()
  • 1
  • 2

2、根据窗口类名选择
在这里插入图片描述

window = app.TXGuiFoundation
window.print_control_identifiers()
  • 1
  • 2

获取当前窗口的坐标

print(app["QQ"].rectangle())
  • 1

窗口控件分类

类别名称
状态栏StatusBar
按钮Button
单选框RadioButton
组合框ComboBox
复选框CheckBox
组框GroupBox
编辑栏Edit
列表框ListBox
弹出菜单PopupMenu
工具栏Toolbar
树状视图Tree View
菜单栏MenuItem
菜单Menu
窗格Pane
静态内容Static
对话框(窗口)Dialog
头部内容Header
列表显示控件ListView
选项卡控件TabControl
工具提示ToolTips

窗口控件基本属性获取方法

1、获取控件类型:wrapper_object()
2、获取控件支持的方法:print(dir(a.wrapper_object()))
3、获取控件的子元素:children()
4、获取控件类名:class_name()
5、以字典的形式返回控件的属性:get_properties()
【以上全部可以用inspect直接查看获取】

获取控件的文本内容

file.texts()

对窗口/控件的截图处理

方法:capture_as_image()`

pic = app[title_notepad].capture_as_image()
print(pic)
pic.save('01.png')
  • 1
  • 2
  • 3

菜单的相关操作

菜单控件

1、通过下标选择菜单项

menu = window['menu']
print(menu.items())#获取菜单的子菜单项
m = menu.item_by_index(1)
print(m)
  • 1
  • 2
  • 3
  • 4

2、通过路径选择菜单项

menu = window['menu']
print(menu.items())#获取菜单的子菜单项
m = menu.item_by_path("文件->新建连接...")
print(m)
  • 1
  • 2
  • 3
  • 4

菜单项控件

m.click_input()#点击
  • 1

等待机制

wait 系列

wait and wait_not

官方文档在这里插入图片描述

window.wait(wait_for='ready',timeout=10,retry_inteval=1)
  • 1

wait_cpu_usage_lower()
等待该进程的cpu使用率低于某个阈值

参数:
threshold:该进程的cpu占用率低于某个阈值
timeout:超时时间
retry_inteval:重试时间间隔

app = pywinauto.Application(backend='uia').connect(process=16972)
app.wait_cpu_usage_lower(threshold=5,timeout=10,retry_inteval=1)
  • 1
  • 2

timings系列

在这里插入图片描述

wait_until(10.5, .5, self.item_count, 10)#等待item_count函数的结果为5的时候开始停止等待。。。若超过10s,则超时报错
  • 1

timings模块
Timings.defaults():将全局计时设为默认值
Timings.slow():将所有时间加倍(使脚本的执行速度降低)
Timings.fast():将所有计时除以2

编辑类控件

作者介绍得很清楚——实例notepad

https://www.cnblogs.com/wuxunyan/p/9366178.html

import pywinauto
#1.运行记事本程序
app = pywinauto.Application().start('notepad.exe')
#2.窗体选择
title_notepad = u'无标题-记事本'
print(app[title_notepad].print_control_identifiers())
#3.选择一个菜单项
app[title_notepad].menu_select('帮助->关于记事本')
print(dir(app[title_notepad].wrapper_object()))
time.sleep(0.2)
#4.点击新弹出窗体的确定按钮
out_note = u'关于记事本'
button_name_ok = '确定'
app[out_note][button_name_ok].click()
#5.将当前窗口截图保存
pic = app[title_notepad].capture_as_image()
print(pic)
pic.save('01.png')
#6.在记事本中输入一些文本
dlg = app[title_notepad]
dlg['Edit'].type_keys("我是方法1\n",with_spaces=True,with_newlines=True)
app.title_notepad.Edit.type_keys("我是方法2\n",with_spaces=True,with_newlines=True)
app.title_notepad.Edit.type_keys('pywinauto works!\n',with_spaces=True,with_newlines=True)
app.title_notepad.Edit.type_keys('hello word !\n',with_spaces=True,with_newlines=True)
#7.替换操作
app[title_notepad].menu_select('编辑(&E) -> 替换(&R)..')
app['替换'].print_control_identifiers()
app['替换']['Edit1'].type_keys("word")
app['替换']['Edit2'].type_keys("baby")
app['替换'].Button3.click() #全部替换
app['替换'].Button4.click() #取消
#8.退出
app[title_notepad].menu_select('文件(&F) -> 退出(&X)')#现在的top窗口为'记事本'
app.top_window().print_control_identifiers()
app.top_window().Button2.click()
  • 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

模拟用户键盘的操作

send_keys()

按键对应参数
F5send_keys(“{VK_F5}”)/send_keys(“{F5}”)
普通字母send_keys(‘A’)
回车键send_keys(“{VK_RETURN}”)
esc键send_keys(“{VK_ESCAPE}”)
tab键send_keys(“{VK_TAB}”)
caps Locksend_keys(“{VK_CAPITAL}”)
shiftsend_keys(“{VK_SHIFT}”)
ctrl键send_keys(“{VK_CONTROL}”)
Alt键send_keys(“{VK_MENU}”)
空格键send_keys(“{VK_SPACE}”)
退格键send_keys(“{VK_BACK}”)
左win键send_keys(“{VK_LWIN}”)
右win键send_keys(“{VK_RWIN}”)

案例:通过案件打开CMD进入python

from pywinauto.keyboard import *
import time

send_keys("{VK_LWIN}")
time.sleep(0.1)
send_keys("cmd")
send_keys("{VK_RETURN}")
#以上三行可以写成一行命令:send_keys("{VK_LWIN}cmd{VK_RETURN}")
time.sleep(1)
send_keys("python")
send_keys("{VK_RETURN}")
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

键盘修饰符的使用

修饰符按键
“+”shift
“^”ctrl
“%”alt
“^s”ctrl+s
from pywinauto.keyboard import *
send_keys("^a") #全选
  • 1
  • 2

鼠标用户操作

操作方法
单击click
双击double_click
右击right_click
中间点击wheel_click
按下鼠标press
释放鼠标replace
鼠标移动move
滚动鼠标scroll
from pywinauto import mouse
mouse.click(coords=(475,20))#默认单击左键,coords:像素
mouse.scroll(coords=(1919,257),wheel_dist=-3)#wheel_dist:为正向上滚动,为负向下滚动
  • 1
  • 2
  • 3

访问系统通知区域

1、通过explorer

app = pywinauto.Application(backend='uia').connect(path="explorer")
# app["任务栏"].print_control_identifiers()
# task = app["任务栏"]["用户提示通知区域"]
task = app["任务栏"].child_window(title="用户提示通知区域", auto_id="1504", control_type="ToolBar")
# task.print_control_identifiers()
task.child_window(title="扬声器: 静音", auto_id="{7820AE73-23E3-4229-82C1-E41CB67D5B9C}", control_type="Button").click()
#task.Button19.click() #通过button点击
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2、访问隐藏的通知区
在这里插入图片描述

app = pywinauto.Application(backend='uia').connect(path="explorer")
task = app["任务栏"].child_window(title="通知 V 形", auto_id="1502", control_type="Button")
task.click()
#隐藏窗口为桌面上的新的窗口
app["通知溢出"].print_control_identifiers()
wechat = app["通知溢出"].child_window(title="微信", auto_id="{0A61FEA6-FC1E-4277-47CE-70846CAB39F7}", control_type="Button")
wechat.click()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

结合selenium实现文件上传

上传网址:https://www.layui.com/demo/upload.html
在这里插入图片描述

import time
from selenium import webdriver
import pywinauto
from pywinauto.keyboard import send_keys


chrome_options = webdriver.ChromeOptions()
# chrome_options.add_argument('--headless') #无头浏览模式
browser = webdriver.Chrome(chrome_options=chrome_options)
url = 'https://www.layui.com/demo/upload.html'
browser.get(url)
browser.find_element_by_xpath('//button[@id="test1"]').click()
time.sleep(10)

app = pywinauto.Desktop()#显示桌面的所有app
# app["打开"].print_control_identifiers()
#选择文件地址输入的工具框
app["打开"].wait('ready', 10, 1)
app["打开"]['Toolbar3'].click()
send_keys('C:\\Users\\ASUS\\Desktop')
send_keys("{VK_RETURN}")

#输入单个文件
#选中文件名输入框
app["打开"]["文件名(&N):Edit"].type_keys('"01.jpg"')
app["打开"]["打开(&O)"].click()

#输入多个文件(利用键盘)
send_keys('"02.jpg"')
send_keys('"03.jpg"')
  • 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

写在最后:
1、感谢b站某老师的视频讲解,内容很详细
2、刚开始学习,还有很多待补充的内容~ 记录下来防止遗忘,随时可翻看~ (若有错误,欢迎交流指正)

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/121323
推荐阅读
相关标签
  

闽ICP备14008679号