启动应用程序后,需要 30 多秒才能通过 pywinauto 访问元素

After launching app, it takes 30+ seconds before able to access elements through pywinauto

我正在使用 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 秒以上才能显示任何内容。但是如果我等一分钟再刷新,它会立即更新。

我想知道以前是否有人遇到过这种情况,可能是什么 cause/solution。

我是运行宁: Windows10,python3.8.3,pywinauto 0.6.8

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

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

经过更多调试后,我已经解决了这个问题,虽然我不清楚根本原因究竟是什么。

我正在测试的自定义应用程序启动后台应用程序作为不可见的控制台。测试表明 运行 这个后台应用程序不允许我立即连接。 运行 后台应用程序本身会导致相同的 inspect.exe 加载延迟。

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