-->

How to access the control identifiers in pywinauto

2019-06-28 07:24发布

问题:

i am trying to access the control identifiers that gets displayed but i am unable to do so. when a Open window gets popped up only the OK and Cancel button i am able to access.. not able to acccess othe options. Please help

回答1:

Once you have the dialog open and assigned to a variable then the print_control_identifiers() (also aliased as PrintControlIdentifiers) method should print all the available controls.

>>> app = Application.Start('Notepad')
>>> app.UntitledNotepad.MenuItem("Edit -> Replace").Select()
>>> app.Replace.print_control_identifiers()
Control Identifiers:
Static - 'Fi&nd what:'   (L1456, T336, R1528, B349)
        'Fi&nd what:' 'Fi&nd what:Static' 'Static' 'Static0' 'Static1'
Edit - ''   (L1531, T332, R1702, B352)
        'Edit' 'Edit0' 'Edit1' 'Fi&nd what:Edit'
Static - 'Re&place with:'   (L1456, T363, R1528, B376)
        'Re&place with:' 'Re&place with:Static' 'Static2'
Edit - ''   (L1531, T360, R1702, B380)
        'Edit2' 'Re&place with:Edit'
Button - 'Match &case'   (L1458, T422, R1547, B442)
        'CheckBox2' 'Match &case' 'Match &caseCheckBox'
Button - '&Find Next'   (L1711, T328, R1786, B351)
        '&Find Next' '&Find NextButton' 'Button' 'Button0' 'Button1'
Button - '&Replace'   (L1711, T355, R1786, B378)
        '&Replace' '&ReplaceButton' 'Button2'
Button - 'Replace &All'   (L1711, T383, R1786, B406)
        'Button3' 'Replace &All' 'Replace &AllButton'
Button - 'Cancel'   (L1711, T410, R1786, B433)
        'Button4' 'Cancel' 'CancelButton'
>>> app.Replace.PrintControlIdentifiers()
Control Identifiers:
Static - 'Fi&nd what:'   (L1456, T336, R1528, B349)
        'Fi&nd what:' 'Fi&nd what:Static' 'Static' 'Static0' 'Static1'
Edit - ''   (L1531, T332, R1702, B352)
        'Edit' 'Edit0' 'Edit1' 'Fi&nd what:Edit'
Static - 'Re&place with:'   (L1456, T363, R1528, B376)
        'Re&place with:' 'Re&place with:Static' 'Static2'
Edit - ''   (L1531, T360, R1702, B380)
        'Edit2' 'Re&place with:Edit'
Button - 'Match &case'   (L1458, T422, R1547, B442)
        'CheckBox2' 'Match &case' 'Match &caseCheckBox'
Button - '&Find Next'   (L1711, T328, R1786, B351)
        '&Find Next' '&Find NextButton' 'Button' 'Button0' 'Button1'
Button - '&Replace'   (L1711, T355, R1786, B378)
        '&Replace' '&ReplaceButton' 'Button2'
Button - 'Replace &All'   (L1711, T383, R1786, B406)
        'Button3' 'Replace &All' 'Replace &AllButton'
Button - 'Cancel'   (L1711, T410, R1786, B433)
        'Button4' 'Cancel' 'CancelButton'

The 2nd line output for each control are the different identifiers (though things like spaces and ampersands (&) should be removed.

It is quite possible that Windows Media Player does not use 'standard' Win32 dialogs. But the Open dialog should be easy enough..

Here is the output of my testing of this (with errors and mistakes removed to protect the guilty :))

>>> wmp = Application.Start(r'C:\Program Files (x86)\Windows Media Player\wmplayer.exe')
>>> wmp.WindowsMediaPlayer.TypeKeys("^O")
<pywinauto.controls.win32_controls.DialogWrapper object at 0x027CCDB0>
>>> wmp.Open.PrintControlIdentifiers()
Control Identifiers:
DUIViewWndClassName - ''   (L200, T187, R1152, B590)
        'DUIViewWndClassName' 'Files of &type:DUIViewWndClassName'
DirectUIHWND - ''   (L200, T187, R1152, B590)
        'DirectUIHWND' 'DirectUIHWND0' 'DirectUIHWND1' 'Files of &type:DirectUIHWND' 'Files of &type
:DirectUIHWND0' 'Files of &type:DirectUIHWND1'
CtrlNotifySink - ''   (L201, T217, R426, B590)
        'CtrlNotifySink' 'CtrlNotifySink0' 'CtrlNotifySink1' 'Files of &type:CtrlNotifySink' 'Files
of &type:CtrlNotifySink0' 'Files of &type:CtrlNotifySink1'
NamespaceTreeControl - 'Namespace Tree Control'   (L201, T217, R426, B590)
        'Namespace Tree Control' 'Namespace Tree Control0' 'Namespace Tree Control1' 'Namespace Tree
 ControlNamespaceTreeControl' 'NamespaceTreeControl'
SysTreeView32 - 'Tree View'   (L201, T217, R426, B590)
        'Tree View' 'Tree ViewTreeView' 'TreeView'
CtrlNotifySink - ''   (L429, T217, R1152, B590)
        'CtrlNotifySink3' 'Files of &type:CtrlNotifySink2'
SHELLDLL_DefView - 'ShellView'   (L429, T217, R1152, B590)
        'SHELLDLL_DefView' 'ShellView' 'ShellViewSHELLDLL_DefView'
DirectUIHWND - ''   (L429, T217, R1152, B590)
        'DirectUIHWND2' 'Files of &type:DirectUIHWND2'
Static - 'File &name:'   (L330, T603, R384, B618)
        'File &name:' 'File &name:Static' 'Static2'
ComboBoxEx32 - ''   (L389, T599, R935, B623)
        'ComboBoxEx' 'File &name:ComboBoxEx'
ComboBox - ''   (L389, T599, R935, B623)
        'ComboBox' 'ComboBox0' 'ComboBox1' 'File &name:ComboBox' 'File &name:ComboBox0' 'File &name:
ComboBox1'
Edit - ''   (L393, T604, R917, B619)
        'Edit' 'File &name:Edit'
Static - 'Files of &type:'   (L200, T152, R200, B152)
        'Files of &type:' 'Files of &type:Static' 'Files of &type:Static0' 'Files of &type:Static1'
'Static3'
ComboBox - 'Media files (all types)'   (L947, T599, R1135, B622)
        'ComboBox2' 'File &name:ComboBox2' 'Files of &type:ComboBox'
Button - '&Open'   (L947, T628, R1035, B654)
        '&Open' '&OpenButton' 'Button' 'Button0' 'Button1'
Button - 'Cancel'   (L1047, T628, R1135, B654)
        'Button2' 'Cancel' 'CancelButton'
ScrollBar - ''   (L1137, T651, R1152, B666)
        'CancelScrollBar' 'ScrollBar3'
WorkerW - ''   (L200, T152, R1152, B187)
        'Files of &type:WorkerW' 'WorkerW'
ReBarWindow32 - ''   (L200, T152, R1152, B187)
        'Files of &type:ReBar' 'ReBar'
TravelBand - ''   (L200, T152, R270, B184)
        'Files of &type:TravelBand' 'TravelBand'
ToolbarWindow32 - ''   (L202, T154, R270, B184)
        'Files of &type:Toolbar' 'Files of &type:Toolbar0' 'Files of &type:Toolbar1' 'Toolbar' 'Tool
bar0' 'Toolbar1'
Address Band Root - ''   (L270, T156, R944, B179)
        'Address Band Root' 'Files of &type:Address Band Root'
msctls_progress32 - ''   (L272, T157, R942, B178)
        'Files of &type:Progress' 'Progress'
Breadcrumb Parent - ''   (L272, T157, R898, B178)
        'Breadcrumb Parent' 'Files of &type:Breadcrumb Parent'
ToolbarWindow32 - 'Address: C:\\Program Files (x86)\\Windows Media Player'   (L272, T157, R898, B178
)
        'Address: C:\\Program Files (x86)\\Windows Media Player' 'Address: C:\\Program Files (x86)\\
Windows Media PlayerToolbar' 'Toolbar2'
ToolbarWindow32 - ''   (L898, T157, R942, B178)
        'Files of &type:Toolbar2' 'Toolbar3'
UniversalSearchBand - ''   (L948, T156, R1152, B179)
        'Files of &type:UniversalSearchBand' 'UniversalSearchBand'
Search Box - ''   (L948, T156, R1152, B179)
        'Files of &type:Search Box' 'Search Box'
SearchEditBoxWrapperClass - ''   (L953, T156, R1147, B179)
        'Files of &type:SearchEditBoxWrapperClass' 'SearchEditBoxWrapperClass'
DirectUIHWND - ''   (L953, T156, R1147, B179)
        'DirectUIHWND3' 'Files of &type:DirectUIHWND3'
>>>
>>> wmp.Open.FilenameEdit.TypeKeys(r"c:\your_file_name.mp3")
<pywinauto.controls.win32_controls.EditWrapper object at 0x027CCC50>
>>> wmp.Open.Open.Click()

You can see (hopefully) that the FilenameEdit came from

Edit - ''   (L393, T604, R917, B619)
        'Edit' 'File &name:Edit'


回答2:

I get access to the "File Name" in the "Select File to Export"in 3ds max 2015:

I first received information about the dialog box controls with "print_control_identifiers()":

import pywinauto
from time import sleep

 pwa_app = pywinauto.application.Application()
    # pwa_app.start('{app} {path}\{scene}'.format(app=BINARY_PATH, path=TEST_PATH, scene=TEST_SCENE))
export_dlg_handles = pywinauto.findwindows.find_windows(title=u'Select File to Export', class_name='#32770')
if export_dlg_handles:
    export_dlg = pwa_app.window_(handle=export_dlg_handles[0])
export_dlg.print_control_identifiers()

The output:

Control Identifiers:
Static - 'Save &in:'   (L172, T146, R258, B159)
        'Save &in:' 'Save &in:Static' 'Static' 'Static0' 'Static1'
ComboBox - 'export'   (L265, T142, R526, B166)
        'ComboBox' 'ComboBox0' 'ComboBox1' 'Save &in:ComboBox'
ToolbarWindow32 - ''   (L538, T142, R800, B165)
        ' Toolbar' 'Toolbar' 'Toolbar0' 'Toolbar1'
ToolbarWindow32 - ''   (L172, T171, R259, B705)
        'Save &in:Toolbar' 'Toolbar2'
SHELLDLL_DefView - ''   (L265, T171, R857, B650)
        'SHELLDLL_DefView' 'Save &in:SHELLDLL_DefView'
SysListView32 - 'FolderView'   (L265, T171, R857, B650)
        'FolderView' 'FolderViewListView' 'ListView'
SysHeader32 - ''   (L265, T171, R857, B190)
        'Header' 'Save &in:Header'
Static - 'File &name:'   (L267, T664, R354, B677)
        'File &name:' 'File &name:Static' 'Static3'
ComboBoxEx32 - ''   (L361, T659, R762, B681)
        'ComboBoxEx' 'File &name:ComboBoxEx'
ComboBox - ''   (L361, T659, R762, B681)
        'ComboBox2' 'File &name:ComboBox'
Edit - ''   (L365, T664, R742, B677)
        'Edit' 'File &name:Edit'
Static - 'Save as &type:'   (L267, T690, R354, B703)
        'Save as &type:' 'Save as &type:Static' 'Static4'
ComboBox - 'Autodesk (*.FBX)'   (L361, T687, R762, B708)
        'ComboBox3' 'Save as &type:ComboBox'
Button - '&Save'   (L782, T659, R857, B682)
        '&Save' '&SaveButton' 'Button' 'Button0' 'Button1'
Button - 'Cancel'   (L782, T685, R857, B708)
        'Button2' 'Cancel' 'CancelButton'
ScrollBar - ''   (L848, T699, R865, B716)
        'CancelScrollBar' 'ScrollBar'
#32770 - ''   (L166, T102, R865, B716)
        '#32770' 'Save &in:#32770'
Static - ' '   (L166, T135, R721, B520)
        ' ' ' Static2' 'Static5'
Static - ''   (L715, T165, R715, B188)
        ' Static3' 'Static6'
Static - 'Thumbnail'   (L906, T144, R957, B157)
        'Static7' 'Thumbnail' 'ThumbnailStatic'
ComboBox - 'C:\\Users\\stas\\Documents\\3dsMax\\export'   (L265, T109, R857, B130)
        'ComboBox4' 'History:ComboBox'
Static - 'History:'   (L219, T113, R255, B126)
        'History:' 'History:Static' 'Static8'

Then i find a strings:

Edit - ''   (L365, T664, R742, B677)
        'Edit' 'File &name:Edit'
Button - '&Save'   (L782, T659, R857, B682)
        '&Save' '&SaveButton' 'Button' 'Button0' 'Button1'

'Edit' and 'Button' - names of controls for access.

And I run:

# Endter file name
export_dlg.Edit.SetText(SAVE_FILE_NAME)
# Wait one second
sleep(1.0)
# Click to "Save" button
export_dlg.Button.Click()

For help view the docs:

https://pywinauto.googlecode.com/hg/pywinauto/docs/controls_overview.html

For example 'SetText' for all controls:

SetText(text, pos_start=None, pos_end=None)
Set the text of the edit control