问答 pywinauto 获取不到窗口下多层分级的元素

enumerate · 2024年04月07日 · 最后由 徐嘉泽 回复于 2024年04月19日 · 4049 次阅读

如题最近想做 windows 的自动化选择的工具是 pywinauto+inspect,但是当我碰到一个窗口下还有多个窗口的情况发现无论如何也获取不到相应的信息,在 inspect 下是可以看到这个元素的 class_name 等元素值,但是当我想选择这个元素做点击,获取属性等操作时缺提示我找不到这个元素,然后用 print_control_identifiers() 函数打印时,发现打印出来的数据,确实没有这个元素,当遇到这种情况时,要怎么操作呢?
图 1 为 inspect 查看元素

当我获取控制面板这个窗口后,如果直接用 click 方法点击会提示我没有这个元素找不到,所以我用 print_control_identifiers() 打印出来数据,确实没有发现图 1 里的 class_name
图 2

打印出来的数据,其实到图 2 里的那个层级,下面的都没有打印出来
图 3

有没有用过 pywinauto 的朋友帮忙指点一下,网上大多都是说用 child_window 这个函数可以垮层级获取窗口,但是我需要的窗口写上 class_name 都提示我找不到
示例代码
from pywinauto.application import Application
app = Application(backend = "uia").start("control.exe") # 开启程序
app = Application().connect(title_re="控制面板", class_name="CabinetWClass",timeout=10) # 连接程序
ret = app.window(class_name='CabinetWClass')# 返回窗口
ret = ret.child_window(class_name='DUIViewWndClassName')
ret.print_control_identifiers()
从这里就开始打印数据,如果在往下用获取 DUIViewWndClassName 下面的窗口,就会报错说找不到元素了,但 inspect 上确实显示这些元素了

共收到 5 条回复 时间 点赞

大家都没人用这个吗

试过,只是实现了安装 python 环境,感觉太费劲,维护起来太麻烦
试试 airtest 吧,或者 pyautogui 直接模拟鼠标键盘 + 截图 +OCR,感觉都挺麻烦、不稳定的

yeyu 回复

airtest 和 pyautogui 都试过了,虽然截图方便点,但是验证的时候如果以图片验证会不准确,所以想用 pywinauto 借助 ui 的 path 形式想着数值准确点,但是在多个层级这获取不到数据,卡在这了,惨

你需要的是 invoke()

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册