【问题标题】:Not able to automate button click on "Oracle VM virtual box" using pywinauto in python无法在 python 中使用 pywinauto 自动单击“Oracle VM 虚拟框”按钮
【发布时间】:2019-02-25 13:08:01
【问题描述】:

我正在研究“Oracle VM Virtual box”中加载图像文件的自动化,以在 python 中使用 Pywinauto 创建虚拟机。我能够自动安装 Virtual Box 软件,然后能够启动图片中显示的 exe

但在那之后,我无法使用 Pywinauto 自动在“Oracle VM VirtualBox Manager”上执行任何 GUI 操作(例如选择文件菜单或单击新建按钮)。我附上了 Oracle VM Virtual box 的 Inspect tool 的快照

下面是我要运行的代码

>>> from pywinauto import application
>>> app=application.Application()

>>> app.start(r"C:\Program Files\Oracle\VirtualBox\VirtualBox.exe")
<pywinauto.application.Application object at 0x000001D671679BA8>

>>>app['Oracle VM VirtualBox Manager']['New']
<pywinauto.application.WindowSpecification object at 0x000001D670FB9CC0>

>>> app['Oracle VM VirtualBox Manager']['New'].click()

执行上面显示的点击命令后出现错误

错误:

Traceback (most recent call last):
  File "C:\Program Files\Python37\lib\site-packages\pywinauto\application.py", line 246, in __resolve_control
    criteria)
  File "C:\Program Files\Python37\lib\site-packages\pywinauto\timings.py", line 453, in wait_until_passes
    raise err
pywinauto.timings.TimeoutError

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    app['Oracle VM VirtualBox Manager']['New'].click()
  File "C:\Program Files\Python37\lib\site-packages\pywinauto\application.py", line 352, in __getattribute__
    ctrls = self.__resolve_control(self.criteria)
  File "C:\Program Files\Python37\lib\site-packages\pywinauto\application.py", line 249, in __resolve_control
    raise e.original_exception
  File "C:\Program Files\Python37\lib\site-packages\pywinauto\timings.py", line 431, in wait_until_passes
    func_val = func(*args, **kwargs)
  File "C:\Program Files\Python37\lib\site-packages\pywinauto\application.py", line 210, in __get_ctrl
    ctrl = self.backend.generic_wrapper_class(findwindows.find_element(**ctrl_criteria))
  File "C:\Program Files\Python37\lib\site-packages\pywinauto\findwindows.py", line 87, in find_element
    raise ElementNotFoundError(kwargs)
pywinauto.findwindows.ElementNotFoundError: {'best_match': 'New', 'top_level_only': False, 'parent': <win32_element_info.HwndElementInfo - 'Oracle VM VirtualBox Manager', Qt5QWindowIcon, 68992>, 'backend': 'win32'}

在 Inspect 工具中,它显示 Oracle VM VirtualBox Manager 窗口“Is Keyboard focusable”为假,并且这些控件没有自动化 ID。

请建议我在此 GUI 上执行按钮单击自动化的命令。我是 python 新手,无法理解下一步该怎么做。

【问题讨论】:

  • 请格式化问题,以便您的代码易于阅读
  • 嗨 Gourav,我是 SO 新手,不知道如何格式化问题。我尽力表示代码可读

标签: python automation virtual-machine pywinauto


【解决方案1】:

如果您使用Inspect.exe,则必须使用Application(backend="uia") 作为入口点。这在Getting Started Guide 中有描述。

默认后端是“win32”,所以如果Spy++能看到这个按钮就可以使用(我想答案是“否”)。

【讨论】:

  • 感谢@Vasily Ryabov 的宝贵指导。使用 Application(backend="uia") 后,我可以单击按钮,但仍然无法访问 菜单项。例如help-> aboutvirtualbox 我使用下面的命令来访问菜单项 app.OracleVMVirtualBoxManager.MenuSelect("help->aboutvirtualbox") 如果我没有使用正确的命令,请提出建议
  • 首先CamelCase 方法名称不用于“uia”后端,而是使用menu_select。此外,由于非标准结构,此方法未涵盖某些菜单。如果是 Qt5 应用,可以使用examples/wireshark.py, Line 58+ 指导。
  • 感谢@Vasily Ryabov。我在您的其他帖子中读到未使用 CamelCase,因此我总是尽量避免使用 CamelCase 方法名称,但在我的第一个记事本 python 程序中 menu_select 无法正常工作,所以我正在使用 MenuSelect 方法我将使用您给定的解决方案并尝试完全自动化我的任务并会回来
  • MenuSelect 是“win32”后端中menu_select 的直接别名:代码中的MenuSelect = menu_select。 “uia”后端也不存在MenuSelect。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 2019-01-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多