pywinauto 脚本在执行文件和交互模式时的​​工作方式不同

pywinauto scripts work differently in execution of file vs interactive mode

我正在尝试为 Windows 应用程序制作脚本。但是脚本在执行文件 (python test.py) 与 Python 交互模式时的​​工作方式不同。

这是代码。

import pywinauto

app = pywinauto.application.Application()
app.start(r"C:\customPrograms\ControlStation.exe")
    
app.window(title_re=u'Login').Wait('visible', timeout=60, retry_interval=1)

dlg = app.Login
dlg.Edit1.TypeKeys("testSuper")
dlg.PasswordEdit.TypeKeys("test")
dlg.OK.SetFocus()
dlg.OK.click()

app.window(title_re=u'Room select').Wait('visible', timeout=60, 
retry_interval=1)

roomdlg = app.Roomselect
roomdlg.Connect.click()

app = pywinauto.Application().connect(title='tmpSuper - local')
app.testSuper.MenuBar.MenuBarClickInput('#4->#1->#0', app)
app.testSuper.People.click()

当我运行这个脚本作为一个文件(python test.py)时,我得到了这个错误:

pywinauto.base_wrapper.ElementNotEnabled

当我在交互式 Python 会话中一个一个地 运行 脚本时,没有错误。它工作正常。

这两种方式有什么区别?执行自动化脚本的最佳方式是什么?

我正在使用 Python 3.6 和 pywinauto 0.6.4。

这是典型的计时问题(您无法逐步重现它,因为手动步骤执行之间存在延迟)。 roomdlg.Connect.click() 等待现有的 "Connect" 按钮,但不等待启用状态。所以报错信息是有意义的。

解决方案应该是:

roomdlg.Connect.wait("enabled") # timeout is optional param, default is 5 sec.
roomdlg.Connect.click()

即使按钮已启用,某些应用也可能会出现 OnClick() 处理程序订阅延迟等问题。在这种情况下,您可能需要 app.wait_cpu_usage_lower() 来指示应用进程 CPU 使用率低于阈值。

当前关于计时的文档在此处:https://pywinauto.readthedocs.io/en/latest/wait_long_operations.html(但需要使用全局计时设置进行扩展)。