使用pywinauto无法访问Kleopatra弹出的子窗口如何解决
问题描述
控件标识符

使用pywinauto实现Kleopatra应用文件解密流程自动化时,可正常连接访问主窗口元素,但无法捕获操作触发的弹出新窗口。
需要访问标题为Select One or More Files to Decrypt and/or Verify的新窗口,在窗口中选择待解密/验证的文件。
初始实现代码运行报错,代码如下:
import pywinauto app = pywinauto.application.Application(backend='uia').start(r"C:\Program Files (x86)\Gpg4win\bin\kleopatra.exe").connect(title="kleopatra",timeout=100) fileMenu = app.kleopatra.child_window(title="File", auto_id="MainWindow#1.file.file", control_type="MenuItem").wrapper_object() fileMenu.click_input() # app.kleopatra.print_control_identifiers() decryptMenu = app.kleopatra.child_window(title="Decrypt/Verify...", auto_id="KXMLGUIClient-KActionCollection.file_decrypt_verify_files", control_type="MenuItem") decryptMenu.click_input() selectFileWindow = pywinauto.application.Application(backend='uia').connect(title = "Select One or More Files to Decrypt and/or Verify")
报错信息

解决方法
连接弹窗失败的核心原因有两点:
- 点击解密菜单后没有预留窗口加载时间,执行connect逻辑时弹窗还未完成渲染,无法匹配到对应窗口
- 不需要新建Application实例连接弹窗:该文件选择窗口属于Kleopatra主进程,直接复用已绑定主程序的app对象等待弹窗即可,新建实例容易出现进程匹配错误
修复后的参考代码:
import pywinauto # 启动并连接Kleopatra主程序 app = pywinauto.Application(backend='uia').start( r"C:\Program Files (x86)\Gpg4win\bin\kleopatra.exe" ).connect(title="kleopatra", timeout=100) # 点击文件菜单 app.kleopatra.child_window( title="File", auto_id="MainWindow#1.file.file", control_type="MenuItem" ).click_input() # 点击解密/验证选项 decrypt_menu = app.kleopatra.child_window( title="Decrypt/Verify...", auto_id="KXMLGUIClient-KActionCollection.file_decrypt_verify_files", control_type="MenuItem" ) decrypt_menu.click_input() # 等待文件选择弹窗加载可见,超时时间设置为10秒 select_file_dlg = app.window( title="Select One or More Files to Decrypt and/or Verify", control_type="Window", timeout=10 ) select_file_dlg.wait('visible') # 后续可直接操作弹窗内元素,以下为示例:填入目标文件路径后点击打开按钮 file_path_edit = select_file_dlg.child_window(title="文件名(N):", control_type="Edit") file_path_edit.set_edit_text(r"C:\path\to\your\encrypted\file.gpg") select_file_dlg.child_window(title="打开(O)", control_type="Button").click_input()
如果上述方法仍无法定位窗口,可在点击解密菜单后执行print([w.window_text() for w in app.windows()]),打印当前主进程下所有顶层窗口的标题,核对弹窗实际标题是否存在多语言适配、字符拼写偏差,部分中文环境下窗口标题可能显示为本地化文本,而非默认英文标题。
内容的提问来源于stack exchange,提问作者user19029187
相关产品推荐
相关产品推荐

