Jalo
Jalo

Reputation: 1

Pywinauto menu_select AttributeError

I want to automate Windows application using pywinauto and I got stuck with selecting Menu bar option. I receive AttributeError when I use menu_select function.

Python 3.11.5 pywinauto 0.6.8

GUI

Code:

from pywinauto.application import Application

app = Application(backend="uia")
app.start(app_path)
dlg = app.window()
dlg.wait("visible")
dlg.print_control_identifiers()
dlg.menu_select("File->Exit")

Output:

Control Identifiers:

Dialog - 'x'    (L234, T234, R1242, B989)
['xDialog', 'x', 'Dialog']
child_window(title="x", auto_id="MainForm", control_type="Window")
   | GroupBox - 'Dock Top'    (L242, T265, R1234, B289)
   | ['Dock Top', 'GroupBox', 'Dock TopGroupBox']
   | child_window(title="Dock Top", auto_id="3342822", control_type="Group")
   |    | 
   |    | Menu - 'Main Menu'    (L242, T265, R1234, B287)
   |    | ['Main Menu', 'Menu', 'Main MenuMenu', 'Menu0', 'Menu1']
   |    | child_window(title="Main Menu", auto_id="590138", control_type="MenuBar")
   |    |    | 
   |    |    | MenuItem - 'File'    (L250, T266, R283, B286)
   |    |    | ['File', 'MenuItem', 'FileMenuItem', 'MenuItem0', 'MenuItem1']
   |    |    | child_window(title="File", control_type="MenuItem")
   |    |    |    | 
   |    |    |    | Button - 'Hardcopy'    (L0, T0, R0, B0)
   |    |    |    | ['Hardcopy', 'Button', 'HardcopyButton', 'Button0', 'Button1']
   |    |    |    | child_window(title="Hardcopy", control_type="Button")
   |    |    |    | 
   |    |    |    | Button - 'Exit'    (L0, T0, R0, B0)
   |    |    |    | ['Exit', 'Button2', 'ExitButton']
   |    |    |    | child_window(title="Exit", control_type="Button")
   |    |    | 
[...]

Traceback (most recent call last):
  File "C:\Users\jalo\Desktop\auto.py", line 27, in <module>
    dlg.menu_select("File->Exit")
  File "C:\Users\jalo\AppData\Local\Programs\Python\Python311\Lib\site-packages\pywinauto\controls\uiawrapper.py", line 721, in menu_select
    raise AttributeError
AttributeError

I tried also workaround

dlg.File.select() # or .click_input()
dlg.Exit.click()

and select expands File options list but click failed due to

Traceback (most recent call last):
  File "C:\Users\jalo\Desktop\auto.py", line 32, in <module>
    dlg.Exit.click()
  File "C:\Users\jalo\AppData\Local\Programs\Python\Python311\Lib\site-packages\pywinauto\application.py", line 379, in __getattribute__
    ctrls = self.__resolve_control(self.criteria)
  File "C:\Users\jalo\AppData\Local\Programs\Python\Python311\Lib\site-packages\pywinauto\application.py", line 250, in __resolve_control
    ctrl = wait_until_passes(
  File "C:\Users\jalo\AppData\Local\Programs\Python\Python311\Lib\site-packages\pywinauto\timings.py", line 436, in wait_until_passes
    func_val = func(*args, **kwargs)
  File "C:\Users\jalo\AppData\Local\Programs\Python\Python311\Lib\site-packages\pywinauto\application.py", line 203, in __get_ctrl
    dialog = self.backend.generic_wrapper_class(findwindows.find_element(**criteria[0]))
  File "C:\Users\jalo\AppData\Local\Programs\Python\Python311\Lib\site-packages\pywinauto\findwindows.py", line 98, in find_element
    raise exception
pywinauto.findwindows.ElementAmbiguousError: There are 2 elements that match the criteria {'backend': 'uia', 'process': 4988}

Upvotes: 0

Views: 344

Answers (2)

Lakhan
Lakhan

Reputation: 1

Try this, as you have 2 dialogs `

dlg = app.window()
dlg.wait("ready")
dlg.File.select()
dlg1 = app.window()
dlg1.Exit.select()

`

Upvotes: 0

Mika H&#228;nninen
Mika H&#228;nninen

Reputation: 41

Have you tried to select from the main menu level ?

dlg.menu_select("Main Menu->File->Exit")

Upvotes: 0

Related Questions