当前位置:   article > 正文

【PYTHON】模块函数之pywinauto PC 端的自动化(笔记)_pywinauto 控件 速度 慢 timeout

pywinauto 控件 速度 慢 timeout

pip install --upgrade pywinauto

目录

P1 自动化的切入点

P2 程序检查辅助工具

P3 打开指定程序

P4 连接已经打开的程序

P5 选择应用程序的窗口

P6 应用程序的窗口操作方法

P7 窗口空间的相关操作

P8 窗口的分类

P9 窗口控件属性的获取

P10 窗口及控件截图处理

P11 菜单控件的相关操作

P12 Pywinauto的等待机制

P13 编辑类控件的基本操作

P14 模拟用户键盘操作

P15 模拟鼠标操作


P1 自动化的切入点

  • 确定应用程序的可访问技术

    • Win32 API (backend = "win32") - 默认的backend
      • MFC,VB6,VCL,简单的WinFOrms空间和大多数旧的应用程序
    • MS UI Automation API(backend = "uia")
      • WinForms,WPF,Store apps,Qt5,浏览器
  • 启动应用程序

    • Application:作用范围是一个进程。
    • Desktop:作用范围可以跨程序。

P2 程序检查辅助工具

  • Inspect.exe(C:\Program Files\Windows Kits\10\bin\x64)
  • spy++.exe:能显示程序所有控件,即适合使用win32的backend。
  • ViewWizard:(窗口信息查看精灵)
  • Aibote Windows Tool:纯代码RPA办公自动化框架,支持Android、Browser和Windows 三大平台。

P3 打开指定程序

打开记事本

  1. from pywinauto.application import Application
  2. app = Application(bacckend = "uia").start("notpad.exe")

打开任意的windows程序

  1. from pywinauto.application import Application
  2. app = Application(bacckend = "后端类型").start("程序位置路径") //.strat(r"程序位置路径")

P4 连接已经打开的程序

  • 通过进程号去进行连接

    • 任务管理器 详细信息 PID
  • 通过窗口句柄进行连接

    • ViewWizard(窗口信息查看精灵)
  1. from pywinauto.application import Application
  2. app = Application("uia").connect(process = 4444) // 进程号
  3. app = Application("uia").connect(handle = 1904040) // 窗口句柄
  4. print(app) // 检测

P5 选择应用程序的窗口

  • 根据窗口标题或类名选择
    • dlg = app[窗口类名/标题]
  • 根据窗口类名选择窗口
    • dlg = app.窗口类名
  1. from pywinauto.application import Application
  2. app = Application(bacckend = "uia").start("notpad.exe") //打开程序
  3. dlg = app["窗口类名/标题"] //方式一.选择窗口
  4. dlg = app.窗口类名 //方式二.适合英文软件
  5. dlg.print_control_identifiers() //打印窗口中所有的控件,检测是否选择窗口成功

P6 应用程序的窗口操作方法

  1. from pywinauto.application import Application
  2. app = Application(bacckend = "uia").start("notpad.exe") //打开程序
  3. dlg = app["notepad"] //选择窗口
  4. dlg = maximize() //窗口最大化
  5. dlg = minimize() //窗口最小化
  6. dlg = restore() //窗口恢复正常大小
  7. status = dlg.get_show_state() //查找窗口显示状态
  8. print(status) //最大化1、正常0
  9. dlg.close() //关闭窗口
  10. rect = dlg.rectangle() //获取当前窗口显示坐标
  11. print(rect) //左,上,右,下

P7 窗口空间的相关操作

  1. from pywinauto.application import Application
  2. app = Application(bacckend = "uia").start("notpad.exe") //打开程序
  3. dlg = app["notepad"] //选择窗口
  4. dlg.print_control_identifiers() //查看窗口上所有的控件
  5. menu = dlg["Menu"] //选择菜单
  6. print(menu.print_control_identifiers())
  7. file = menu.child_window(title="文件",control_type="MenuItem") //选择菜单项:文件
  8. file.print_control_identifiers()

P8 窗口的分类

状态栏

Status Bar

静态内容

Static

按钮

Button

复选框

Check Box

单选框

Radio Button

组框

Group Box

组合框

Combo Box

对话框(窗口)

Dialog

编辑栏

Edit

头部内容

Header

列表框

List Box

列表显示控件

List View

弹出菜单

Popup Menu

选项卡控件

Tab Control

工具栏

Tool bar

工具提示

Tool Tips

树状视图

Tree View

菜单

Menu

菜单项

Menu Item

窗格

Pane

P9 窗口控件属性的获取

  1. from pywinauto.application import Application
  2. app = Application(bacckend = "uia").start("notpad.exe") //打开程序
  3. dlg = app["notepad"] //选择窗口
  4. menu = dlg["Menu"] //选择菜单
  5. file = menu.child_window(title="文件") //选择菜单项:文件
  6. print(dlg.wrapper_object()) //查看控件类型:wrapper_object
  7. print(menu.wrapper_object())
  8. print(file.wrapper_object())
  9. print(dir(dlg.wrapper_object())) //查看对象所支持的方法:dir
  10. print(file.texts()) //控件的文本内容获取:texts
  11. print(dlg.children()) //获取子元素:children
  12. print(menu.class_name()) //获取控件类名:class_name
  13. print(menu.get_properties()) //获取控件的属性,返回的字典:get_properties(以上属性都会列出)

P10 窗口及控件截图处理

  1. from pywinauto.application import Application
  2. app = Application(bacckend = "uia").start("notpad.exe") //打开程序
  3. dlg = app["notepad"] //选择窗口
  4. menu = dlg["Menu"] //选择菜单
  5. file = menu.child_window(title="文件") //选择菜单项:文件
  6. pic = dlg.capture_as_image() //截图
  7. print(pic) //打印信息
  8. pic.save("01.png") //保存截图

P11 菜单控件的相关操作

  1. from pywinauto.application import Application
  2. app = Application(bacckend = "uia").start("notpad.exe") //打开程序
  3. dlg = app["notepad"] //选择窗口
  4. menu = dlg["Menu"] //选择菜单
  5. file = menu.child_window(title="文件") //选择菜单项:文件
  6. // -----菜单控件相关的操作-----
  7. print(menu.items()) //获取菜单的子菜单项
  8. m = menu.item_by_index(0) //通过下标去选择菜单项:item_by_index
  9. print(m)
  10. n = menu.item_by_path("文件->新建连接") //通过路径去选择菜单项:item_by_path
  11. print(n)
  12. // -----菜单项的操作方法-----
  13. file.click_input() //点击菜单项的方法:click_input

P12 Pywinauto的等待机制

  1. import time
  2. time.sleep(1) //等待时间
  • wait方法:等待窗口处于某个状态 / wait_not方法:等待窗口不处于某个特定状态

    • 参数:
      • wait_for:等待的状态
        • exists:表示该窗口是有效的句柄
        • visible:表示该窗口未隐藏
        • enabled:表示未禁用窗口
        • ready:表示该窗口可见并启用
        • active:表示该窗口处于活动状态
      • timeout:超时时间
      • retry_interval:重试时间间隔
  • wait_cpu_usage_lower 方法:等待该进程的cup的使用率低于某个阀值。

    • 注意:此方法仅适用于整个应用程序进程,不适用于窗口/元素。
    • 参数:
      • threshold:该进程cup占用率
      • timeout:超时时间
      • retry_interval:重试时间间隔
  1. from pywinauto.application import Application
  2. app = Application(bacckend = "uia").start("notpad.exe") //打开程序
  3. dlg = app["notepad"] //选择窗口
  4. menu = dlg["Menu"] //选择菜单
  5. file = menu.child_window(title="文件") //选择菜单项:文件
  6. file.click_input() //点击文件
  7. menu.item_by_path("文件->新建连接").click_input() //点击新建连接
  8. # 等待窗口处于可见状态
  9. new_dlg = app["新建连接"] //选择新建连接的窗口
  10. new_dlg.wait(wait_for="ready",timeout=10,retry_interval=1) //如果状态为'ready',就会执行下一行代码。
  11. # 等待窗口处于不可见状态
  12. new_dlg.wait_not(wait_for_not="ready",timeout=10,retry_interval=1) //如果状态为'ready',就会执行下一行代码。
  1. app = Application().connect(process=17260) //连接打开的进程
  2. app.wait_cpu_usage_lower(threshold=20,timeout=5,usage_interval=1)
  3. print("等待通过,当前该进程cup占用率低于20%")
  • 等待机制之timings模块

    • wait_until方法
      • 参数
        • timeout:超时时间
        • retry_interval:重试时间
        • func:执行的函数
        • value:比较的值
        • op:比较方式函数(默认相等)
        • args:给执行函数传位置参数
        • kwargs:给执行函数传关键字参数
  1. from pywinauto.timings import wait_until
  2. """
  3. 等函数返回的结果为5的时候,继续往下执行
  4. """
  5. i = 0
  6. def work():
  7. global i
  8. i += 1
  9. print("当前i的值为",i)
  10. return i
  11. # 等待work返回的结果为5,继续往下执行
  12. wait_until(10,1,work,5)
  13. print("等待通过")
  • 全局计时变量值的设置方法

    • timings.defaults():将全局计时设为默认值
    • timings.slow():将所有时间加倍
    • timings.fast():将所有计时除以2

P13 编辑类控件的基本操作

  1. """
  2. 打开笔记本,替换里面的文字。
  3. """
  4. import pywinauto
  5. app = pywinauto.Application().start("notepad.exe") //运行程序
  6. dlg = app["无标题 - 记事本"] //选择主窗口
  7. dlg.print_contol_identifiers() //获取窗口的控件信息
  8. dlg["Edit"].type_keys("这里是输入的文字.") //选择编辑框
  9. dlg.menu_select("编辑->替换(R)") //通过菜单选择替换(这个方法,有的程序能用,有的不能用)
  10. app["替换"].print_control_identifiers() //获取替换窗口的控件信息
  11. app["替换"]["Edit1"].type_keys("666") //选择查找编辑框
  12. app["替换"]["Edit2"].type_keys("999") //选择替换为编辑框
  13. app["替换"]["Button3"].click() //选择全部替换按钮,并点击

P14 模拟用户键盘操作

  • 键盘操作模块:pywinauto.keyboard

    • send_keys方法:send_keys(按键)
      • 按F5:send_keys({VK_F5})
      • 按回车键:send_keys({VK_RETURN})
      • 按普通字母键:send_keys('A')

ESC

VK_ESCAPE(27)

Shift

VK_SHIFT(16)

回车

VK_RETURN(13)

Ctrl

VK_CONTROL(17)

TAB

VK_TAB(9)

Alt

VK_MENU(18)

Caps Lock

VK_CAPITAL(20)

空格

VK_SPACE(32)

退格

VK_BACK(8)

左/右win

VK_LWIN(91) / RWIN(92)

  1. send_keys("{VK_LWIN}")
  2. send_keys("cmd")
  3. send_keys("{VK_RETURN}")
  4. send_keys("{VK_LWIN}cmd{VK_RETURN}")
  • 键盘修饰符的使用

    • + :按Shift
    • ^ :按Ctrl
    • % : 按Alt
    • ^s :按Ctrl+S
  1. from pywinauto.keyboard import send_keys
  2. send_keys("^a")
  3. send_keys("^+n")
  4. send_keys("%+{VK_F9}")

P15 模拟鼠标操作

click:鼠标单击

  1. from pywinauto import mouse
  2. mouse.click(coords=(580,52)) #默认鼠标左键

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/爱喝兽奶帝天荒/article/detail/1003384
推荐阅读
相关标签
  

闽ICP备14008679号