pywinauto在virtualbox下的混合后端应用程序中找不到Win32元素

Posted

技术标签:

【中文标题】pywinauto在virtualbox下的混合后端应用程序中找不到Win32元素【英文标题】:pywinauto does not find Win32 elements in mixed backend applications under virtualbox 【发布时间】:2019-07-10 13:12:23 【问题描述】:

如果脚本在 virtualbox 中运行,pywinauto 找不到作为 aui 后端元素子级的 win32 后端元素

我们有一个WinForm ComboBox,它正在调用弹出一个Win32 ComboLBox,其中包含ListItems。在本地机器上使用 pywinauto 默认方法时 如果脚本在 virtualbox 中运行,pywinauto 找不到作为 aui 后端元素子级的 win32 后端元素

我们有一个WinForm ComboBox,它正在调用弹出一个Win32 ComboLBox,其中包含ListItems。在本地机器上使用 pywinauto 默认方法时

app.Dialog.ComboLBox.select('myitem')

效果很好。在 virtualbox VM(来自微软网站的 Win10 (x64) 上的 MSEdge)上使用相同的代码时,pywinauto 看不到 ComboLBox 对象下的项目。 Inspect 列出它们,.ComboLBox.texts() 返回一个字符串列表,但 .ComboLBox.children() 为空。

这种情况有什么解决方法吗?我几乎无法想象自动化工具会直接在您的桌面上大量使用,因为如今所有这些都转向虚拟机和云。

【问题讨论】:

【参考方案1】:

WinForms 组合框的子项在至少展开一次之前可能未列出。这在 Inspect.exe 中应该看起来相同。方法 .texts() 使用另一种方法,而不是获取孩子。还有一种方法 .select(“...”) 在这两种情况下都可以正常工作。如果您严格需要子列表,只需在 .children() 之前执行 .expand().collapse()。

当然,这与 VirtualBox 或任何特定于云的事物无关。你很幸运能在特定版本的 .NET Runtime 上发现这一点。

【讨论】:

您好,感谢您的回答!这当然是.Net Runtime 相关问题。我们最终有两个应用程序对象 app (aui start) 和 app32 (win32 connect) 来处理此类敏感组件(主要是菜单弹出类型的元素)。 酷。如果它已经解决了您的问题,请将答案标记为已接受(按答案左侧的灰色复选框;它适用于任何信誉量)。在 *** 上被认为是礼貌的。

以上是关于pywinauto在virtualbox下的混合后端应用程序中找不到Win32元素的主要内容,如果未能解决你的问题,请参考以下文章

python怎么判断windows下的某一个窗口是不是当前正在操作的

Pywinauto:如何调整活动窗口的大小

VirtualBox虚拟机下的CentOS7网络配置,内外网互通

如何离线安装python模块?比如Windows下UI自动测试模块pywinauto

聊聊 PC 端自动化最佳方案 - Pywinauto

Flutter混合开发模式下的代码调试