pywinauto的初级入门

    技术2022-07-15  79

    pywinauto的学习记录

    安装使用须知确定app的可访问技术启动应用程序辅助工具 详细使用开启app连接已经打开的应用程序选择程序窗口窗口控件分类窗口控件基本属性获取方法获取控件的文本内容对窗口/控件的截图处理菜单的相关操作菜单控件菜单项控件 等待机制wait 系列timings系列 编辑类控件模拟用户键盘的操作键盘修饰符的使用鼠标用户操作访问系统通知区域结合selenium实现文件上传

    第一次尝试这种方法记录自己学过的一些东西,后续会将一些重要的知识点慢慢记录进来,hello,my blog~

    安装

    pip installer pywinauto

    使用须知

    pywinauto官方文档

    确定app的可访问技术

    1、win32 API(backend=“win32”) 一般是MFC、VB6、VCL,简单的WinForms控件和大多数旧的应用程序 2、MS UI Automoation API(backend=“uia”) 一般是WinForms、WPF、Store app,Qt5,浏览器

    启动应用程序

    1、Applicant 作用范围:单个进程 2、desktop 作用范围:跨进程

    辅助工具

    spy++ / inspect.exe

    详细使用

    开启app

    启动notepad

    from pywinauto.application import Application app = Application(backend='uia').start("notepad.exe")

    启动qq

    from pywinauto.application import Application app = Application(backend='uia').start(r"D:\\Program Files\\Tencent\\QQ\\Bin\\QQScLauncher.exe")

    或者

    import pywinauto app = pywinauto.Application(backend='uia').start(r"D:\\Program Files\\Tencent\\QQ\\Bin\\QQScLauncher.exe")

    连接已经打开的应用程序

    1、通过进程号连接 任务管理器 查看 PID即为进程号 :5460

    app = Application(backend='uia').connect(process="XXX")

    2、通过窗口句柄连接

    app = Application(backend='uia').connect(handle="XXX")

    或者通过inspect查看 ProcessID and NativeWindowHandle

    选择程序窗口

    1、根据窗口标题/类名选择 推荐使用

    window = app["QQ"] # window = app["TXGuiFoundation"] window.print_control_identifiers()

    2、根据窗口类名选择

    window = app.TXGuiFoundation window.print_control_identifiers()

    获取当前窗口的坐标

    print(app["QQ"].rectangle())

    窗口控件分类

    类别名称状态栏StatusBar按钮Button单选框RadioButton组合框ComboBox复选框CheckBox组框GroupBox编辑栏Edit列表框ListBox弹出菜单PopupMenu工具栏Toolbar树状视图Tree View菜单栏MenuItem菜单Menu窗格Pane静态内容Static对话框(窗口)Dialog头部内容Header列表显示控件ListView选项卡控件TabControl工具提示ToolTips

    窗口控件基本属性获取方法

    1、获取控件类型:wrapper_object() 2、获取控件支持的方法:print(dir(a.wrapper_object())) 3、获取控件的子元素:children() 4、获取控件类名:class_name() 5、以字典的形式返回控件的属性:get_properties() 【以上全部可以用inspect直接查看获取】

    获取控件的文本内容

    file.texts()

    对窗口/控件的截图处理

    方法:capture_as_image()`

    pic = app[title_notepad].capture_as_image() print(pic) pic.save('01.png')

    菜单的相关操作

    菜单控件

    1、通过下标选择菜单项

    menu = window['menu'] print(menu.items())#获取菜单的子菜单项 m = menu.item_by_index(1) print(m)

    2、通过路径选择菜单项

    menu = window['menu'] print(menu.items())#获取菜单的子菜单项 m = menu.item_by_path("文件->新建连接...") print(m)

    菜单项控件

    m.click_input()#点击

    等待机制

    wait 系列

    wait and wait_not

    官方文档

    window.wait(wait_for='ready',timeout=10,retry_inteval=1)

    wait_cpu_usage_lower() 等待该进程的cpu使用率低于某个阈值

    参数: threshold:该进程的cpu占用率低于某个阈值 timeout:超时时间 retry_inteval:重试时间间隔

    app = pywinauto.Application(backend='uia').connect(process=16972) app.wait_cpu_usage_lower(threshold=5,timeout=10,retry_inteval=1)

    timings系列

    wait_until(10.5, .5, self.item_count, 10)#等待item_count函数的结果为5的时候开始停止等待。。。若超过10s,则超时报错

    timings模块 Timings.defaults():将全局计时设为默认值 Timings.slow():将所有时间加倍(使脚本的执行速度降低) Timings.fast():将所有计时除以2

    编辑类控件

    作者介绍得很清楚——实例notepad

    https://www.cnblogs.com/wuxunyan/p/9366178.html

    import pywinauto #1.运行记事本程序 app = pywinauto.Application().start('notepad.exe') #2.窗体选择 title_notepad = u'无标题-记事本' print(app[title_notepad].print_control_identifiers()) #3.选择一个菜单项 app[title_notepad].menu_select('帮助->关于记事本') print(dir(app[title_notepad].wrapper_object())) time.sleep(0.2) #4.点击新弹出窗体的确定按钮 out_note = u'关于记事本' button_name_ok = '确定' app[out_note][button_name_ok].click() #5.将当前窗口截图保存 pic = app[title_notepad].capture_as_image() print(pic) pic.save('01.png') #6.在记事本中输入一些文本 dlg = app[title_notepad] dlg['Edit'].type_keys("我是方法1\n",with_spaces=True,with_newlines=True) app.title_notepad.Edit.type_keys("我是方法2\n",with_spaces=True,with_newlines=True) app.title_notepad.Edit.type_keys('pywinauto works!\n',with_spaces=True,with_newlines=True) app.title_notepad.Edit.type_keys('hello word !\n',with_spaces=True,with_newlines=True) #7.替换操作 app[title_notepad].menu_select('编辑(&E) -> 替换(&R)..') app['替换'].print_control_identifiers() app['替换']['Edit1'].type_keys("word") app['替换']['Edit2'].type_keys("baby") app['替换'].Button3.click() #全部替换 app['替换'].Button4.click() #取消 #8.退出 app[title_notepad].menu_select('文件(&F) -> 退出(&X)')#现在的top窗口为'记事本' app.top_window().print_control_identifiers() app.top_window().Button2.click()

    模拟用户键盘的操作

    send_keys()

    按键对应参数F5send_keys(“{VK_F5}”)/send_keys("{F5}")普通字母send_keys(‘A’)回车键send_keys(“{VK_RETURN}”)esc键send_keys(“{VK_ESCAPE}”)tab键send_keys(“{VK_TAB}”)caps Locksend_keys(“{VK_CAPITAL}”)shiftsend_keys(“{VK_SHIFT}”)ctrl键send_keys(“{VK_CONTROL}”)Alt键send_keys(“{VK_MENU}”)空格键send_keys(“{VK_SPACE}”)退格键send_keys(“{VK_BACK}”)左win键send_keys(“{VK_LWIN}”)右win键send_keys(“{VK_RWIN}”)

    案例:通过案件打开CMD进入python

    from pywinauto.keyboard import * import time send_keys("{VK_LWIN}") time.sleep(0.1) send_keys("cmd") send_keys("{VK_RETURN}") #以上三行可以写成一行命令:send_keys("{VK_LWIN}cmd{VK_RETURN}") time.sleep(1) send_keys("python") send_keys("{VK_RETURN}")

    键盘修饰符的使用

    修饰符按键“+”shift“^”ctrl“%”alt“^s”ctrl+s from pywinauto.keyboard import * send_keys("^a") #全选

    鼠标用户操作

    操作方法单击click双击doubl_click右击right_click中间点击wheel_click按下鼠标press释放鼠标replace鼠标移动move滚动鼠标scroll from pywinauto import mouse mouse.click(coords=(475,20))#默认单击左键,coords:像素 mouse.scroll(coords=(1919,257),wheel_dist=-3)#wheel_dist:为正向上滚动,为负向下滚动

    访问系统通知区域

    1、通过explorer

    app = pywinauto.Application(backend='uia').connect(path="explorer") # app["任务栏"].print_control_identifiers() # task = app["任务栏"]["用户提示通知区域"] task = app["任务栏"].child_window(title="用户提示通知区域", auto_id="1504", control_type="ToolBar") # task.print_control_identifiers() task.child_window(title="扬声器: 静音", auto_id="{7820AE73-23E3-4229-82C1-E41CB67D5B9C}", control_type="Button").click() #task.Button19.click() #通过button点击

    2、访问隐藏的通知区

    app = pywinauto.Application(backend='uia').connect(path="explorer") task = app["任务栏"].child_window(title="通知 V 形", auto_id="1502", control_type="Button") task.click() #隐藏窗口为桌面上的新的窗口 app["通知溢出"].print_control_identifiers() wechat = app["通知溢出"].child_window(title="微信", auto_id="{0A61FEA6-FC1E-4277-47CE-70846CAB39F7}", control_type="Button") wechat.click()

    结合selenium实现文件上传

    上传网址:https://www.layui.com/demo/upload.html

    import time from selenium import webdriver import pywinauto from pywinauto.keyboard import send_keys chrome_options = webdriver.ChromeOptions() # chrome_options.add_argument('--headless') #无头浏览模式 browser = webdriver.Chrome(chrome_options=chrome_options) url = 'https://www.layui.com/demo/upload.html' browser.get(url) browser.find_element_by_xpath('//button[@id="test1"]').click() time.sleep(10) app = pywinauto.Desktop()#显示桌面的所有app # app["打开"].print_control_identifiers() #选择文件地址输入的工具框 app["打开"].wait('ready', 10, 1) app["打开"]['Toolbar3'].click() send_keys('C:\\Users\\ASUS\\Desktop') send_keys("{VK_RETURN}") #输入单个文件 #选中文件名输入框 app["打开"]["文件名(&N):Edit"].type_keys('"01.jpg"') app["打开"]["打开(&O)"].click() #输入多个文件(利用键盘) send_keys('"02.jpg"') send_keys('"03.jpg"')

    写在最后: 1、感谢b站某老师的视频讲解,内容很详细 2、刚开始学习,还有很多待补充的内容~ 记录下来防止遗忘,随时可翻看~ (若有错误,欢迎交流指正)

    Processed: 0.009, SQL: 9