【问题标题】:After launching app, it takes 30+ seconds before able to access elements through pywinauto启动应用程序后,需要 30 多秒才能通过 pywinauto 访问元素
【发布时间】:2021-11-06 05:39:23
【问题描述】:

我正在使用 pywinauto 测试自定义 WPF 应用程序。

当连接 win32 时,我没有任何依赖,所以我连接到 uia

启动应用程序后,我可以立即与 pywinauto 连接,但需要 30 秒以上才能访问任何元素。在初始延迟之后,交互和搜索控件很快。

我调用 windows() 是为了等待应用程序允许我与之交互。

main_app = Application(backend="uia").connect(path=APP_PATH)
main_app.windows()

经调查,挂起似乎发生在:“application.py”>“windows”>“findwindows.find_elements(...)”>“element.children(...)”。

如果我打开应用程序,等待 1 分钟,然后运行脚本,那么它几乎立即发生。并且可以快速找到后续控件。

在使用inspect.exe 查看层次结构时,我似乎看到了同样的行为。如果我在打开应用程序后立即刷新,则需要 30 秒以上才能显示任何内容。但是如果我在刷新前等待一分钟,它会立即更新。

我想知道其他人以前是否经历过这种情况,可能是什么原因/解决方案。

我正在跑步: Windows 10,python 3.8.3,pywinauto 0.6.8

【问题讨论】:

  • 您可以使用:app.window(title='xyz').wait('ready', timeout=40) 等待应用程序加载并准备好(或超时)
  • 感谢 Vidya,但我不想等待。我应该能够立即与 UI 进行交互,并且我正试图找出应用程序出了什么问题,导致它无法更早地准备好。
  • 看起来需要一些 Windows KB 更新来修复 MS UI 自动化 API 中的问题。我不记得确切的更新链接。此处讨论了有关“uia”性能的一般技巧:github.com/pywinauto/pywinauto/issues/256(将来需要将所有配方收集到一个文档中)。
  • 感谢@VasilyRyabov 提供该链接,我之前曾看到过该问题,但假设它会在我正在运行的较新版本的 Windows 中得到解决。我尝试安装那个特定的 KB,但得到错误,它是“不适用这个图像”。我调查得越多,这似乎是我正在运行的特定子进程的问题,它使系统感到困惑。似乎不一定与 pywinauto 相关。

标签: ui-automation pywinauto


【解决方案1】:

有时将应用程序设置为防火墙例外可以帮助他们更快地启动/打开。 在 Windows 10 上为应用程序授予防火墙例外:

  1. 转到控制面板。
  2. 单击 Windows 防火墙或 Windows Defender 防火墙选项。
  3. 选择“允许应用或功能通过 Windows 防火墙”选项(在左侧)。
  4. 在列表中选择您的应用程序或单击添加另一个应用程序以找到它并将其添加到列表中。

【讨论】:

  • 感谢 Vidya,应用程序本身启动速度很快。我可以手动与之交互,但是一旦加载,它仍然需要大约 30 秒才能通过 pywinauto 调用任何函数开始生效。
【解决方案2】:

在调试了一些之后,我已经解决了这个问题,虽然我不清楚根本原因到底是什么。

我正在测试的自定义应用程序将后台应用程序作为不可见的控制台启动。测试表明,不运行此后台应用程序可以让我立即连接。单独运行后台应用程序会导致 inspect.exe 加载时出现同样的延迟。

该应用程序是一个 dotnet 框架应用程序,理论上它只是一个控制台应用程序,但具有支持 WPF 接口的代码(未显示)。通过删除项目的 WPF 方面,我能够将应用程序构建为纯粹的控制台应用程序,并且我不再遇到早期的延迟。

【讨论】:

    猜你喜欢
    • 2014-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多