使用Pywinauto自动化ABBYY时触发ElementNotFoundError报错求助
解决pywinauto连接ABBYY FineReader时的ElementNotFoundError问题
问题重现
尝试用pywinauto操控ABBYY FineReader 15,代码如下:
from pywinauto.application import Application Application(backend = 'uia').start(r'C:\Program Files (x86)\ABBYY FineReader 15\FineReaderOCR.exe', timeout = 5) app = Application(backend = 'uia').connect(title = 'Untitled Project - ABBYY FineReader PDF 15 OCR Editor')
执行最后一行时触发ElementNotFoundError:
Traceback (most recent call last): File "C:\Users\ariel\AppData\Local\Temp\ipykernel_6460\814936370.py", line 1, in <module> app = Application(backend = 'uia').connect(title = 'Untitled Project - ABBYY FineReader PDF 15 OCR Editor') File "C:\Users\ariel\anaconda3\envs\pdf_parser_env\lib\site-packages\pywinauto\application.py", line 997, in connect self.process = findwindows.find_element(**kwargs).process_id File "C:\Users\ariel\anaconda3\envs\pdf_parser_env\lib\site-packages\pywinauto\findwindows.py", line 87, in find_element raise ElementNotFoundError(kwargs) ElementNotFoundError: {'title': 'Untitled Project - ABBYY FineReader PDF 15 OCR Editor', 'backend': 'uia', 'visible_only': False}
但用同样逻辑连接记事本无异常:
note = Application(backend = 'uia').start(r'notepad.exe').connect(title= 'Untitled - Notepad', timeout = 2)
可能原因及解决方案
1. 窗口标题不匹配
ABBYY启动后的实际窗口标题可能和你写的不一致(比如语言本地化、额外后缀、空格差异)。可以先列出所有当前窗口验证:
from pywinauto import findwindows # 打印所有可见/不可见窗口的标题和进程ID for elem in findwindows.find_elements(): print(f"标题: {elem.title}, 进程ID: {elem.process_id}")
找到ABBYY对应的窗口标题后,替换代码中的title参数。
2. 窗口加载延迟
ABBYY作为大型OCR软件,启动后加载窗口的时间可能超过start的timeout,导致连接时窗口还未完全初始化。可以:
- 延长
connect的timeout参数:app = Application(backend='uia').connect(title='正确的窗口标题', timeout=15) - 直接复用
start返回的Application对象,无需重新connect:app = Application(backend='uia').start(r'C:\Program Files (x86)\ABBYY FineReader 15\FineReaderOCR.exe', timeout=15) # 直接使用app操作窗口,比如等待窗口出现 app.window(title='正确的窗口标题').wait_for_exists(timeout=10)
3. UI Backend兼容性问题
ABBYY可能使用了非标准UI框架,导致UIA backend无法识别窗口。尝试切换到win32 backend:
app = Application(backend='win32').connect(title='正确的窗口标题')
4. 权限问题
如果ABBYY以管理员权限运行,而你的Python脚本没有管理员权限,pywinauto可能无法识别到窗口。尝试右键以管理员身份运行脚本。
5. 通过进程ID连接
如果标题匹配始终有问题,可以通过进程ID直接连接,避免标题依赖:
# 启动后直接获取进程ID app = Application(backend='uia').start(r'C:\Program Files (x86)\ABBYY FineReader 15\FineReaderOCR.exe', timeout=15) pid = app.process # 或者单独获取进程ID后连接 app = Application(backend='uia').connect(process=pid)
内容的提问来源于stack exchange,提问作者ihatecomputers
相关产品推荐
相关产品推荐

