[PYTHON] Remarques sur l'utilisation de pywinauto

Remarques sur l'utilisation de pywinauto

Vérifiez le fonctionnement avec le Bloc-notes

Lancez l'application (Bloc-notes)

c:\ python
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> 
>>> from pywinauto import Desktop, Application
>>>
>>> #Lancer le bloc-notes
>>> app = Application().start('notepad.exe')

Afficher les informations de version

Sélectionnez «Informations sur la version» dans «Aide» dans le menu pour afficher l'écran d'informations sur la version.

>>> #Aidez-moi->Afficher les informations de version
>>> app[u"Bloc-notes sans titre"].menu_select(u"Aidez-moi->information sur la version")

notepad2.png

Confirmation de l'existence de l'écran d'information sur la version

>>> print ( app[u"Informations sur la version du bloc-notes"].exists() )
True
>>>

Obtenez des informations de contrôle sur l'écran d'informations de version

>>> window = app.top_window()
>>> window.print_control_identifiers()
Control Identifiers:

Dialog - 'Informations sur la version du bloc-notes'    (L690, T232, R1240, B711)
['Informations sur la version du bloc-notes', 'Dialog', 'Informations sur la version du bloc-notesDialog']
child_window(title="Informations sur la version du bloc-notes", class_name="#32770")
   |
   | Static - ''    (L716, T348, R1213, B350)
   | ['Informations sur la version du bloc-notes Statique', 'Static', 'Informations sur la version du bloc-notes Statique0', 'Informations sur la version du bloc-notes Statique1', 'Static0', 'Static1']
   | child_window(class_name="Static")
   |
   | Static - ''    (L710, T367, R747, B405)
   | ['Informations sur la version du bloc-notes Static2', 'Static2']
   | child_window(class_name="Static")
   |
   | Static - 'Microsoft Windows'    (L759, T367, R1162, B386)
   | ['Static3', 'Microsoft WindowsStatic', 'Microsoft Windows']
   | child_window(title="Microsoft Windows", class_name="Static")
   |
   | Static - 'Version 1809(Build du système d'exploitation 17763.1397)'    (L759, T386, R1223, B405)
   | ['Version 1809(Build du système d'exploitation 17763.1397)', 'Static4', 'Version 1809(Build du système d'exploitation 17763.1397)Static']
   | child_window(title="Version 1809(Build du système d'exploitation 17763.1397)", class_name="Static")
   |
   | Static - '© 2018 Microsoft Corporation. All rights reserved.'    (L759, T404, R1179, B423)
   | ['© 2018 Microsoft Corporation. All rights reserved.Static', '© 2018 Microsoft Corporation. All rights reserved.', 'Static5', '© 2018 Microsoft Corporation. All rights reserved.Static0', '© 2018 Microsoft Corporation. All rights reserved.Static1']
   | child_window(title="© 2018 Microsoft Corporation. All rights reserved.", class_name="Static")
   |
   | Static - ''    (L759, T423, R1179, B442)
   | ['© 2018 Microsoft Corporation. All rights reserved.Static2', 'Static6']
   | child_window(class_name="Static")
   |
   | Static - 'Système d'exploitation et interface utilisateur Windows 10 Entreprise aux États-Unis et dans d'autres pays/Protégé par les marques locales et autres droits de propriété intellectuelle.'    (L759, T442, R1179, B517)
   | ['Static7', 'Système d'exploitation et interface utilisateur Windows 10 Entreprise aux États-Unis et dans d'autres pays/Protégé par les marques locales et autres droits de propriété intellectuelle.', 'Système d'exploitation et interface utilisateur Windows 10 Entreprise aux États-Unis et dans d'autres pays/Protégé par les marques locales et autres droits de propriété intellectuelle. Statique', 'Système d'exploitation et interface utilisateur Windows 10 Entreprise aux États-Unis et dans d'autres pays/Protégé par les marques locales et autres droits de propriété intellectuelle. Statique0', 'Système d'exploitation et interface utilisateur Windows 10 Entreprise aux États-Unis et dans d'autres pays/Protégé par les marques locales et autres droits de propriété intellectuelle. Statique1']
   | child_window(title="Système d'exploitation et interface utilisateur Windows 10 Entreprise aux États-Unis et dans d'autres pays/Protégé par les marques locales et autres droits de propriété intellectuelle.", class_name="Static")
   |
   | Static - ''    (L759, T517, R1127, B555)
   | ['Static8', 'Système d'exploitation et interface utilisateur Windows 10 Entreprise aux États-Unis et dans d'autres pays/Protégé par les marques locales et autres droits de propriété intellectuelle. Statique2']
   | child_window(class_name="Static")
   |
   | SysLink - 'Ce produit est<A>Termes du contrat de licence logiciel Microsoft</A>Il est autorisé aux personnes suivantes en fonction des conditions de.'    (L759, T554, R1127, B592)
   | ['Ce produit est<A>Termes du contrat de licence logiciel Microsoft</A>Il est autorisé aux personnes suivantes en fonction des conditions de.', 'Ce produit est<A>Termes du contrat de licence logiciel Microsoft</A>Il est autorisé aux personnes suivantes en fonction des conditions de.SysLink', 'SysLink']
   | child_window(title="Ce produit est<A>Termes du contrat de licence logiciel Microsoft</A>Il est autorisé aux personnes suivantes en fonction des conditions de.", class_name="SysLink")
   |
   | Static - 'Utilisateurs Windows'    (L777, T592, R1145, B611)
   | ['Utilisateur Windows statique', 'Static9', 'Utilisateurs Windows', 'Utilisateur Windows statique0', 'Utilisateur Windows statique1']
   | child_window(title="Utilisateurs Windows", class_name="Static")
   |
   | Static - ''    (L777, T611, R1145, B630)
   | ['Utilisateur Windows Static2', 'Static10']
   | child_window(class_name="Static")
   |
   | Button - 'OK'    (L1136, T665, R1224, B691)
   | ['OKButton', 'OK', 'Button']
   | child_window(title="OK", class_name="Button")
>>>

Fermez l'écran d'informations sur la version

Appuyez sur le bouton OK pour fermer l'écran d'informations sur la version

>>> app[u"Informations sur la version du bloc-notes"].OK.close_click()
<win32_controls.ButtonWrapper - '', Button, 462076>
>>>

Afficher les informations de contrôle du bloc-notes

>>> app[u"Bloc-notes sans titre"].dump_tree()
Control Identifiers:

Notepad - 'Sans titre-Bloc-notes'    (L673, T177, R1770, B798)
['Sans titre-Bloc-notes', 'Notepad', 'Sans titre-Bloc-notesNotepad']
child_window(title="Sans titre-Bloc-notes", class_name="Notepad")
   |
   | Edit - ''    (L681, T228, R1762, B766)
   | ['Edit', 'Sans titre-Bloc-notes Modifier']
   | child_window(class_name="Edit")
   |
   | StatusBar - ''    (L681, T766, R1762, B790)
   | ['Sans titre-Barre d'état du bloc-notes', 'StatusBar   Windows (CRLF)', 'StatusBar100%', 'StatusBar', 'StatusBar 1 ligne, 1 colonne']
   | child_window(class_name="msctls_statusbar32")
>>>

Contrôle d'édition trouvé

Saisissez du texte dans le bloc-notes

Écrivez Hello World!

>>> app[u"Bloc-notes sans titre"].Edit.set_edit_text(u"Hello World!")
<win32_controls.EditWrapper - 'Hello World!', Edit, 3672052>
>>>
>>> app[u"Bloc-notes sans titre"].Edit.type_keys("{ENTER}")
<win32_controls.EditWrapper - 'Hello World!
', Edit, 3672052>
>>>

notepad3.png

Enregistrer le bloc-notes sous

>>> app[u"Bloc-notes sans titre"].menu_select(u"Fichier->enregistrer sous")
>>>
>>> #Spécifier la boîte de dialogue Enregistrer sous
>>> dialog = app[u"enregistrer sous"]
>>>
>>> #Définir le nom du fichier
>>> dialog.Edit.set_edit_text(u"tester")
<win32_controls.EditWrapper - 'tester', Edit, 593534>
>>>
>>> #Appuyez sur le bouton Enregistrer
>>> dialog[u"sauvegarder"].click()
>>>

Depuis que le nom du fichier a changé, la barre de titre a également changé

notepad4.png

Fermer le bloc-notes

Appuyez sur Alt + F4 pour fermer le Bloc-notes La touche Alt est "%"

La barre de titre ayant changé, remplacez la désignation "Bloc-notes sans titre"

>>> app[u"Bloc-notes de test"].type_keys("%{F4}")  # Alt + F4
<hwndwrapper.DialogWrapper - '', Notepad, 4261490>
>>>

Énumérer les fenêtres

>>> from pywinauto import Desktop
>>> top_windows = Desktop().windows()
>>> for w in top_windows:
...     print (w.window_text())
...

Connectez-vous à une application lancée (Bloc-notes)

Connectez-vous et consultez le contenu

>>> from pywinauto import Desktop, Application
>>> app = Application().connect(path='notepad.exe')
>>>
>>> print ( app[u"Bloc-notes de test"].Edit.window_text() )
Hello World!

>>>
>>> print ( app[u"Bloc-notes de test"].Edit.texts() )
['Hello World!\r\n', 'Hello World!', '']
>>> print ( app[u"Bloc-notes de test"].Edit.text_block() )
Hello World!

>>>

Récupère le texte de la ligne spécifiée

>>> print ( app[u"Bloc-notes de test"].Edit.line_count() )
2
>>> print ( app[u"Bloc-notes de test"].Edit.get_line(0) )
Hello World!
>>> print ( app[u"Bloc-notes de test"].Edit.get_line(1) )

>>>

Obtenir le texte de l'écran d'informations sur la version

>>> app[u"Bloc-notes de test"].menu_select(u"Aidez-moi->information sur la version")
>>> for c in  app[u"Informations sur la version du bloc-notes"].children(class_name='Static') :
...     print ( c.window_text() )
...


Microsoft Windows
Version 1809(Build du système d'exploitation 17763.1397)
© 2018 Microsoft Corporation. All rights reserved.

Système d'exploitation et interface utilisateur Windows 10 Entreprise aux États-Unis et dans d'autres pays/Protégé par les marques locales et autres droits de propriété intellectuelle.

Utilisateurs Windows

>>>

notepad5.png

Plus d'informations sur l'écran d'informations sur la version

>>> for c in  app[u"Informations sur la version du bloc-notes"].children() :
...     print ( c.get_properties() )   
...
{'class_name': 'Static', 'friendly_class_name': 'Static', 'texts': [''], 'control_id': 13095, 'rectangle': <RECT L618, T474, R1115, B476>, 'is_visible': True, 'is_enabled': True, 'control_count': 0, 'style': 1342177296, 'exstyle': 131076, 'user_data': 0, 'context_help_id': 0, 'fonts': [<LOGFONTW 'MS UI Gothic' -12>], 'client_rects': [<RECT L0, T0, R495, B0>], 'is_unicode': True, 'menu_items': [], 'automation_id': ''}
{'class_name': 'Static', 'friendly_class_name': 'Static', 'texts': [''], 'control_id': 12297, 'rectangle': <RECT L612, T493, R649, B531>, 'is_visible': True, 'is_enabled': True, 'control_count': 0, 'style': 1342177347, 'exstyle': 4, 'user_data': 0, 'context_help_id': 0, 'fonts': [<LOGFONTW 'MS UI Gothic' -12>], 'client_rects': [<RECT L0, T0, R37, B38>], 'is_unicode': True, 'menu_items': [], 'automation_id': '', 'image': <PIL.Image.Image image mode=RGB size=37x38 at 0x1B6F8DFBAF0>}
{'class_name': 'Static', 'friendly_class_name': 'Static', 'texts': ['Microsoft Windows'], 'control_id': 13568, 'rectangle': <RECT L661, T493, R1064, B512>, 'is_visible': True, 'is_enabled': True, 'control_count': 0, 'style': 1342177420, 'exstyle': 4, 'user_data': 0, 'context_help_id': 0, 'fonts': [<LOGFONTW 'Yu Gothic UI' -12>], 'client_rects': [<RECT L0, T0, R403, B19>], 'is_unicode': True, 'menu_items': [], 'automation_id': ''}
{'class_name': 'Static', 'friendly_class_name': 'Static', 'texts': ['Version 1809(Build du système d'exploitation 17763.1397)'], 'control_id': 13579, 'rectangle': <RECT L661, T512, R1125, B531>, 'is_visible': True, 'is_enabled': True, 'control_count': 0, 'style': 1342177420, 'exstyle': 4, 'user_data': 0, 'context_help_id': 0, 'fonts': [<LOGFONTW 'Yu Gothic UI' -12>], 'client_rects': [<RECT L0, T0, R464, B19>], 'is_unicode': True, 'menu_items': [], 'automation_id': ''}
{'class_name': 'Static', 'friendly_class_name': 'Static', 'texts': ['© 2018 Microsoft Corporation. All rights reserved.'], 'control_id': 13578, 'rectangle': <RECT L661, T530, R1081, B549>, 'is_visible': True, 'is_enabled': True, 'control_count': 0, 'style': 1342177408, 'exstyle': 4, 'user_data': 0, 'context_help_id': 0, 'fonts': [<LOGFONTW 'Yu Gothic UI' -12>], 'client_rects': [<RECT L0, T0, R420, B19>], 'is_unicode': True, 'menu_items': [], 'automation_id': ''}
{'class_name': 'Static', 'friendly_class_name': 'Static', 'texts': [''], 'control_id': 51715, 'rectangle': <RECT L661, T549, R1081, B568>, 'is_visible': False, 'is_enabled': True, 'control_count': 0, 'style': 1073741952, 'exstyle': 4, 'user_data': 0, 'context_help_id': 0, 'fonts': [<LOGFONTW 'Yu Gothic UI' -12>], 'client_rects': [<RECT L0, T0, R420, B19>], 'is_unicode': True, 'menu_items': [], 'automation_id': ''}
{'class_name': 'Static', 'friendly_class_name': 'Static', 'texts': ['Système d'exploitation et interface utilisateur Windows 10 Entreprise aux États-Unis et dans d'autres pays/Protégé par les marques locales et autres droits de propriété intellectuelle.'], 'control_id': 13587, 'rectangle': <RECT L661, T568, R1081, B643>, 'is_visible': True, 'is_enabled': True, 'control_count': 0, 'style': 1342177408, 'exstyle': 4, 'user_data': 0, 'context_help_id': 0, 'fonts': [<LOGFONTW 'Yu Gothic UI' -12>], 'client_rects': [<RECT L0, T0, R420, B75>], 'is_unicode': True, 'menu_items': [], 'automation_id': ''}
{'class_name': 'Static', 'friendly_class_name': 'Static', 'texts': [''], 'control_id': 13581, 'rectangle': <RECT L661, T643, R1029, B681>, 'is_visible': False, 'is_enabled': True, 'control_count': 0, 'style': 1073741952, 'exstyle': 4, 'user_data': 0, 'context_help_id': 0, 'fonts': [<LOGFONTW 'Yu Gothic UI' -12>], 'client_rects': [<RECT L0, T0, R368, B38>], 'is_unicode': True, 'menu_items': [], 'automation_id': ''}
{'class_name': 'SysLink', 'friendly_class_name': 'SysLink', 'texts': ['Ce produit est<A>Termes du contrat de licence logiciel Microsoft</A>Il est autorisé aux personnes suivantes en fonction des conditions de.'], 'control_id': 13586, 'rectangle': <RECT L661, T680, R1029, B718>, 'is_visible': True, 'is_enabled': True, 'control_count': 0, 'style': 1342242816, 'exstyle': 4, 'user_data': 0, 'context_help_id': 0, 'fonts': [<LOGFONTW 'Yu Gothic UI' -12>], 'client_rects': [<RECT L0, T0, R368, B38>], 'is_unicode': True, 'menu_items': [], 'automation_id': ''}
{'class_name': 'Static', 'friendly_class_name': 'Static', 'texts': ['Utilisateurs Windows'], 'control_id': 13575, 'rectangle': <RECT L679, T718, R1047, B737>, 'is_visible': True, 'is_enabled': True, 'control_count': 0, 'style': 1342177408, 'exstyle': 4, 'user_data': 0, 'context_help_id': 0, 'fonts': [<LOGFONTW 'Yu Gothic UI' -12>], 'client_rects': [<RECT L0, T0, R368, B19>], 'is_unicode': True, 'menu_items': [], 'automation_id': ''}
{'class_name': 'Static', 'friendly_class_name': 'Static', 'texts': [''], 'control_id': 13576, 'rectangle': <RECT L679, T737, R1047, B756>, 'is_visible': True, 'is_enabled': True, 'control_count': 0, 'style': 1342177408, 'exstyle': 4, 'user_data': 0, 'context_help_id': 0, 'fonts': [<LOGFONTW 'Yu Gothic UI' -12>], 'client_rects': [<RECT L0, T0, R368, B19>], 'is_unicode': True, 'menu_items': [], 'automation_id': ''}
{'class_name': 'Button', 'friendly_class_name': 'Button', 'texts': ['OK'], 'control_id': 1, 'rectangle': <RECT L1038, T791, R1126, B817>, 'is_visible': True, 'is_enabled': True, 'control_count': 0, 'style': 1342242816, 'exstyle': 4, 'user_data': 0, 'context_help_id': 0, 'fonts': [<LOGFONTW 'Yu Gothic UI' -12>], 'client_rects': [<RECT L0, T0, R88, B26>], 'is_unicode': True, 'menu_items': [], 'automation_id': ''}
>>>

Répertoriez les boutons sur l'écran d'informations sur la version

>>> #Nombre de boutons
>>> len( app[u"Informations sur la version du bloc-notes"].children(class_name="Button") )
1
>>> #Énumération des informations sur les boutons
>>> for b in app[u"Informations sur la version du bloc-notes"].children(class_name="Button") :
...     print ( b.window_text() + "  visible:" + str(b.is_visible()) + "  enabled:" + str(b.is_enabled()) )
...
OK  visible:True  enabled:True
>>>

Vérifiez le fonctionnement avec Explorer

Ouvrir mes documents

C:\>python
Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from pywinauto import Application
>>> Application().start('explorer.exe')
<pywinauto.application.Application object at 0x0000021F459F0FD0>
>>> app = Application().connect(path='explorer.exe')
>>>
>>> #Confirmation de connexion
>>> app[u"Explorateur"].exists()
True
>>>
>>> #Paramètre du chemin du dossier Mes documents
>>> import os
>>> mydocument = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Documents')
>>>
>>> #Ouvrez le dossier Mes documents
>>> app[u"Explorateur"].AddressBandRoot.type_keys(u"{ENTER}" + mydocument + "{ENTER}")
<hwndwrapper.HwndWrapper - '', Address Band Root, 264944>
>>>

explorer1.png

Obtenir une liste de fichiers dans Mes documents

>>> from pywinauto import Desktop
>>> d = Desktop(backend='uia')[u"document"]
>>> d.ListBox.get_properties()
{'class_name': 'UIItemsView', 'friendly_class_name': 'ListBox', 'texts': [['', 'Nom', 'Mettre à jour la date et l'heure', 'type', 'Taille'], ['', 'Nom', 'Mettre à jour la date et l'heure', 'type', 'Taille'], ['', 'Nom', 'Mettre à jour la date et l'heure', 'type', 'Taille']], 'control_id': 0, 'rectangle': <RECT L947, T306, R1605, B767>, 'is_visible': True, 'is_enabled': True, 'control_count': 5, 'is_keyboard_focusable': False, 'has_keyboard_focus': False, 'automation_id': '', 'column_count': 4, 'item_count': 3, 'columns': [<uiawrapper.UIAWrapper - 'Nom', SplitButton, -5173013587085247480>, <uiawrapper.UIAWrapper - 'Mettre à jour la date et l'heure', SplitButton, 7405196887091890411>, <uiawrapper.UIAWrapper - 'type', SplitButton, 4224075079785634787>, <uiawrapper.UIAWrapper - 'Taille', SplitButton, 7052361179099937348>]}
>>>
>>> #Le nombre de lignes de la liste est
>>> d.ListBox.item_count()
3
>>>
>>> #Affichage de liste de liste
>>> for i in d.ListBox.get_items() :
...     i.window_text()
...
'Modèle personnalisé de bureau'
'pywinauto'
'UISpy Settings'
>>>

Les noms de contrôle et la structure hiérarchique peuvent être utiles en utilisant un outil appelé UISPY. Télécharger depuis cette zone https://github.com/blackrosezy/gui-inspect-tool

explorer2.png

Si vous voulez juste une liste de fichiers, vous n'avez pas besoin d'utiliser pywinauto

>>> import os
>>> mydocument = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Documents')
>>> for file in os.listdir( mydocument ) :
...     print( file )
...
Default.rdp
desktop.ini
My Music
My Pictures
My Videos
Modèle personnalisé de bureau
pywinauto
UISpy Settings
>>>

cette? Vous pouvez voir les fichiers cachés que vous ne pouvez pas voir. ..

Déplacer le dossier de Mes documents

>>> d = Desktop(backend='uia')[u"document"]
>>> d.ListBox[u"Modèle personnalisé de bureau"].invoke()
<uia_controls.ListItemWrapper - 'Modèle personnalisé de bureau', ListItem, 8579292259166560630>
>>>

Recommended Posts

Remarques sur l'utilisation de pywinauto
Remarques sur l'utilisation des featuretools
Comment utiliser Dataiku sous Windows
Comment utiliser l'homebrew dans Debian
Autoencoder dans Chainer (Remarques sur l'utilisation de + trainer)
Remarques sur la rédaction de requirements.txt
[Hyperledger Iroha] Remarques sur l'utilisation du SDK Python
Remarques sur l'utilisation de la guimauve dans la bibliothèque de schémas
Comment utiliser mecab, neologd-ipadic sur colab
Comment utiliser l'Assistant Google sur Windows 10
Mémorandum sur l'utilisation du python gremlin
Comment utiliser xml.etree.ElementTree
Comment utiliser Python-shell
Remarques sur l'utilisation de tf.data
Comment utiliser Seaboan
Comment utiliser la correspondance d'image
Comment utiliser le shogun
Comment utiliser Pandas 2
Comment utiliser Virtualenv
Comment utiliser numpy.vectorize
Comment utiliser pytest_report_header
Comment utiliser partiel
Comment utiliser Bio.Phylo
Comment utiliser SymPy
Comment utiliser x-means
Comment utiliser WikiExtractor.py
Comment utiliser IPython
Comment utiliser virtualenv
Comment utiliser Matplotlib
Comment utiliser iptables
Comment utiliser numpy
Comment utiliser TokyoTechFes2015
Comment utiliser venv
Comment utiliser le dictionnaire {}
Comment utiliser Pyenv
Comment utiliser la liste []
Comment utiliser python-kabusapi
Comment utiliser OptParse
Comment utiliser le retour
Comment utiliser pyenv-virtualenv
Comment utiliser imutils
Comment utiliser Python Kivy ④ ~ Exécution sur Android ~
Comment utiliser Qt Designer
Comment utiliser la recherche triée
[gensim] Comment utiliser Doc2Vec
python3: Comment utiliser la bouteille (2)
Comprendre comment utiliser django-filter
Comment utiliser le générateur
[Python] Comment utiliser la liste 1
Comment utiliser FastAPI ③ OpenAPI
Comment s'inscrire auprès de pypi
Comment utiliser Python Argparse
Comment utiliser IPython Notebook
Comment utiliser Pandas Rolling
[Note] Comment utiliser virtualenv
Comment utiliser les dictionnaires redis-py
Python: comment utiliser pydub