如何处理使用pywinauto提取MSI的Installshield安装



我正在尝试自动化一个从InstallShield setup.exe开始的安装。这将启动MS Visual C++可再发行文件的安装。这导致了一个关于Adobe Flash不是最新的错误。我在这里询问了如何处理这个问题:

使用pywinauto 自动安装软件时出错

一旦我在Adobe对话框中单击"确定"(现在必须使用pyautogui.click(((,我就会看到有一个.msi正在被提取。我已经完成了安装,它将它放在我的Users\AppData目录下的一个新的Temp文件夹中。

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

adobe = Application().connect(title_re="MyInstaller",class_name="#32770", visible_only=True)

然后尝试打印_control_identifiers((,但出现以下错误:

AttributeError:找不到GUI元素(包装器(和包装器方法"print_control_identifiers"(打字错误?(

我已经检查了Spy++和Inspect以及AutoIT,以找到我能找到的类。我不能用procid,因为它总是会变的。

关于如何连接到.msi进程以便连接((,有什么想法吗?

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

添加timeout=10或任何需要连接((参数的内容。当前默认超时为零,但应为timings.Timings.window_find_timeout,默认情况下为5秒。

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

要运行未打包的.msi文件,您需要在方法.start((中使用msiexec标准Windows命令。首先从msiexec /?开始,在cmd.exe中手动播放。

以下是我如何处理InstallShield exe提取到中的.msi(到我的DownloadedInstallations文件夹中(的事实。是的,超时很重要,但识别打开的新msi窗口也很重要。(此外,我发现wait_for_idle必须为FALSE,但不记得为什么。YMMV:((。

exe = pywinauto.Application(backend="uia").start(exepath, wait_for_idle=False)

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

title = "Enter Title of your App - InstallShield Wizard"
msi = pywinauto.Application(backend="uia").connect(title=title, 
class_name="MsiDialogCloseClass",timeout=120)

最后一点,在我总是忘记的一行中,必须再次使用标题才能获得对话框窗口(由于我还不理解的原因(

dlg = msi[title]

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

print(dlg.print_control_identifiers())

这就是数小时的反复试验所产生的结果。要继续,现在您可以单击按钮,如下所示:

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()

最新更新