pywinauto打印Google Chrome控件标识符触发连接超时报错问题
预期行为
尝试打印Google Chrome的控件标识符时,已在命令提示符中添加--force-renderer-accessibility启动参数并重启Chrome浏览器,预期可正常识别浏览器控件。
实际行为
代码运行至窗口连接阶段无法匹配对应Chrome窗口,抛出如下异常:
Traceback (most recent call last): File "C:\Users\asdffff\AppData\Roaming\Python\Python39\site-packages\pywinauto\timings.py", line 436, in wait_until_passes func_val = func(*args, **kwargs) File "C:\Users\asdffff\AppData\Roaming\Python\Python39\site-packages\pywinauto\findwindows.py", line 87, in find_element raise ElementNotFoundError(kwargs) pywinauto.findwindows.ElementNotFoundError: {'title': 'New Tab - Google Chrome', 'backend': 'uia', 'visible_only': False} During handling of the above exception, another exception occurred: Traceback (most recent call last): File "c:\Users\asdffff\OneDrive n1ck99\OneDrive\Documents\python\pywinauto\github.Chrome2.py", line 4, in <module> app = Application(backend="uia").connect(title='New Tab - Google Chrome',timeout=5) File "C:\Users\asdffff\AppData\Roaming\Python\Python39\site-packages\pywinauto\application.py", line 990, in connect self.process = timings.wait_until_passes( File "C:\Users\asdffff\AppData\Roaming\Python\Python39\site-packages\pywinauto\timings.py", line 458, in wait_until_passes raise err pywinauto.timings.TimeoutError
复现代码
from pywinauto.application import Application app = Application(backend="uia").start(r"C:\Program Files\Google\Chrome\Application\chrome.exe") app = Application(backend="uia").connect(title='New Tab - Google Chrome',timeout=5) app.NewTabGoogleChrome.print_control_identifiers()
问题原因
- 代码中启动Chrome时未传入
--force-renderer-accessibility参数,手动加参数启动的Chrome如果残留后台驻留进程,调用start()方法时会直接复用已有的无参数Chrome进程,不会开启辅助功能渲染树,窗口属性也会和预期不符。 - Chrome启动后新标签页标题加载存在延迟,5秒超时时间过短;且不同语言版本、不同更新版本的Chrome新标签页标题不固定,硬编码精确匹配
New Tab - Google Chrome很容易匹配失败。 - 重复实例化
Application对象属于冗余操作,start()方法本身会返回绑定了对应启动进程的应用对象,不需要额外调用connect()二次绑定。
修复方案
- 启动Chrome前先清理所有残留的chrome.exe进程,避免启动参数不生效。
- 启动Chrome时直接在程序路径后拼接
--force-renderer-accessibility参数,确保辅助功能树正常加载。 - 用正则模糊匹配Chrome窗口标题,延长超时等待时间,适配不同版本、不同语言环境的Chrome。
修正后可运行代码:
from pywinauto.application import Application import psutil # 清理所有残留Chrome进程 for proc in psutil.process_iter(['name']): if proc.info['name'] == 'chrome.exe': proc.kill() # 启动时直接传入强制开启辅助功能参数 app = Application(backend="uia").start( r"C:\Program Files\Google\Chrome\Application\chrome.exe --force-renderer-accessibility --no-first-run --disable-default-apps" ) # 模糊匹配Chrome主窗口,等待加载完成 main_window = app.window(title_re=".*Google Chrome", visible_only=True) main_window.wait("ready", timeout=15) # 打印控件标识符 main_window.print_control_identifiers()
补充说明
- 如果运行后依然提示找不到窗口,可以先执行
print([w.title for w in pywinauto.findwindows.find_elements()])打印当前系统所有窗口的标题,确认实际的Chrome窗口标题后调整匹配规则即可。 - 不要在启动Chrome后立刻执行窗口匹配,必须等窗口完全加载到ready状态再做后续操作。
- 若未安装psutil依赖,可执行
pip install psutil安装,也可以手动在任务管理器结束所有chrome.exe进程后跳过进程清理步骤运行代码。
内容的提问来源于stack exchange,提问作者nick asdf
相关产品推荐
相关产品推荐

