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
解决方案
问题根源
- 元素查找时机错误:提前绑定element查找条件,此时元素可能未滚动到可见区域,导致pywinauto尝试查找时触发超时
- 异常处理不当:捕获所有异常后直接抛出,未区分"元素未找到"的正常情况,导致循环提前终止
修改后代码
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
相关产品推荐
相关产品推荐

