• 原创-使用pywinauto和swapy-ob-0.4.3进行dotnet的winform程序控制(二)


    上一篇讲到用winspy++这个工具分析dotnet的winform的程序,再使用pywinauto控制。这篇我加入了自动分析工具swapy-ob-0.4.3,辅助进行分析。

    首先启动winform程序

    然后再启动swapy

    出现??的原因是swapy这个程序对中文unicode不支持显示

    右击Form1,选择Click

    生成了Form1的代码

    拷贝右侧的代码,试着运行

    import pywinauto
    
    pwa_app = pywinauto.application.Application()
    w_handle = pywinauto.findwindows.find_windows(title=u'Form1', class_name='WindowsForms10.Window.8.app.0.141b42a_r16_ad1')[0]
    window = pwa_app.window_(handle=w_handle)
    window.Click()

    输出如下提示:

    E:pyautogui>python swaptest.py
    swaptest.py:5: DeprecationWarning: Method .window_() is deprecated, use .window(
    ) instead.
      window = pwa_app.window_(handle=w_handle)
    Traceback (most recent call last):
      File "swaptest.py", line 5, in <module>
        window = pwa_app.window_(handle=w_handle)
      File "C:Python37-32libsite-packagespywinauto\__init__.py", line 50, in wra
    p
        return method(*args, **kwargs)
      File "C:Python37-32libsite-packagespywinautoapplication.py", line 1203, i
    n window
        raise AppNotConnected("Please use start or connect before trying "
    pywinauto.application.AppNotConnected: Please use start or connect before trying
     anything else

    提示是说未启动程序导致,顺便也点击Form1下的控件

    点击Edit3的右键click生成代码

     ctrl = window['3']

    ctrl.Click()

    这个目的是为了获取控件的访问id,进行了改造代码如下:

    import pywinauto
    
    pwa_app = pywinauto.application.Application().start("WindowsFormsInput.exe")
    w_handle = pywinauto.findwindows.find_windows(title=u'Form1', class_name='WindowsForms10.Window.8.app.0.141b42a_r16_ad1')[0]
    window = pwa_app.window_(handle=w_handle)
    ctrl = window['3']
    ctrl.type_keys(r"E:pyautoguice.png")

    运行代码后的效果是,打开了程序,但控制台报错:

    在不关闭winfom下,再次运行这个脚本,这次成功了。

    也就是证明这种方式的调用dotnet的winform,dotnet在首次展示窗口前,存在一定的延时。所以导致

    w_handle = pywinauto.findwindows.find_windows(title=u'Form1', class_name='WindowsForms10.Window.8.app.0.141b42a_r16_ad1')[0]

    获取不到程序句柄数组。于是我加入了延时语句,改造如下:

    import pywinauto,time
    
    pwa_app = pywinauto.application.Application().start("WindowsFormsInput.exe")
    time.sleep( 0.1 )
    w_handle = pywinauto.findwindows.find_windows(title=u'Form1', class_name='WindowsForms10.Window.8.app.0.141b42a_r16_ad1')[0]
    window = pwa_app.window(handle=w_handle)
    ctrl = window['3']
    ctrl.type_keys(r"E:pyautoguice.png")
    window[u'设置'].click()

    效果如下:

    总结:采用swapy生成的运行代码的机制,运行dotnet的winform时,要加入一定的延时,让加载winform的ui后,才能获取到winform的句柄

  • 相关阅读:
    有关Python Selenium的使用心得
    win11 资源管理器右键菜单改回老样式
    js关闭被打开的iframe页面,并在新窗口打开
    sqlplus文件查看oracle自带命令的执行过程
    xtrabackup+MySQL8全备+增备脚本
    DG:有多个备库如何切换
    MySQL匿名空用户名处理
    xtrabackup: error: xb_load_tablespaces() failed with error code 57
    四月常用工具汇总
    yum安装openldap,slapd.conf文件
  • 原文地址:https://www.cnblogs.com/qkabcd/p/11106075.html
Copyright © 2020-2023  润新知