当前位置:   article > 正文

2021-09-20

2021-09-20

1.确定可访问性技术

第一个必要的事情是确定哪种可访问性技术(pywinauto的backend)可以用于您的应用程序。

1)Win32 API (backend="win32") - 现在的默认backend
MFC, VB6, VCL, 简单的WinForms控件和大多数旧的遗留应用程序
2)MS UI Automation (backend="uia")
WinForms, WPF, Store apps, Qt5, 浏览器
注意: Chrome在启动之前需要--force-renderer-accessibility cmd标志。 由于comtypes Python库限制,不支持自定义属性和控件。
  • 1
  • 2
  • 3
  • 4
  • 5

2.启动/连接应用程序

2.1 启动应用程序

from pywinauto.application import Application
# 启动Notepad.exe
app = Application(backend="uia").start('notepad.exe')
# 描述Notepad.exe进程内的窗口
dlg_spec = app.UntitledNotepad
# 等到窗户真的开着
actionable_dlg = dlg_spec.wait('visible') 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.2连接应用程序

connect()用于连接已经启动的程序。连接一个已经运行的程序有以下几种方法:

#1.process:进程id
app = Application().connect(process=2341)
#2.handle:应用程序的窗口句柄
app = Application().connect(handle=0x010f0c)
#3.path:进程的执行路径(GetModuleFileNameEx 模块会查找进程的每一个路径并与我们传入的路径去做比较)
app = Application().connect(path=“D:\Office14\EXCEL.exe”)
#4.参数组合(传递给pywinauto.findwindows.find_elements()这个函数)
app = Application().connect(title_re=".*Notepad", class_name=“Notepad”)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

注:
应用程序必须先准备就绪,才能使用connect(),当应用程序start()后没有超时和重连的机制。在pywinauto外再启动应用程序,需要sleep,等程序start

2.3获取定位要素

  1. process:进程id
    在这里插入图片描述
  2. handle:应用程序的窗口句柄
    在这里插入图片描述
  3. path:进程的执行路径
    在这里插入图片描述
  4. title

3. 窗口、对话框及控件元素定位方式

3.1窗口定位

  1. 基于title定位
from pywinauto.application import Application
#打开程序
app = Application(backend="uia").start('notepad.exe')
#1.英文系统、英文软件,其他语言的系统会存在编码问题,需转码再使用。
#app.Untitled_notepad.draw_outline(colour='red')
#2.适用于除英文外其他语言的系统,不用转码
app['无标题 – 记事本'] .draw_outline(colour='red')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

窗口title获取:

from pywinauto.application import Application
#打开程序
app = Application(backend="uia").start('notepad.exe')
#打印程序所有窗口title
app.YourDialog. print_control_identifiers()
  • 1
  • 2
  • 3
  • 4
  • 5
  1. top_window()定位
    app.top_window() #此方法可返回应用软件的最顶层窗口(是窗口,不是窗口弹出的对话框)
    注:此方法目前没有经过测试,它会返回应用程序的顶级窗口,但可能不是Z-Order中的顶级窗口。

  2. 关键字传参
    若以上方法不能满足定位元素的需求,可使用以下列表中的参数传参定位元素,参数可以组合使用。
    示例:

app.window(class_name = ‘Notepad’).draw_outline(colour = ‘red’)
  • 1

常用参数表:

可传参数对应属性名称备注
class_nameClassName
class_name_re正则匹配window Classname
title NameWindow窗口名
title_re正则匹配窗口名
best_match模糊匹配类似的title
handle句柄
framework_idFrameworkId(一般情况下FrameworkId不是唯一的)
processProcessId,进程id(注意:每次启动后,进程id都会变 )
control_idcontrol_id
control_typeControlType()
auto_idAutomationId

3.2控件元素定位方式

  1. 基于title定位(同window,dialog中的title定位)
app[‘your dialog title’][‘your control title’]
#或
app.dlg.control
  • 1
  • 2
  • 3
  1. 层级定位
app.window(class_name = ’Notepad’).window(class_name =#32770’)
app.window(class_name = ‘Notepad’).child_window(class_name =#32770’)
  • 1
  • 2
  1. wpath定位
    若元素值为空,或不是唯一的情况下,可使用类似selenium中xpath的定位方式,根据查子元素的序号去定位元素。
    示例:
 #定位登录窗口
app_window = app.window(class_name=‘Qt5QWindowIcon’)
 #定位用户名输入框控件(序号从0开始查)
app_window.children()[1].children()[0].children()[0] .children()[2]
  • 1
  • 2
  • 3
  • 4

4.常用方法

4.1调试定位控件

  1. 以树形结构打印出所有控件可识别出的标识
'''
print_control_identifiers(depth = None, filename = None)
depth:打印的深度,缺省时打印最大深度。
filename:将返回的标识存成文件(生成的文件与当前运行的脚本在同一个路径下)

'''
from pywinauto.application import Application
#打开程序
app = Application(backend="uia").start('notepad.exe')
#打印程序所有控件可识别出的标识
app.YourDialog. print_control_identifiers()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  1. 默认为在当前定位到的窗口或控件周围画出一条边界线,方便我们看出定位到了哪个控件
'''
draw_outline(colour =’green’,thickness = 2,fill = win32defines.BS_NULL, rect = None)
colour:边界线的颜色,默认为绿
thickness:线的粗细,默认为2
fill:以何种方式填充矩形(没试过,详见源码base_wrapper.py)
rect:根据坐标画出矩形(默认是在当前定位到的元素上画出一个矩形)
'''
from pywinauto.application import Application
#打开程序
app = Application(backend="uia").start('notepad.exe')
#1.英文系统、英文软件,其他语言的系统会存在编码问题,需转码再使用。
#app.Untitled_notepad.draw_outline(colour='red')
#2.适用于除英文外其他语言的系统,不用转码
app['无标题 – 记事本'] .draw_outline(colour='red')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  1. is_dialog 判断是否为dialog

4.2 隐式等待

  1. wait(wait_for, timeout = None, retry_interval = None)
'''
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秒再次重试。
'''
from pywinauto.application import Application
#打开程序
app = Application(backend="uia").start('notepad.exe')
# 获取Notepad.exe进程内的窗口
dlg_spec = app.UntitledNotepad
# 等到窗口可见
actionable_dlg = dlg_spec.wait('visible')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  1. wait_not(wait_for_not,timeout = None,retry_interval = None)
    等待窗口不处于某种状态时。参数与wait传参一致。

  2. 输入框输入:type_keys()

from pywinauto.application import Application
#打开程序
app = Application(backend="uia").start('notepad.exe')
#获取Notepad.exe进程内的窗口
dlg_spec = app.UntitledNotepad
#等待窗口可见
actionable_dlg = dlg_spec.wait('visible')
#type_keys()
dlg_spec.control.type_keys(“xxxxx”)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/706492
推荐阅读
相关标签
  

闽ICP备14008679号