pywinauto教程
转:pywinauto教程https://blog.csdn.net/weixin_40161673/article/details/83246861
**
一、环境安装
**
1.命令行安装方法
pip install pywinauto
2.手动安装方法
安装包下载链接:
pyWin32: python调用windows api的库
https://sourceforge.net/projects/pywin32/files/pywin32/Build 220/
comtypes: COM接口的调度https://github.com/enthought/comtypes/releases
six: 用来兼容Python2和Python3的库
https://pypi.org/project/six/
Pillow:可选,用来做屏幕截图的
https://pypi.org/project/Pillow/2.7.0/
Pywinauto:PC端自动化工具
https://github.com/pywinauto/pywinauto/releases
解压缩后执行 python setup.py install
注:建议使用第一种命令行安装,方便。
3.环境检查
命令行中打开python解释器,运行以下代码,windows自带的记事本会被启动,若无报错,则证明pywinauto已安装成功。
from pywinauto.application import Application
app = Application(backend="uia").start("notepad.exe")
二、PC端元素定位工具介绍及判断backend
1.Backend判断
Pywinauto中backend有两种:win32和uia,默认为win32。可使用spy++和Inspect工具判断backend适合写哪种。例如:如果使用Inspect的UIA模式,可见的控件和属性更多的话,backend可选uia,反之,backend可选win32。
2.工具介绍
Spy++ (定位元素工具(win32))
Inspect(定位元素工具(uia))
UI Spy (定位元素工具)
Swapy(可简单生成pywinauto代码)
三、启动并创建一个实例对象
1.启动
start()用于还没有启动软件的情况。timeout为超时参数(可选),若软件启动所需的时间较长可选timeout,默认超时时间为5s。
start(self, cmd_line, timeout=app_start_timeout)
示例:
app = Application(backend = ‘uia’).start(r"E:\Office\Office14\EXCEL.exe)
2.连接
connect()用于连接已经启动的程序。连接一个已经运行的程序有以下几种方法:
a)process:进程id
app = Application().connect(process=2341)
b)handle:应用程序的窗口句柄
app = Application().connect(handle=0x010f0c)
c)path:进程的执行路径(GetModuleFileNameEx 模块会查找进程的每一个路径并与我们传入的路径去做比较)
app = Application().connect(path=“D:\Office14\EXCEL.exe”)
d)参数组合(传递给pywinauto.findwindows.find_elements()这个函数)
app = Application().connect(title_re=".*Notepad", class_name=“Notepad”)
注:
应用程序必须先准备就绪,才能使用connect(),当应用程序start()后没有超时和重连的机制。在pywinauto外再启动应用程序,需要sleep,等程序start
四、 窗口、对话框及控件元素定位方式
1.window,dialog定位方式
1)基于title定位
a)如何获取title?
title为窗口的名称,可使用UISpy一类的定位元素工具去查找。
如图所示,该对话框中的title为Name属性值:“替换”
b)若使用定位元素工具找不到title怎么办?
使用print_control_identifiers()方法打印出当前窗口或对话框中的所有title
格式:
app.YourDialog. print_control_identifiers()
示例如图,demo详见locate_by_title.py:
c)使用title定位方式的写法
Untitled_notepad = u’无标题 – 记事本’
app. Untitled_notepad.draw_outline(colour = ‘red’) #app.window(best_match=‘Untitled - Notepad’)
注:这种写法适用于英文系统,英文软件,其他语言的系统会存在编码问题,需转码再使用。
或
app[‘无标题 – 记事本’] .draw_outline(colour = ‘red’)
注:适用于除英文外其他语言的系统,不用转码
2)top_window()定位
app.top_window() #此方法可返回应用软件的最顶层窗口(是窗口,不是窗口弹出的对话框)
注:此方法目前没有经过测试,它会返回应用程序的顶级窗口,但可能不是Z-Order中的顶级窗口。
3)关键字传参
若以上方法不能满足定位元素的需求,可使用以下列表中的参数传参定位元素,参数可以组合使用。
示例:
app.window(class_name = ‘Notepad’).draw_outline(colour = ‘red’)
常用参数表:
可传参数 对应属性名称备注
class_name ClassName
class_name_re 正则匹配window Classname
title Name Window 窗口名
title_re 正则匹配窗口名
best_match 模糊匹配类似的title
handle 句柄
framework_id FrameworkId(一般情况下FrameworkId不是唯一的)
process ProcessId,进程id(注意:每次启动后,进程id都会变)
control_id control_id
control_type ControlType()
auto_id AutomationId
2. control定位方式
基于title定位(同window,dialog中的title定位)
app[‘your dialog title’][‘your control title’]
或
app.dlg.control
层级定位
app.window(class_name = ’Notepad’).window(class_name = ‘#32770’)
app.window(class_name = ‘Notepad’).child_window(class_name = ‘#32770’)
wpath定位
若元素值为空,或不是唯一的情况下,可使用类似selenium中xpath的定位方式,根据查子元素的序号去定位元素。
示例:
app_window = app.window(class_name=‘Qt5QWindowIcon’) #定位登录窗口
app_window.children()[1].children()[0].children()[0] .children()[2] #定位用户名输入框控件(序号从0开始查)
五、常用方法
1**.调试定位控件**
a)print_control_identifiers(depth = None, filename = None)
以树形结构打印出所有控件可识别出的标识
depth:打印的深度,缺省时打印最大深度。
filename:将返回的标识存成文件(生成的文件与当前运行的脚本在同一个路径下)
eg:dlg. print_control_identifiers(filename =’a.txt’)
b)draw_outline(colour =’green’,thickness = 2,
fill = win32defines.BS_NULL, rect = None)
默认为在当前定位到的窗口或控件周围画出一条边界线,方便我们看出定位到了哪个控件
colour:边界线的颜色,默认为绿
thickness:线的粗细,默认为2
fill:以何种方式填充矩形(没试过,详见源码base_wrapper.py)
rect:根据坐标画出矩形(默认是在当前定位到的元素上画出一个矩形)
c) is_dialog 判断是否为dialog
2. 隐式等待
a) wait(wait_for, timeout = None, retry_interval = None)
wait_for可传入五种参数, 可以组合传参,但要以空格隔开:
exists: 窗口变成有效的句柄
visible: 窗口可见,没有隐藏
enabled: 窗口没有disable
ready: visible + enable
active: active
timeout:设置超时时间,若在n秒内没有等到窗口在wait_for中传入的几种状态,则会抛出TimeoutError。
retry_interval:超时后,间隔n秒再次重试。
Dlg.wait(“exists ready”, timeout = 5, retry_interval = 3)
b) wait_not(wait_for_not,timeout = None,retry_interval = None)
等待窗口不处于某种状态时。参数与wait传参一致。
3. 输入框输入
a)type_keys()
Dlg.control.type_keys(“xxxxx”)
4. 菜单栏
menu_select()
eg:app.window.menu_select(Edit -> Replace)
5. 鼠标点击
a)click() 点击Button控件
b)check_by_click() 通过click()方法勾选checkbox
c)uncheck_by_click() 通过click()方法取消勾选checkbox
d)get_check_state() 返回checkbox的勾选状态(0没勾选,1勾选,2不定)
e)is_checked(勾选返回true,为勾选返回false,不定返回None)
f)check() 勾选checkbox
g)uncheck() 不勾选checkbox
h)invoke() 点击(uia mode)
i)toggle () 勾选checkbox(uia mode)
6. 键盘操作
“+”:Shift
“^”:Control
“%”:Alt
pwinauto中,win32与uia的调用方法不同,定位方式,常用方法有空会后续更新。。。。
转载请注明出处
————————————————
版权声明:本文为CSDN博主「Emilymcwu」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_40161673/article/details/83246861
pywinauto教程的更多相关文章
- pywinauto教程2
一.环境安装 1.命令行安装方法 pip install pywinauto==0.6.7 2.手动安装方法 安装包下载链接:pyWin32: python调用windows api的库https:/ ...
- 【转】pywinauto教程
一.环境安装 1.命令行安装方法 pip install pywinauto==0.6.7 2.手动安装方法 安装包下载链接:pyWin32: python调用windows api的库https:/ ...
- 在中文windows下使用pywinauto进行窗口操作
这两天开始接触pywinauto,听说百度的自动化QA也用这个模块,于是来了兴趣,但网上的教程很少,而且基本上都是拿官方的notepad来说,首先中文菜单的支持是问题,其次各种操作也没有写清楚,阅读官 ...
- 原创-使用pywinauto进行dotnet的winform程序控制(一)
pywinauto自动化控制win32的ui的程序,网上有好多的教程.但是操作dotnet写的winform教程,就少之又少.今天我就来分享我的pywinauto操作dotnet的winform的研究 ...
- Angular2入门系列教程7-HTTP(一)-使用Angular2自带的http进行网络请求
上一篇:Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数 感觉这篇不是很好写,因为涉及到网络请求,如果采用真实的网络请求,这个例子大家拿到手估计还要自己写一个web ...
- Angular2入门系列教程6-路由(二)-使用多层级路由并在在路由中传递复杂参数
上一篇:Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数 之前介绍了简单的路由以及传参,这篇文章我们将要学习复杂一些的路由以及传递其他附加参数.一个好的路由系统可以使我们 ...
- Angular2入门系列教程5-路由(一)-使用简单的路由并在在路由中传递参数
上一篇:Angular2入门系列教程-服务 上一篇文章我们将Angular2的数据服务分离出来,学习了Angular2的依赖注入,这篇文章我们将要学习Angualr2的路由 为了编写样式方便,我们这篇 ...
- Angular2入门系列教程4-服务
上一篇文章 Angular2入门系列教程-多个组件,主从关系 在编程中,我们通常会将数据提供单独分离出来,以免在编写程序的过程中反复复制粘贴数据请求的代码 Angular2中提供了依赖注入的概念,使得 ...
- Angular2入门系列教程1-使用Angular-cli搭建Angular2开发环境
一直在学Angular2,百忙之中抽点时间来写个简单的教程. 2016年是前端飞速发展的一年,前端越来越形成了(web component)组件化的编程模式:以前Jquery通吃一切的田园时代一去不复 ...
随机推荐
- Lose it!
You are given an array aa consisting of nn integers. Each aiai is one of the six following numbers: ...
- Python多线程join/setDaemon
import threading, time class Test(): def test1(self): print("--") time.sleep(3) print(&quo ...
- 爬虫入门 beautifulsoup库(一)
先贴一个beautifulsoup的官方文档,https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html#id12 requ ...
- Centos610-oracle 备份和还原
前言 本文是为基于Centos6.*(linux)系列的Oracle备份和还原的操作记录,其中根据expdp和impdp不同参数可实现不同场景下的导出导入,为不同OS下面的Oracle迁移打下基础. ...
- C位域操作
位域的概念 1个字节包含8位,有些变量保存的数据不需要占用这么长的空间(比如bool类型,只有两个状态true和false, 1位就可以搞定,剩下的7位就浪费了),这就催生了“位域”结构,位域将1个字 ...
- Visual C++ 2013 and Visual C++ Redistributable Package 更新版官网下载地址
Visual C++ 2013 and Visual C++ Redistributable Visual C++ 2013 and Visual C++ Redistributable Packag ...
- .h头文件 .lib库文件 .dll动态链接库文件关系
.h头文件是编译时必须的,lib是链接时需要的,dll是运行时需要的. 附加依赖项的是.lib不是.dll,若生成了DLL,则肯定也生成 LIB文件.如果要完成源代码的编译和链接,有头文件和lib就够 ...
- linux下实现keepalived+nginx高可用
1 nginx负载均衡高可用 1.1 什么是负载均衡高可用 nginx作为负载均衡器,所有请求都到了nginx,可见nginx处于非常重点的位置,如果nginx服务器宕机后端web服务将无法提供服务, ...
- 存储过程(Stored Procedure)
存储过程中 IN,OUT,INOUT类型参数的区别 IN:输入参数:表示该参数的值必须在调用存储过程时指定赋值,在存储过程中修改该参数的值不能被返回,为默认值 OUT:在存储过程内部,该值的默认值为N ...
- 吴裕雄 python 机器学习——核化PCAKernelPCA模型
# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from sklearn import datas ...