环境:pywinauto目前只支持python2.0版本的环境。python3.6同样也可以,pip install pywinauto的会自动下载six的包兼容
使用
1、启动用start启动应用–用于软件还没有启动的情况,默认的timeout时间是5秒。如果启动时间较长,可以加上timeout时间
start(self, cmd_line, timeout=app_start_timeout)
示例:
app = Application(backend = ‘uia’).start(r"E:\Office\Office14\EXCEL.exe)
backend目前还未研究,可以缺省。
uia用元素识别工具可见更多的控件信息,win32不可
2、连接获取应用对象
a)process:进程id
app = Application().connect(process=processID)
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()

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

app = Application().connect(process=int(process_id))relay = RelaySerial(com_relay)for m in range(int(restart_times)):# ipcSer.recv_data_until_timeout(timeout=10)LOGGER.info('*********设置出厂属性第{}次**********'.format(m+1))app['导入配置文件工具 5.0.1.1'].清除.click()strs = app['导入配置文件工具 5.0.1.1'].ListView.texts()IPCStartFlag = Falsei = 0for str in strs:i = i + 1if str == mac_address.upper():LOGGER.info('*********找到对应IPC**********')app['导入配置文件工具 5.0.1.1'].ListView.items()[i].check()IPCStartFlag = Truebreakif not IPCStartFlag:LOGGER.info('*********设备启动异常**********')continueapp['导入配置文件工具 5.0.1.1'].Edit1.set_edit_text(defalt_username)app['导入配置文件工具 5.0.1.1'].Edit2.set_edit_text(defalt_pwd)LOGGER.info(f'*********导入工厂出厂配置**********\n')app['导入配置文件工具 5.0.1.1'].设置出厂属性.click()time.sleep(1)strs = app['导入配置文件工具 5.0.1.1'].ListView.texts()i = 0for str in strs:i = i + 1if str == mac_address.upper():if strs[i + 3] == "配置成功。":LOGGER.info(f'*********配置成功**********\n')LOGGER.info(f'*********断电重启中**********\n')print("断电重启中")relay.send_close_cmd_no_resp()time.sleep(1)relay.send_open_cmd_no_resp()time.sleep(20)breakelse:LOGGER.info(f'*********配置导入失败**********\n')breakj = 0IPCStartFlag = FalsetestFailFlag = Falsewhile not IPCStartFlag or j > 30:i = 0strs = app['导入配置文件工具 5.0.1.1'].ListView.texts()for str in strs:i = i + 1if str == mac_address.upper():if strs[i] == "IP Camera":LOGGER.info(f'*********名字正确**********\n')else:LOGGER.info(f'*********名字错误**********\n')testFailFlag = TrueIPCStartFlag = Truebreakif not IPCStartFlag:LOGGER.info(f'*********设备还在重启中**********\n')LOGGER.info(f'*********等待10秒。。。**********\n')j = j + 1time.sleep(20)if not IPCStartFlag:LOGGER.info(f'*********设备等待5分钟之后仍未重启成功**********\n')breakif testFailFlag:LOGGER.info(f'*********名字错误--测试中止**********\n')break# 恢复环境LOGGER.info(f'*********恢复测试环境环境--设备名字改为name**********\n')appNotePad = Application().start('notepad.exe')time.sleep(2)appNotePad[' 无标题 - 记事本 '].menu_select("文件(&F) -> 打开(&O)..")time.sleep(2)appNotePad[' 无标题 - 记事本 '].print_control_identifiers()time.sleep(2)appNotePad['打开'].Edit2.set_edit_text(customer_path)time.sleep(2)appNotePad['打开'].打开.click()time.sleep(2)appNotePad['Notepad'].menu_select("编辑(&E) -> 替换(&R)..")time.sleep(2)appNotePad['替换'].Edit1.set_edit_text(r"DefDeviceName=IP Camera")time.sleep(2)appNotePad['替换'].Edit2.set_edit_text(r"DefDeviceName=Name")time.sleep(2)appNotePad['替换'].全部替换.click()time.sleep(2)appNotePad['替换'].全部替换.click()time.sleep(2)appNotePad['替换'].取消.click()time.sleep(2)appNotePad['Notepad'].menu_select("文件(&F) -> 保存(&S)..")time.sleep(2)appNotePad['Notepad'].menu_select("文件(&F) -> 退出(&X)..")time.sleep(2)LOGGER.info(f'*********Begin--恢复测试环境环境**********\n')app['导入配置文件工具 5.0.1.1'].清除.click()strs = app['导入配置文件工具 5.0.1.1'].ListView.texts()i = 0for str in strs:i = i + 1if str == mac_address.upper():app['导入配置文件工具 5.0.1.1'].ListView.items()[i].check()breakapp['导入配置文件工具 5.0.1.1'].Edit1.set_edit_text(defalt_username)app['导入配置文件工具 5.0.1.1'].Edit2.set_edit_text(defalt_pwd)LOGGER.info(f'*********导入配置,恢复测试环境环境**********\n')app['导入配置文件工具 5.0.1.1'].设置出厂属性.click()time.sleep(2)strs = app['导入配置文件工具 5.0.1.1'].ListView.texts()i = 0for str in strs:i = i + 1if str == mac_address.upper():if strs[i + 3] == "配置成功。":LOGGER.info(f'*********恢复测试环境配置成功**********\n')time.sleep(20)breakelse:LOGGER.info(f'*********恢复测试环境配置失败,测试继续**********\n')breakj = 0IPCStartFlag = Falsewhile not IPCStartFlag or j > 30:i = 0strs = app['导入配置文件工具 5.0.1.1'].ListView.texts()for str in strs:i = i + 1if str == mac_address.upper():IPCStartFlag = Truebreakif not IPCStartFlag:LOGGER.info(f'*********设备还在重启中**********\n')LOGGER.info(f'*********等待10秒。。。**********\n')j = j + 1time.sleep(20)if not IPCStartFlag:LOGGER.info(f'*********设备测试环境恢复成功,设备启动成功**********\n')# 恢复配置环境LOGGER.info(f'*********修改用户配置文件名字改为:IP Camera**********\n')appNotePad = Application().start('notepad.exe')time.sleep(2)appNotePad[' 无标题 - 记事本 '].menu_select("文件(&F) -> 打开(&O)..")time.sleep(2)appNotePad[' 无标题 - 记事本 '].print_control_identifiers()time.sleep(2)appNotePad['打开'].Edit2.set_edit_text(customer_path)time.sleep(2)appNotePad['打开'].打开.click()time.sleep(2)appNotePad['Notepad'].menu_select("编辑(&E) -> 替换(&R)..")time.sleep(2)appNotePad['替换'].Edit1.set_edit_text(r"DefDeviceName=Name")time.sleep(2)appNotePad['替换'].Edit2.set_edit_text(r"DefDeviceName=IP Camera")time.sleep(2)appNotePad['替换'].全部替换.click()time.sleep(2)appNotePad['替换'].全部替换.click()time.sleep(2)appNotePad['替换'].取消.click()time.sleep(2)appNotePad['Notepad'].menu_select("文件(&F) -> 保存(&S)..")time.sleep(2)appNotePad['Notepad'].menu_select("文件(&F) -> 退出(&X)..")LOGGER.info(f'*********修改用户配置文件名字成功**********\n')LOGGER.info(f'*********测试已完成**********\n')

pywinauto桌面自动化相关推荐

  1. 桌面自动化-SuperPatrick工具图像识别点击解析

    话不多说,直接进入正题: 上回简单分析了一下SuperPatrick官网的一个桌面自动化的例子,这次准备简单分析一下关于这个工具桌面图像识别的部分:关于官网给出的讲解也挺详细,里面也有相关代码,本文中 ...

  2. pyautogui桌面自动化基础使用方法

    pyautogui桌面自动化基础使用方法 PyAutoGUI通过接管鼠标.键盘使用权,基本上模拟真人操作,可以解放人重复操作的行为. 1. 获取基础信息 1.1 屏幕信息 获取屏幕尺寸(分辨率×分辨率 ...

  3. Nodejs爬虫刷csdn访客+桌面自动化框架Robotjs模拟鼠标,键盘,屏幕事件!

    叮铃铃!叮铃铃!老师:"小明 你的梦想是什么?", 沉思了一下 小明:"额额  我想有车有房,自己当老板,媳妇貌美如花,还有一个当官的兄弟" 老师:" ...

  4. 【python之pyautogui桌面自动化】

    本文章来介绍如何通过Python来控制桌面实现自动化操作.桌面自动化操作是通过定位鼠标在桌面的位置,然后根据定位的位置执行对应的操作. 文章目录 GUI控制神器 鼠标操作 鼠标信息 鼠标移动 鼠标点击 ...

  5. Python学习(六) 史上最全Pywinauto模块自动化操作软件

    1本文设计内容较多,但是都不难,都是干货.耐心看下文. 工作中资源更新需要重复行操作软件,这不符合程序的一贯作风,所以使用pywinauto 这个python 模块,实现自动化操作软件.只需鼠标一点, ...

  6. 桌面自动化-SuperPatrick工具使用初探

    推荐一个可以用于辅助Selenium自动化的桌面自动化工具-SuperPatrick,经过测试使用过后,效果整体来说还不错,貌似也有一些问题,后文会简单说明一下: 官方网址:http://www.au ...

  7. 桌面自动化winappdriver、uiautomation、win32、pyautogui...

    我的需求是不通过鼠标也能实现点击等操作 就像浏览器脚本一样  可以不用鼠标,可以在自动化脚本运行时我们能做其他的事,但是经过上时间的发掘,我没发现这些库能较好地实现这样的需求 winappdriver ...

  8. pywinauto客户端自动化---模拟鼠标操作

    无论什么自动化,都避免不了模拟一些鼠标操作,pywinauto模块中也存在模拟鼠标操作方法 mouse mouse是pywinauto一个模拟鼠标的方法库,可以帮助模拟鼠标操作,直接输入坐标就可以了. ...

  9. python 桌面自动化_桌面自动化:PyAutoGUI

    PyAutoGUI介绍 pyautogui是用来做GUI桌面应用自动化的Python包,功能类似于按键精灵:可以实现控制鼠标.键盘.消息框.截图.定位功能 pyautogui的特点: 纯python实 ...

最新文章

  1. 不断演进的 Chrome 安全标识
  2. JDK17 要来了!会带来什么新特性?不好意思,我还在JDK7 踏步走...
  3. 《强化学习周刊》第32期:上海交大华为 | 可解释强化学习研究综述
  4. python counter函数定义_分享几个自己常用的Python高级函数
  5. java听课笔记(十五)之 网络编程
  6. oracle中blob转换,BLOB转换为CLOB的函数(oracle中执行)
  7. 经典案例:2012年最佳25个响应式网站设计作品《下篇》
  8. qt widget 窗口句柄的问题
  9. mysql数据库 二十一练习题 及答案 (mysql练习题)
  10. php 0改成百 千_【面试题】小数转换为人民币大写形式,PHP实现。
  11. java bridge 模式_学习:java设计模式—Bridge模式
  12. 三位数除以两位数竖式计算没有余数_北京版二年级数学下册第一单元有余数的除法练习题【都有电子版】...
  13. 用mysql设计一个超市员工管理系统_数据库设计--小型超市管理系统
  14. oracle临时表空间占用率过高,ORACLE 临时表空间使用率过高的原因及解决方案
  15. php pos机刷卡,POS机刷卡的正确使用方法和注意事项
  16. Python爬虫学习之scrapy框架(一)爬取豆瓣图书榜
  17. 项目文档的流程图,ER图,用例图
  18. 对称矩阵的判定 C语言 SDUT
  19. 互联网晚报 | 12月8日 星期三 | 淘宝购物车上线“好友买单”功能;英超联赛正式入驻视频号;中国联通成立5G消息生态联盟...
  20. 学习记录_检验和的一般求法

热门文章

  1. 2013买房靠不靠谱?---“秒杀”三件最蛋疼的房事儿是关键
  2. SGX EDGER8R
  3. post formerly in codeguru
  4. 人工智能教程 - 1.2.2 神经网络是如何进行预测的?
  5. 日报2015/10/26(极客学院安卓视频学习)
  6. ThinkPHP我约微博系统
  7. 微信小程序 为input绑定回车事件
  8. 全局光照算法:reflective shadow maps
  9. Xposed hook微信二维码收款信息
  10. 老年前列腺增生小便不畅案