You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

pywinauto ElementNotFoundError求助:查找元素并点击逻辑报错

问题:滚动数据网格查找元素时触发ElementNotFoundError

编写代码循环滚动auto_id为uxEntityDataGrid的数据网格,查找title为"test123"的Text元素,找到且可见时点击并跳出循环,但执行if语句时触发报错。

原代码

for x in range(50):
    element = app.Dialog.child_window(title="test123", control_type="Text")
    app.Dialog.child_window(auto_id="uxEntityDataGrid").wrapper_object().scroll("down", "line", count=5,
                                                                                retry_interval=0.01)
    try:
        if element.is_visible():
            print("Element is Visible")
            element.click_input()
            break
    except Exception as e:
        raise e

报错栈

Traceback (most recent call last):
  File "C:\Program Files\Python311\Lib\site-packages\pywinauto\application.py", line 250, in __resolve_control
    ctrl = wait_until_passes(
           ^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\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 "D:\get object project\ObjectIdentification.py", line 37, in <module>
    raise e
  File "D:\get object project\ObjectIdentification.py", line 33, in <module>
    if element.is_visible():
       ^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\site-packages\pywinauto\application.py", line 379, in __getattribute__
    ctrls = self.__resolve_control(self.criteria)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\site-packages\pywinauto\application.py", line 261, in __resolve_control
    raise e.original_exception
  File "C:\Program Files\Python311\Lib\site-packages\pywinauto\timings.py", line 436, in wait_until_passes
    func_val = func(*args, **kwargs)
               ^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\site-packages\pywinauto\application.py", line 222, in __get_ctrl
    ctrl = self.backend.generic_wrapper_class(findwindows.find_element(**ctrl_criteria))
                                              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Program Files\Python311\Lib\site-packages\pywinauto\findwindows.py", line 87, in find_element
    raise ElementNotFoundError(kwargs)
pywinauto.findwindows.ElementNotFoundError: {'title': 'test123', 'control_type': 'Text', 'top_level_only': False, 'parent': <uia_element_info.UIAElementInfo - 'Merlot.Aero', Window, 1444560>, 'backend': 'uia'}

Process finished with exit code 1

解决方案

问题根源

  1. 元素查找时机错误:提前绑定element查找条件,此时元素可能未滚动到可见区域,导致pywinauto尝试查找时触发超时
  2. 异常处理不当:捕获所有异常后直接抛出,未区分"元素未找到"的正常情况,导致循环提前终止

修改后代码

from pywinauto.findwindows import ElementNotFoundError
import time

for x in range(50):
    # 优先滚动数据网格
    data_grid = app.Dialog.child_window(auto_id="uxEntityDataGrid").wrapper_object()
    data_grid.scroll("down", "line", count=5, retry_interval=0.01)
    
    # 滚动后短暂等待,确保界面元素更新完毕
    time.sleep(0.1)
    
    try:
        # 每次滚动后重新查找元素,避免提前绑定查找条件
        element = app.Dialog.child_window(title="test123", control_type="Text")
        if element.is_visible():
            print("Element is Visible")
            element.click_input()
            break
    except ElementNotFoundError:
        # 元素未找到,继续滚动查找
        continue
    except Exception as e:
        # 处理其他意外异常
        print(f"Unexpected error occurred: {str(e)}")
        break

修改说明

  • 调整查找时机:将元素查找逻辑移到滚动之后,确保每次滚动后重新查询当前界面的元素状态
  • 精准捕获异常:仅捕获ElementNotFoundError,这种情况属于正常的"未找到元素",直接继续循环即可;其他异常则按需处理并终止循环
  • 添加界面等待:滚动后增加短暂延迟,给应用足够时间更新界面元素,避免因界面未刷新导致的查找失败
  • 移除无效抛出:原代码中raise e会直接终止循环,改为针对性处理后,仅在非预期异常时才终止流程

内容的提问来源于stack exchange,提问作者Fadhl Jamal Al-Muhsin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 02:12:03