Python 3.x 如何处理使用pywinauto提取MSI的Installshield安装?

Python 3.x 如何处理使用pywinauto提取MSI的Installshield安装?,python-3.x,pywinauto,Python 3.x,Pywinauto,我正在尝试自动化一个以InstallShield setup.exe开始的安装。这就启动了MS VisualC++的可重新分配的安装。这会导致Adobe Flash不是最新版本的错误。我在这里询问了如何处理这一问题: 单击Adobe对话框的OK(现在必须使用pyautogui.click())后,我看到有一个.msi正在被提取。我已完成安装,并将其放入我的Users\AppData目录下的一个新临时文件夹中 如何让pywinauto找到这个新应用程序?我试过使用 adobe = Applica

我正在尝试自动化一个以InstallShield setup.exe开始的安装。这就启动了MS VisualC++的可重新分配的安装。这会导致Adobe Flash不是最新版本的错误。我在这里询问了如何处理这一问题:

单击Adobe对话框的OK(现在必须使用pyautogui.click())后,我看到有一个.msi正在被提取。我已完成安装,并将其放入我的Users\AppData目录下的一个新临时文件夹中

如何让pywinauto找到这个新应用程序?我试过使用

adobe = Application().connect(title_re="MyInstaller",class_name="#32770", visible_only=True)
然后尝试打印_control_identifiers(),但出现以下错误:

AttributeError:既找不到GUI元素(包装器)也找不到包装器方法“打印\u控制\u标识符”(打字错误?)

我已经检查了Spy++并检查并自动找到了我能找到的类。我不能使用procid,因为它总是会改变的

关于如何连接到.msi进程以便我可以连接()到它,您有什么想法吗

编辑:
如果我知道MyProgram.msi在哪里,是否有方法将regex pywinauto指向路径?它似乎在C:\Users\me\AppData\Local\Temp{xxx}\MyProgram.msi中,因为我在那里找到了几个副本。谢谢

添加
timeout=10
或连接()参数所需的任何内容。当前默认超时为零,但应为
计时。计时。窗口查找超时
,默认为5秒

计划在下一个主要版本中自动检测生成的子进程(以及默认超时修复)


要运行未打包的.msi文件,需要在method.start()中使用标准Windows命令
msiexec
。首先从
msiexec/?

开始手动在cmd.exe中使用它,下面是我如何处理InstallShield exe提取到中的.msi(到我下载的安装文件夹中)的事实。是的,超时很重要,但是识别打开的新msi窗口也很重要。(另外,我发现wait_for_idle必须为FALSE,但不记得为什么。YMMV:))

现在要将.exe解压到.msi安装程序中,这可能需要一段时间,而且由于.exe窗口的名称可能与.msi窗口的名称相同,因此必须小心不要过早地附加到exe窗口,并且必须等待.msi窗口打开!!因此,以秒为单位添加适当的超时。此处可能还不存在对话框窗口,因此使用MSIAlogCloseClass的class_名称至关重要,尤其是当exe和msi的标题相同时。这将在.msi窗口到达时明确标识该窗口

title = "Enter Title of your App - InstallShield Wizard"
msi = pywinauto.Application(backend="uia").connect(title=title, 
class_name="MsiDialogCloseClass",timeout=120)
最后一步,在我经常忘记的一行中,必须再次使用标题来获得对话框窗口(原因我还不明白)

此时查看所有控件标识符的非常有用的方法是:

print(dlg.print_control_identifiers())
这就是几个小时的反复试验所产生的结果。要继续,现在可以单击按钮,如下所示:

dlg.Next.wait("ready",timeout=2)
dlg.Next.click()
要点击单选按钮,这是可行的(可能还有其他方法可以做到,但我永远也找不到如何通过名称来控制按钮)

然后继续

dlg.Next.click()
dlg.Install.wait("enabled",timeout=5)
dlg.Install.click()

您好,谢谢您的回复。这让我问:我已经运行了脚本,并在任务管理器中找到了msiexec/options c:\users\me\appdata\local\{random directory}\myProgams.msi。我知道在多次运行脚本后,随机目录会发生变化。我是否需要完整路径来执行.connect()?方法
.connect()
可以在没有完整路径的情况下执行
path=“msiexec.exe”
。因此,一旦InstallShield向导到达某个点,我尝试以下代码:app1=Application.connect(path='msiexec.exe')app1.OK。单击并获取此错误:TypeError:connect()缺少1个必需的位置参数:“self”,因为我没有执行.start()操作,pywinauto不应该找到要附加到的进程吗?考虑到你上次的更新?这是一个实例方法,不是静态方法!使用这一行:
Application(backend=“uia”).connect(path='msiexec.exe')
可能默认的
backend=“win32”
对于您的安装程序就足够了。因此,它可能是带有空圆括号的
Application()
。这是必须的。
dlg.Next.wait("ready",timeout=2)
dlg.Next.click()
dlg['I &accept the terms in the License Agreement'].wait('enabled').click()
dlg.Next.click()
dlg.Install.wait("enabled",timeout=5)
dlg.Install.click()