pywinauto打印窗口控件报错

from pywinauto import Application

# 启动记事本应用程序
app = Application().start("notepad.exe")

# 连接到记事本窗口
window = app["notepad"]

# 打印记事本窗口中的所有控件
window.print_control_identifiers()

运行之后报错,求解决办法


F:\python\Lib\site-packages\pywinauto\application.py:1053: RuntimeWarning: Application is not loaded correctly (WaitForInputIdle failed)
  warnings.warn('Application is not loaded correctly (WaitForInputIdle failed)', RuntimeWarning)
Traceback (most recent call last):
  File "F:\python\Lib\site-packages\pywinauto\application.py", line 248, in __resolve_control
    ctrl = wait_until_passes(
           ^^^^^^^^^^^^^^^^^^
  File "F:\python\Lib\site-packages\pywinauto\timings.py", line 458, in wait_until_passes
    raise err
pywinauto.timings.TimeoutError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "F:\py\yd.py", line 10, in <module>
    window.print_control_identifiers()
  File "F:\python\Lib\site-packages\pywinauto\application.py", line 595, in print_control_identifiers
    this_ctrl = self.__resolve_control(self.criteria)[-1]
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\python\Lib\site-packages\pywinauto\application.py", line 259, in __resolve_control
    raise e.original_exception
  File "F:\python\Lib\site-packages\pywinauto\timings.py", line 436, in wait_until_passes
    func_val = func(*args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^
  File "F:\python\Lib\site-packages\pywinauto\application.py", line 201, in __get_ctrl
    dialog = self.backend.generic_wrapper_class(findwindows.find_element(**criteria[0]))
                                                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\python\Lib\site-packages\pywinauto\findwindows.py", line 84, in find_element
    elements = find_elements(**kwargs)
               ^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\python\Lib\site-packages\pywinauto\findwindows.py", line 303, in find_elements
    elements = findbestmatch.find_best_control_matches(best_match, wrapped_elems)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "F:\python\Lib\site-packages\pywinauto\findbestmatch.py", line 533, in find_best_control_matches
    raise MatchError(items = name_control_map.keys(), tofind = search_text)
pywinauto.findbestmatch.MatchError: Could not find 'notepad' in 'dict_keys([])'
[Finished in 15.8s]
import time
from pywinauto import Application

# 启动记事本应用程序
app = Application().start("notepad.exe")

# 等待应用程序加载完成
time.sleep(2)

# 连接到记事本窗口
window = app["notepad"]

# 打印记事本窗口中的所有控件
window.print_control_identifiers()
  • 文章:用pywinauto抓取微信公众号 中也许有你想要的答案,请看下吧
  • 您还可以看一下 刘伶华老师的全网独家PC端自动化测试实战课程课程中的 pywinauto选择指定的窗口小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    根据提供的参考资料,以及对pywinauto库的了解,以下是解决使用pywinauto打印窗口控件报错的具体步骤:

    1. 确认报错信息:首先需要了解具体的报错信息是什么,这样才能更准确地判断问题所在。根据问题描述,如果报错信息中有具体的错误信息,可以提供给我,我会尽力帮您解决。

    2. 确定是否正确安装pywinauto库:确保已经正确地安装了pywinauto库。可以使用以下命令来安装pywinauto:

    pip install pywinauto

    如果已经安装了pywinauto,请确保版本是最新的。

    1. 查找报错原因:利用pywinauto提供的print_control_identifiers()方法,可以打印出应用程序的控件信息,其中包括控件的坐标。根据参考资料中提供的代码示例,您可以尝试使用以下代码来获取指定控件的坐标:

    ```python import sys from pywinauto import Application

    # 实例化Application对象 app = Application(backend='uia')

    # 启动应用程序 app.start("your_application.exe")

    # 重定向标准输出,将原本的标准输出信息写入自定义的空间内,以获取控件信息 stdout = sys.stdout sys.stdout = TempStdoutArea()

    # 打印控件信息 app.print_control_identifiers()

    # 将控件信息转移到control_identifiers,并还原标准输出 control_identifiers, sys.stdout = sys.stdout, stdout

    # 解析控件信息,获取指定控件的坐标 control_coord = GetControlCoord(app) specified_control_coord = control_coord.get_coord("your_control_name") ```

    其中,"your_application.exe"为您要操作的应用程序的可执行文件名,"your_control_name"为您要获取坐标的控件名称/标识符。请根据实际情况进行修改。

    1. 处理报错信息:根据控件的具体坐标信息,可以进一步分析报错的原因,并尝试解决。例如,如果报错是因为找不到指定的控件,有以下几种可能的原因和解决方法:

    2. 控件名称或标识符错误:请确认所指定的控件名称或标识符是否正确,在查找控件时要注意大小写、空格等;

    3. 控件未加载完成:在获取控件坐标前,先等待应用程序加载完全,并确保所指定的控件已经出现在界面上;
    4. 控件位置变化:如果应用程序界面中的控件位置是动态变化的,需要在代码中添加相应的控制逻辑,使得代码能够适应控件位置的变化。

    请根据具体的报错信息和实际情况进行处理,如果您能提供更多的报错信息或代码示例,我也将能够更准确地帮助您解决问题。