前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >pywinauto教程

pywinauto教程

作者头像
墨文
发布2020-02-28 15:27:03
7.7K0
发布2020-02-28 15:27:03
举报
文章被收录于专栏:m0w3nm0w3n

转: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已安装成功。

代码语言:javascript
复制
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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019-11-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档