weixin_45905450 2024-05-06 16:46 采纳率: 100%
浏览 18
已结题

想通过pywinauto自动电机应用程序按钮,但是找不到应用程序按钮信息

本人想通过pywinauto实现自动点击应用程序的“开始检查”按钮,

img

但是试了print_control_identifiers(),spy++,句柄精灵等工具,都无法获取按钮控件的句柄,导致无法点击按钮。具体print_control_identifiers()打印的结果如下:

from pywinauto import Application

from pywinauto import mouse

# 连接到指定的进程

app = Application(backend='win32').start(r'C:\Program Files\DSPClient\CEMS\DLP\dlpTool\CheckFileMdlp.exe')

#app = Application().connect(process=10248)



# 获取主窗口

window = app.window()



# 获取窗口的类名

class_name = window.class_name()

print("窗口类名:", class_name)



# 获取窗口的标题

title = window.window_text()

print("窗口标题:", title)



#print(pywinauto.__version__)

window.print_control_identifiers()

Control Identifiers:



QWidget - '文档扫描'    (L560, T270, R1360, B770)

['文档扫描', '文档扫描QWidget', 'QWidget', 'QWidget0', 'QWidget1']

child_window(title="文档扫描", class_name="QWidget")

  |

  | QWidget - 'Wait'    (L560, T270, R1360, B730)

  | ['WaitQWidget', 'Wait', 'QWidget2']

  | child_window(title="Wait", class_name="QWidget")

  |

  | QWidget - 'frame'    (L560, T310, R1360, B770)

  | ['frame', 'frameQWidget', 'QWidget3']

  | child_window(title="frame", class_name="QWidget")

  |    |

  |    | QWidget - 'QFileCheckNew'    (L560, T310, R1360, B770)

  |    | ['QWidget4', 'QFileCheckNew', 'QFileCheckNewQWidget']

  |    | child_window(title="QFileCheckNew", class_name="QWidget")

  |    |    |

  |    |    | QWidget - 'frmResult'    (L560, T310, R660, B340)

  |    |    | ['frmResult', 'QWidget5', 'frmResultQWidget']

  |    |    | child_window(title="frmResult", class_name="QWidget")

  |    |    |    |

  |    |    |    | QWidget - 'QLookupAllData'    (L1147, T589, R1894, B1133)

  |    |    |    | ['QLookupAllDataQWidget', 'QWidget6', 'QLookupAllData']

  |    |    |    | child_window(title="QLookupAllData", class_name="QWidget")

  |    |    |

  |    |    | QWidget - 'QLookupAllData'    (L1147, T589, R1894, B1133)

  |    |    | ['QLookupAllDataQWidget', 'QWidget6', 'QLookupAllData']

  |    |    | child_window(title="QLookupAllData", class_name="QWidget")

  |    |    |

  |    |    | QWidget - 'frmCheck'    (L560, T310, R1360, B770)

  |    |    | ['frmCheckQWidget', 'QWidget7', 'frmCheck']

  |    |    | child_window(title="frmCheck", class_name="QWidget")

  |    |

  |    | QWidget - 'frmResult'    (L560, T310, R660, B340)

  |    | ['frmResult', 'QWidget5', 'frmResultQWidget']

  |    | child_window(title="frmResult", class_name="QWidget")

  |    |    |

  |    |    | QWidget - 'QLookupAllData'    (L1147, T589, R1894, B1133)

  |    |    | ['QLookupAllDataQWidget', 'QWidget6', 'QLookupAllData']

  |    |    | child_window(title="QLookupAllData", class_name="QWidget")

  |    |

  |    | QWidget - 'QLookupAllData'    (L1147, T589, R1894, B1133)

  |    | ['QLookupAllDataQWidget', 'QWidget6', 'QLookupAllData']

  |    | child_window(title="QLookupAllData", class_name="QWidget")

  |    |

  |    | QWidget - 'frmCheck'    (L560, T310, R1360, B770)

  |    | ['frmCheckQWidget', 'QWidget7', 'frmCheck']

  |    | child_window(title="frmCheck", class_name="QWidget")

  |

  | QWidget - 'QFileCheckNew'    (L560, T310, R1360, B770)

  | ['QWidget4', 'QFileCheckNew', 'QFileCheckNewQWidget']

  | child_window(title="QFileCheckNew", class_name="QWidget")

  |    |

  |    | QWidget - 'frmResult'    (L560, T310, R660, B340)

  |    | ['frmResult', 'QWidget5', 'frmResultQWidget']

  |    | child_window(title="frmResult", class_name="QWidget")

  |    |    |

  |    |    | QWidget - 'QLookupAllData'    (L1147, T589, R1894, B1133)

  |    |    | ['QLookupAllDataQWidget', 'QWidget6', 'QLookupAllData']

  |    |    | child_window(title="QLookupAllData", class_name="QWidget")

  |    |

  |    | QWidget - 'QLookupAllData'    (L1147, T589, R1894, B1133)

  |    | ['QLookupAllDataQWidget', 'QWidget6', 'QLookupAllData']

  |    | child_window(title="QLookupAllData", class_name="QWidget")

  |    |

  |    | QWidget - 'frmCheck'    (L560, T310, R1360, B770)

  |    | ['frmCheckQWidget', 'QWidget7', 'frmCheck']

  |    | child_window(title="frmCheck", class_name="QWidget")

  |

  | QWidget - 'frmResult'    (L560, T310, R660, B340)

  | ['frmResult', 'QWidget5', 'frmResultQWidget']

  | child_window(title="frmResult", class_name="QWidget")

  |    |

  |    | QWidget - 'QLookupAllData'    (L1147, T589, R1894, B1133)

  |    | ['QLookupAllDataQWidget', 'QWidget6', 'QLookupAllData']

  |    | child_window(title="QLookupAllData", class_name="QWidget")

  |

  | QWidget - 'QLookupAllData'    (L1147, T589, R1894, B1133)

  | ['QLookupAllDataQWidget', 'QWidget6', 'QLookupAllData']

  | child_window(title="QLookupAllData", class_name="QWidget")

  |

  | QWidget - 'frmCheck'    (L560, T310, R1360, B770)

  | ['frmCheckQWidget', 'QWidget7', 'frmCheck']

  | child_window(title="frmCheck", class_name="QWidget")

  |

  | QWidget - 'frame_3'    (L560, T270, R1360, B310)

  | ['frame_3QWidget', 'frame_3', 'QWidget8']

  | child_window(title="frame_3", class_name="QWidget")

img

请指导我如何才能获取按钮控件的相关信息

  • 写回答

22条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-05-06 16:52
    关注

    引自免费微信小程序:皆我百晓生

    根据你提供的信息,看起来你正在尝试自动化一个基于Qt的应用程序。Pywinauto默认对Win32应用程序的支持较好,而对于非标准的UI框架(如Qt)可能识别控件的能力有限。不过,Pywinauto也提供了一些方法来处理这类情况,尤其是对于Qt应用程序,可以尝试使用backend='uia'来切换到UIA(UI Automation)后端,因为UIA提供了更广泛的支持。

    首先,尝试更换后端并重新获取控件信息:

    from pywinauto import Application
    
    app = Application(backend='uia').start(r'C:\Program Files\DSPClient\CEMS\DLP\dlpTool\CheckFileMdlp.exe')
    window = app.window()
    
    window.print_control_identifiers()
    

    如果切换后端依然无法识别到按钮,可能需要手动定位控件。由于你提到的按钮文本是“开始检查”,我们可以尝试基于文本属性来查找控件。这里是一个示例代码,展示如何尝试根据文本找到并点击按钮:

    from pywinauto.keyboard import send_keys
    from pywinauto import Application
    
    # 使用UIA后端启动应用
    app = Application(backend='uia').start(r'C:\Program Files\DSPClient\CEMS\DLP\dlpTool\CheckFileMdlp.exe')
    window = app.window()
    
    # 尝试根据文本"开始检查"找到按钮并点击
    try:
        start_check_button = window.child_window(title="开始检查", control_type="Button")
        start_check_button.click_input()
    except Exception as e:
        print(f"未找到'开始检查'按钮,错误信息: {e}")
    
    # 如果上述方法不成功,尝试遍历所有子控件寻找
    if not start_check_button.exists():
        for control in window.descendants():
            if control.window_text() == "开始检查":
                control.click_input()
                break
        else:
            print("遍历所有控件仍未找到'开始检查'按钮")
    

    这段代码首先尝试直接根据文本和控件类型查找并点击“开始检查”按钮,如果失败,则遍历窗口的所有子控件(包括深层嵌套的),寻找包含特定文本的按钮并尝试点击。如果最终还是无法定位到按钮,可能需要进一步分析应用的具体实现,比如是否需要在点击前先激活某个窗口,或者控件的识别有特殊要求等。

    请确保你的环境已经安装了最新版本的Pywinauto,因为不同的版本可能在支持度上有所差异。如果问题依旧,可能需要深入研究该应用程序的UI实现细节,或者考虑是否有其他自动化测试工具更适合该场景,比如使用AutoIt、SikuliX,甚至是直接利用Qt自带的自动化测试工具。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(21条)

报告相同问题?

问题事件

  • 系统已结题 5月18日
  • 已采纳回答 5月10日
  • 创建了问题 5月6日

悬赏问题

  • ¥15 找人不需要人工智能回答的gamit解算后做形变分析
  • ¥20 RL+GNN解决人员排班问题时梯度消失
  • ¥15 统计大规模图中的完全子图问题
  • ¥15 使用LM2596制作降压电路,一个能运行,一个不能
  • ¥60 要数控稳压电源测试数据
  • ¥15 能帮我写下这个编程吗
  • ¥15 ikuai客户端l2tp协议链接报终止15信号和无法将p.p.p6转换为我的l2tp线路
  • ¥15 phython读取excel表格报错 ^7个 SyntaxError: invalid syntax 语句报错
  • ¥20 @microsoft/fetch-event-source 流式响应问题
  • ¥15 ogg dd trandata 报错