I am trying to pull out how to access the button to save, which is represented as an icon of a blue floppy disk.

Table window: The window and the arrow on the button that I'm trying to vytsepit AutoIt Window Info (x64) in the panel sees only three TToolBar and in it Edit and TDBNavigator .

An attempt to use a keyboard shortcut (Ctrl + s) through the code to call the save window failed. Hands using a combination of the save location window appeared.

 app = Application(backend="win32") app.start(r"C:\1\1.exe") ... dlg = app.TfmTblWTP2 dlg.set_focus() sleep(2) dlg.type_keys("^s", set_foreground=False) dlg.TBitBtn0.click() # данная строка работает и закрывает это окно по клавише ОК 

dlg.print_control_identifiers() on this window gives the following.

 Control Identifiers: TfmTblWTP2 - 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"' (L-8, T-8, R1928, B1048) ['Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TfmTblWTP2', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"', 'TfmTblWTP2'] child_window(title="Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"", class_name="TfmTblWTP2") | | Static - '' (L0, T1001, R1920, B1040) | ['Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"Static', 'Static', 'Static0', 'Static1'] | child_window(class_name="TPanel") | | | | TBitBtn - '&OK' (L1835, T1009, R1910, B1034) | | ['&OKTBitBtn', 'TBitBtn', '&OK'] | | child_window(title="&OK", class_name="TBitBtn") | | TBitBtn - '&OK' (L1835, T1009, R1910, B1034) | ['&OKTBitBtn', 'TBitBtn', '&OK'] | child_window(title="&OK", class_name="TBitBtn") | | Static - '' (L0, T48, R1920, B1001) | ['', 'Static2', '0', '1'] | child_window(class_name="TPanel") | | | | TcxGrid - '' (L1, T49, R1919, B1000) | | ['2', 'TcxGrid'] | | child_window(class_name="TcxGrid") | | | | | | TcxGridSite - '' (L3, T51, R1917, B998) | | | ['3', 'TcxGridSite'] | | | child_window(class_name="TcxGridSite") | | | | | | | | TcxSizeGrip - '' (L795, T403, R812, B420) | | | | ['4', 'TcxSizeGrip'] | | | | child_window(class_name="TcxSizeGrip") | | | | | | | | TcxControlScrollBar - '' (L1900, T51, R1917, B998) | | | | ['TcxControlScrollBar', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar', 'TcxControlScrollBar0', 'TcxControlScrollBar1', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar0', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar1'] | | | | child_window(class_name="TcxControlScrollBar") | | | | | | | | TcxControlScrollBar - '' (L3, T403, R795, B420) | | | | ['TcxControlScrollBar2', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar2'] | | | | child_window(class_name="TcxControlScrollBar") | | | | | | TcxSizeGrip - '' (L795, T403, R812, B420) | | | ['4', 'TcxSizeGrip'] | | | child_window(class_name="TcxSizeGrip") | | | | | | TcxControlScrollBar - '' (L1900, T51, R1917, B998) | | | ['TcxControlScrollBar', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar', 'TcxControlScrollBar0', 'TcxControlScrollBar1', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar0', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar1'] | | | child_window(class_name="TcxControlScrollBar") | | | | | | TcxControlScrollBar - '' (L3, T403, R795, B420) | | | ['TcxControlScrollBar2', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar2'] | | | child_window(class_name="TcxControlScrollBar") | | | | TcxGridSite - '' (L3, T51, R1917, B998) | | ['3', 'TcxGridSite'] | | child_window(class_name="TcxGridSite") | | | | | | TcxSizeGrip - '' (L795, T403, R812, B420) | | | ['4', 'TcxSizeGrip'] | | | child_window(class_name="TcxSizeGrip") | | | | | | TcxControlScrollBar - '' (L1900, T51, R1917, B998) | | | ['TcxControlScrollBar', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar', 'TcxControlScrollBar0', 'TcxControlScrollBar1', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar0', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar1'] | | | child_window(class_name="TcxControlScrollBar") | | | | | | TcxControlScrollBar - '' (L3, T403, R795, B420) | | | ['TcxControlScrollBar2', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar2'] | | | child_window(class_name="TcxControlScrollBar") | | | | TcxSizeGrip - '' (L795, T403, R812, B420) | | ['4', 'TcxSizeGrip'] | | child_window(class_name="TcxSizeGrip") | | | | TcxControlScrollBar - '' (L1900, T51, R1917, B998) | | ['TcxControlScrollBar', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar', 'TcxControlScrollBar0', 'TcxControlScrollBar1', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar0', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar1'] | | child_window(class_name="TcxControlScrollBar") | | | | TcxControlScrollBar - '' (L3, T403, R795, B420) | | ['TcxControlScrollBar2', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar2'] | | child_window(class_name="TcxControlScrollBar") | | TcxGrid - '' (L1, T49, R1919, B1000) | ['2', 'TcxGrid'] | child_window(class_name="TcxGrid") | | | | TcxGridSite - '' (L3, T51, R1917, B998) | | ['3', 'TcxGridSite'] | | child_window(class_name="TcxGridSite") | | | | | | TcxSizeGrip - '' (L795, T403, R812, B420) | | | ['4', 'TcxSizeGrip'] | | | child_window(class_name="TcxSizeGrip") | | | | | | TcxControlScrollBar - '' (L1900, T51, R1917, B998) | | | ['TcxControlScrollBar', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar', 'TcxControlScrollBar0', 'TcxControlScrollBar1', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar0', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar1'] | | | child_window(class_name="TcxControlScrollBar") | | | | | | TcxControlScrollBar - '' (L3, T403, R795, B420) | | | ['TcxControlScrollBar2', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar2'] | | | child_window(class_name="TcxControlScrollBar") | | | | TcxSizeGrip - '' (L795, T403, R812, B420) | | ['4', 'TcxSizeGrip'] | | child_window(class_name="TcxSizeGrip") | | | | TcxControlScrollBar - '' (L1900, T51, R1917, B998) | | ['TcxControlScrollBar', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar', 'TcxControlScrollBar0', 'TcxControlScrollBar1', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar0', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar1'] | | child_window(class_name="TcxControlScrollBar") | | | | TcxControlScrollBar - '' (L3, T403, R795, B420) | | ['TcxControlScrollBar2', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar2'] | | child_window(class_name="TcxControlScrollBar") | | TcxGridSite - '' (L3, T51, R1917, B998) | ['3', 'TcxGridSite'] | child_window(class_name="TcxGridSite") | | | | TcxSizeGrip - '' (L795, T403, R812, B420) | | ['4', 'TcxSizeGrip'] | | child_window(class_name="TcxSizeGrip") | | | | TcxControlScrollBar - '' (L1900, T51, R1917, B998) | | ['TcxControlScrollBar', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar', 'TcxControlScrollBar0', 'TcxControlScrollBar1', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar0', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar1'] | | child_window(class_name="TcxControlScrollBar") | | | | TcxControlScrollBar - '' (L3, T403, R795, B420) | | ['TcxControlScrollBar2', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar2'] | | child_window(class_name="TcxControlScrollBar") | | TcxSizeGrip - '' (L795, T403, R812, B420) | ['4', 'TcxSizeGrip'] | child_window(class_name="TcxSizeGrip") | | TcxControlScrollBar - '' (L1900, T51, R1917, B998) | ['TcxControlScrollBar', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar', 'TcxControlScrollBar0', 'TcxControlScrollBar1', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar0', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar1'] | child_window(class_name="TcxControlScrollBar") | | TcxControlScrollBar - '' (L3, T403, R795, B420) | ['TcxControlScrollBar2', 'Табель для руководителей подразделений - 22.11.2018 - 22.11.2018___"TcxControlScrollBar2'] | child_window(class_name="TcxControlScrollBar") | | Static - '' (L0, T23, R1920, B48) | ['5', 'Static3'] | child_window(class_name="TPanel") | | | | TToolBar - 'ToolBar' (L1, T24, R1919, B53) | | ['ToolBar', 'TToolBar', 'ToolBarTToolBar'] | | child_window(title="ToolBar", class_name="TToolBar") | | | | | | Edit - '' (L247, T24, R403, B46) | | | ['6', 'Edit'] | | | child_window(class_name="TEdit") | | | | | | TDBNavigator - '' (L1, T24, R113, B46) | | | ['7', 'TDBNavigator'] | | | child_window(class_name="TDBNavigator") | | | | Edit - '' (L247, T24, R403, B46) | | ['6', 'Edit'] | | child_window(class_name="TEdit") | | | | TDBNavigator - '' (L1, T24, R113, B46) | | ['7', 'TDBNavigator'] | | child_window(class_name="TDBNavigator") | | TToolBar - 'ToolBar' (L1, T24, R1919, B53) | ['ToolBar', 'TToolBar', 'ToolBarTToolBar'] | child_window(title="ToolBar", class_name="TToolBar") | | | | Edit - '' (L247, T24, R403, B46) | | ['6', 'Edit'] | | child_window(class_name="TEdit") | | | | TDBNavigator - '' (L1, T24, R113, B46) | | ['7', 'TDBNavigator'] | | child_window(class_name="TDBNavigator") | | Edit - '' (L247, T24, R403, B46) | ['6', 'Edit'] | child_window(class_name="TEdit") | | TDBNavigator - '' (L1, T24, R113, B46) | ['7', 'TDBNavigator'] | child_window(class_name="TDBNavigator") 

`

Tell me how to access it or call a working shortcut key.

Updated. 11/23/2018

For a start it is worth looking at whether the texts of the buttons are available and the number of buttons itself is nonzero:

 > toolbar = dlg.child_window(title="ToolBar", > class_name="TToolBar").wrapper_object() print(toolbar.button_count() > print(toolbar.texts()) 

Error calling print(toolbar.button_count())

 AttributeError: 'HwndWrapper' object has no attribute 'button_count' 

Reply from print(toolbar.texts()) : ['ToolBar']


If no buttons are visible at all, it may be worth switching to backend="uia" . Here it is worth looking at Inspect.exe, which is visible there.

With backend="uia" , the dlg.TComboBox1.select("<Все>") command does not work dlg.TComboBox1.select("<Все>")

 app = Application(backend="uia") app.start(r"C:\1\1.exe") # Запуск основной программы dlg = app.window(title='Вход в систему') # Появляется окно авторизации dlg.Edit1.set_edit_text("User") dlg.Edit2.set_edit_text("GopTop") dlg.OK.click() dlg = app.window(title='1 - Учет рабочего времени')# Окно авторизации закрылось, открылось другое окно. Окно для ввода условий, что бы вывелась таблица. dlg.TComboBox1.set_focus() dlg.TComboBox1.select("<Все>") 

Gives an error IndexError: item not found , when using backend="win32" without problems.


Inspect's response when you hover over the save button:

 How found: Mouse move (137,37) hwnd=0x0000000000D90982 32bit class="TToolBar" style=0x5600884E ex=0x10000 ChildId: 3 Interfaces: IEnumVARIANT IOleWindow IAccIdentity Impl: Local oleacc proxy AnnotationID: 010000808209D900FCFFFFFF03000000 Name: [null] Value: [null] Role: кнопка (0x2B) State: отслеженное (0x80) Location: {l:121, t:24, w:23, h:22} Description: [null] Kbshortcut: [null] DefAction: "Нажать" Help: [null] HelpTopic: "" ChildCount: 0 Window: 0xD90982 FirstChild: [null] LastChild: [null] Next: none : кнопка : обычный Previous: none : разделитель : обычный Left: none : разделитель : обычный Up: [null] Right: none : кнопка : обычный Down: [null] IsControlElement: true IsContentElement: true Other Props: Object has no additional properties Children: Container has no children Ancestors: "ToolBar" : панель инструментов : фокусируемое "ToolBar" : окно : фокусируемое none : клиент : фокусируемое none : окно : фокусируемое "Табель для руководителей подразделений - 23.11.2018 - 23.11.2018 __" : клиент : фокусируемое "Табель для руководителей подразделений - 23.11.2018 - 23.11.2018 __" : окно : изменяемого размера,перемеща "Рабочий стол 1" : клиент : фокусируемое "Рабочий стол 1" : окно : фокусируемое [ No Parent ] 

The problem is solved, thanks to the answer below.

Final decision thanks to the answer:

 # Распознавание тулбара не сработало, скажем ему явно обернуться тулбаром from pywinauto.controls.common_controls import ToolbarWrapper toolbar = ToolbarWrapper(dlg.child_window(title="ToolBar", class_name="TToolBar").wrapper_object().handle) print(toolbar.button_count() # получили ответ 6 toolbar.button(2).click() # при обращении к id = 2 произошёл нужное нам обращение. 

    1 answer 1

    For a start it is worth looking at whether the texts of the buttons are available and the number of buttons itself is nonzero:

     # Распознавание тулбара не сработало, скажем ему явно обернуться тулбаром from pywinauto.controls.common_controls import ToolbarWrapper toolbar = ToolbarWrapper(dlg.child_window(title="ToolBar", class_name="TToolBar").wrapper_object().handle) print(toolbar.button_count() print(toolbar.texts()) 

    If there are texts:

     toolbar.button("Save button text").click() # or .click_input() 

    If there are no texts:

     toolbar.button(index).click() # or .click_input() 

    If no buttons are visible at all, it may be worth switching to backend="uia" . Here it is worth looking at Inspect.exe, which is visible there.

    You can even search for buttons on the tooltip:

     toolbar.tip_texts() toolbar.button("Save button text", by_tooltip=True).click() 

    But it will work longer, because you need to move the mouse to each button and see the tooltip. :)

    • Thanks for inspect. That's what he gave, the answer from inspect, when you hover the button, added to the main message. - Rim13
    • On ChildId, how can I refer to the element? [class = "TToolBar" style = 0x5600884E ex = 0x10000 | ChildId: 3] - Rim13
    • In Inspection, you should switch to UI Automation mode, and your MSAA is worth it. And the automatic display of the hierarchy is also convenient. - Vasily Ryabov
    • You need to look at whether the button supports InvokePattern And what is the Name property. More AutomationId can eat. Well, traditionally dlg.dump_tree() (this is the alias dlg.print_control_identifiers() ). - Vasily Ryabov
    • To learn the general concept: habr.com/company/yandex/blog/336476 - Vasily Ryabov 4:26