• python+pywinauto—PC端自动化(一)启动程序及菜单控件操作


    目录

    GUI对象检查/Spy工具

    pywinauto基本操作

    启动应用程序

    连接应用

    窗口操作

    控件操作


    GUI对象检查/Spy工具

    1. Inspect.exe:Inspect.exx是Microsoft创建的另一个很棒的工具。它包含在windows SDK中,因此可以在x64 windows上的以下位置找到它.
    2. spy++.exe:它使用win32 API。如果spy ++能够显示程序的所有控件,那么该应用程序适合使用win32的backend.
    3. ViewWizard:viewwizard (窗口信息查看精灵),使用起来非常简洁可查看窗口和控件句柄、类名、标题、风格等信息(百度搜索下载)    

    pywinauto基本操作

    启动应用程序

    在pywinauto中主要有两种对象可以建立这种入口点:

    ①Application:Application的作用范围是一个进程,如一般的桌面应用程序都为此类。应用的作用范围是一个进程,如一般的桌面应用程序都为此类。

    ②Desktop:Desktop的作用范围可以跨进程。主要用于一个程序可以包含多个实例(进程)的程序。

    1. from pywinauto import application, findbestmatch, findwindows, keyboard, mouse, timings
    2. import os, time
    3. os.environ.update({"__COMPAT_LAYER": "RUnAsInvoker"}) # 以管理员权限打开
    4. # 打开指定程序
    5. # 1、打开windows自带的应用:记事本
    6. app = application.Application(backend='uia').start('notepad.exe')
    7. # 2、打开指定应用
    8. # app = application.Application(backend='uia').start(r'E:\磁盘分区\DiskGenius\DiskGenius.exe') # 非全局使用应用决定路径

    启动应用报错:

    1. Traceback (most recent call last):
    2. File "D:\python\lib\site-packages\pywinauto\application.py", line 1038, in start
    3. (h_process, _, dw_process_id, _) = win32process.CreateProcess(
    4. pywintypes.error: (740, 'CreateProcess', '请求的操作需要提升。')
    5. During handling of the above exception, another exception occurred:
    6. Traceback (most recent call last):
    7. File "D:\zhuomian\pywinauto\main.py", line 10, in <module>
    8. app = application.Application(backend='uia').start(r'E:\磁盘分区\DiskGenius\DiskGenius.exe')
    9. File "D:\python\lib\site-packages\pywinauto\application.py", line 1052, in start
    10. raise AppStartError(message)
    11. pywinauto.application.AppStartError: Could not create the process "E:\磁盘分区\DiskGenius\DiskGenius.exe"
    12. Error returned by CreateProcess: (740, 'CreateProcess', '请求的操作需要提升。')

    需要设置管理员权限打开,设置方法两种:

    1. # 方法一:
    2. import ctypes, sys
    3. def is_admin():
    4. try:
    5. return ctypes.windll.shell32.IsUserAnAdmin()
    6. except:
    7. return False
    8. if is_admin():
    9. # 这里写入需要管理员权限执行的操作
    10. app = application.Application(backend='uia').start(r'E:\磁盘分区\DiskGenius\DiskGenius.exe')
    11. else:
    12. if sys.version_info[0] == 3:
    13. ctypes.windll.shell32.ShellExecuteW(None, "runas", sys.executable, __file__, None, 1)
    1. # 方法二: 速度快,推荐使用
    2. os.environ.update({"__COMPAT_LAYER": "RUnAsInvoker"})

    连接应用

    1. # 连接方法1:通过进程号连接
    2. # app = Application('uia').connect(process=14564)
    3. # 连接方法2:通过句柄连接
    4. app = Application('uia').connect(handle=5508946)

    方便查找连接对象的方法,获取进程号或句柄:

    1. from pywinauto import application, findbestmatch, findwindows, keyboard, mouse, timings
    2. print(application.process_get_modules()) # 获取当前所有的进程及进程号
    3. print(findwindows.find_elements(title='无标题 - 记事本')) # 可以获取指定标题的进程及句柄

    窗口操作

    1. win.maximize() # 窗口最大化
    2. print(win.get_show_state()) # 窗口状态,最大化为1,正常为0
    3. win.restore() # 窗口正常大小
    4. # win.minimize() # 窗口最小化
    5. print(win.rectangle()) # 获取窗口坐标 结果如(L524, T360, R1470, B851)
    6. win.close() # 关闭窗口

    控件操作

    控件选择

    1、根据窗口标题或类名选择:dlg = app[窗口类名/标题]   适合非英文程序或者类名中有空格等特殊符号

    2、根据窗口类名选择窗口dlg = app.窗口类名

    3、child_window()

    1. file = win['应用程序'].child_window(title="文件(F)", control_type="MenuItem")
    2. print(file.print_control_identifiers())

    框选控件

    1. file = win['应用程序'].child_window(title="文件(F)", control_type="MenuItem")
    2. file.draw_outline() # 可以修改颜色和遍框粗细,默认为绿色

    控件截图

    1. pic1 = win.capture_as_image() # 窗口截图
    2. pic1.save('p1.png')
    3. pic2 = file.capture_as_image() # 控件截图
    4. pic2.save('p2.png')

    获取控件属性

    1. print(win.wrapper_object()) # wrapper_object()获取控件的类型
    2. print(dir(win['应用程序'].child_window(title="文件(F)",
    3. control_type="MenuItem").wrapper_object())) # dir(a.wrapper_object())获取控件的所有属性
    4. print(win.children()) # children()获取控件的子元素
    5. print(win.texts()) # texts()获取控件文本内容
    6. print(win.class_name()) # 获取控件类名
    7. print(win.get_properties()) # 以字典形式返回控件属性

    菜单控件操作

    1. print(win['应用程序'].items()) # items()获取菜单的子菜单项
    2. print(win['应用程序'].item_by_index(1)) # item_by_index()通过下标选择对应的菜单项
    3. rep = win['应用程序'].item_by_path('编辑(E)->替换(R)...') # item_by_path()通过路径选择菜单项
    4. rep.click_input() # 点击菜单
    5. win.menu_select('编辑(E)->替换(R)...') # 一步执行上面两行

    获取对象坐标中心点

    1. bt = app['无标题 - 记事本']['应用程序'].child_window(title="文件(F)", control_type="MenuItem")
    2. point = bt.rectangle().mid_point() # rectangle()获取坐标;mid_point()获取坐标的中心点(x,y)
    3. print('X坐标是{}\nY坐标是{}'.format(point.x, point.y)) # 获取中心点坐标方便我们点击元素

    获取当前应用的所有窗口

    获取当前应用的所有窗口,只能是应用主体对象,不能是菜单控件等,top_window()定位方法:此方法可返回应用软件的最顶层窗口(是窗口,不是窗口弹出的对话框)

    1. print(app.top_window().print_control_identifiers())
    2. # sub_menu() 判断是否有下级菜单项,不断的递归
  • 相关阅读:
    函数栈帧的创建和销毁
    安卓APP webview加载H5 之间通信
    栈Stack和队列Queue
    LQ0009 平方十位数【枚举】
    递归简化数据处理方式
    go中之间的类型转换
    springboot中操作mongodb数据库(query update Criteria的使用方法)
    类复习【C#】
    什么是农业大数据,农业大数据的作用
    绿色安装MySQL5.7版本----配置my.ini文件注意事项
  • 原文地址:https://blog.csdn.net/JBY2020/article/details/126272766