UI-Automatisierung Teil 2 in Python

Fortsetzung von UI-Automatisierung mit Python Dieses Mal werde ich auf die Schaltfläche klicken.

ControlPattern Steuerelemente, die die UI-Automatisierung unterstützen, bieten eine bedienbare Schnittstelle in Form eines Steuerungsmusters. Bei Schaltflächen wird InvokePattern unterstützt. Wenn Sie diese also aufrufen und Invoke () aufrufen, eine Methode von InvokePattern, können Sie das Klicken auf Schaltflächen realisieren. Sie können herausfinden, ob ein AutomationElement InvokePattern unterstützt, indem Sie sich IsInvokePatternAvailable des Elements ansehen.

def click_button(element):
    """IUIAutomationInvokePattern für das angegebene Element.Invoke()Klicken Sie mit

Tun Sie nichts, wenn die IsInvokePatternAvailable-Eigenschaft des angegebenen Elements False ist
    """
    isClickable = element.GetCurrentPropertyValue(UIA_IsInvokePatternAvailablePropertyId)
    if isClickable == True:
        ptn = element.GetCurrentPattern(UIA_InvokePatternId)
        ptn.QueryInterface(IUIAutomationInvokePattern).Invoke()

Details sind unten. UI Automation Control Patterns Overview http://msdn.microsoft.com/en-us/library/ee671194(v=vs.85).aspx#controlpatterninterfaces

Die .NET-Version verfügt über eine japanische Übersetzung (obwohl es sich um eine maschinelle Übersetzung handelt). Übersicht über das UI-Automatisierungssteuerungsmuster http://msdn.microsoft.com/ja-jp/library/ms752362(v=vs.110).aspx

Vorbereitung

Bevor Sie auf die Schaltfläche klicken, setzen Sie sie zusammen, einschließlich der vorherigen.

uiauti.py


# -*- coding: utf-8 -*-
"""
uiautil : UI Automation utility

Es funktioniert nur unter Windows.
"""
import comtypes
from comtypes import CoCreateInstance
import comtypes.client
from comtypes.gen.UIAutomationClient import *

__uia = None
__root_element = None

def __init():
    global __uia, __root_element
    __uia = CoCreateInstance(CUIAutomation._reg_clsid_,
                             interface=IUIAutomation,
                             clsctx=comtypes.CLSCTX_INPROC_SERVER)
    __root_element = __uia.GetRootElement()
    
def get_window_element(title):
    """Ruft das AutomationElement des im Titel angegebenen Fensters ab
    
Wenn der Titel auf dem Desktop dupliziert wird, geben Sie den ersten gefundenen zurück
    """
    win_element = __root_element.FindFirst(TreeScope_Children,
                                           __uia.CreatePropertyCondition(
                                           UIA_NamePropertyId, title))
    return win_element

def find_control(base_element, ctltype):
    """Hat die angegebene Steuerelementtyp-ID aus dem angegebenen Basiselement-Teilbaum
Gibt eine Folge von Elementen zurück
    """
    condition = __uia.CreatePropertyCondition(UIA_ControlTypePropertyId, ctltype)
    ctl_elements = base_element.FindAll(TreeScope_Subtree, condition)
    return [ ctl_elements.GetElement(i) for i in range(ctl_elements.Length) ]
   
def lookup_by_name(elements, name):
    """Elemente mit der angegebenen Name-Eigenschaft aus der angegebenen Elementfolge
Gibt den ersten zurück.
Gibt None zurück, wenn kein Treffer vorliegt

   """
    for element in elements:
        if element.CurrentName == name:
            return element

    return None

def lookup_by_automationid(elements, id):
    """Hat die angegebene AutomationId-Eigenschaft aus der angegebenen Folge von Elementen
Gibt das erste der Elemente zurück.
Gibt None zurück, wenn kein Treffer vorliegt

   """
    for element in elements:
        if element.CurrentAutomationId == id:
            return element
    return None
    
def click_button(element):
    """IUIAutomationInvokePattern für das angegebene Element.Invoke()Klicken Sie mit

Tun Sie nichts, wenn die IsInvokePatternAvailable-Eigenschaft des angegebenen Elements False ist
    """
    isClickable = element.GetCurrentPropertyValue(UIA_IsInvokePatternAvailablePropertyId)
    if isClickable == True:
        ptn = element.GetCurrentPattern(UIA_InvokePatternId)
        ptn.QueryInterface(IUIAutomationInvokePattern).Invoke()


if __name__ == '__main__':
    __init()

Versuchen Sie, automatisch mit einem Taschenrechner zu rechnen

Testen Sie, indem Sie uiautil.py auf IDLE ausführen. Starten Sie den Rechner und legen Sie die Eigenschaft fest, die die einzelnen Schaltflächen identifiziert. Dieses Mal werde ich AutomationId verwenden.

>>> 
>>> win = get_window_element('Taschenrechner')
>>> btns = find_control(win, UIA_ButtonControlTypeId)
>>> for b in btns: print btns.index(b), b.CurrentName, b.CurrentAutomationId

0 Speicher löschen 122
1 Rückraum 83
2 7 137
3 4 134
4 1 131
5 0 130
<Unterlassung>
21 Subtraktion 94
22 Zusatz 93
23 Speichersubtraktion 126
24 Quadratwurzel 110
25% 118
26 Invers 114
27. Klasse 121
28 Minimieren
29 Maximieren
30 schließen
>>> def one_plus_one():
	btn_1 = lookup_by_automationid(btns, "131")
	btn_plus = lookup_by_automationid(btns, "93")
	btn_equal = lookup_by_automationid(btns, "121")
	click_button(btn_1)
	click_button(btn_plus)
	click_button(btn_1)
	click_button(btn_equal)

	
>>> one_plus_one()
>>> 

2 wurde auf dem Rechner angezeigt!

Dieses Mal verwende ich Windows 8.1 Pro (x64), aber wie unten gezeigt, scheint AutomaionId zwischen Builds und Releases nicht garantiert zu sein, sodass AutomaionId unter anderen Betriebssystemen wie Windows 7 möglicherweise anders ist. Es gibt auch Fälle, in denen AutomationId nicht wie bei der Minimierung und Maximierung zugewiesen wird.

Aus der Beschreibung von UIA_AutomationIdPropertyId in http://msdn.microsoft.com/en-us/library/ee684017(v=vs.85).aspx.

Although support for AutomationId is always recommended for better automated testing support, this property is not mandatory. Where it is supported, AutomationId is useful for creating a test automation script that runs regardless of the UI language. Clients should make no assumptions regarding the AutomationId values exposed by other applications. AutomationId is not guaranteed to be stable across different releases or builds of an application.

So überprüfen Sie das Automatisierungselement

Es scheint, dass die Grundlage für die Angabe von AutomationElement von der Erstellung der zu bedienenden Anwendung abhängt. Daher sollten Sie im Voraus herausfinden, welche Eigenschaften die Automatisierungselemente der Operationszielanwendung haben. Wie im obigen Beispiel ist die Methode, AutomationElement nacheinander zu treffen, mühsam, daher habe ich nach einem Tool gesucht, das leicht untersucht werden kann. dort gab es.

Es ist auch im Windows SDK von Anfang an.

Mit Inspect.exe und Visual UI Automation Verify, die im Windows SDK enthalten sind, können Sie die Eigenschaften der einzelnen Elemente in der AutomationElement-Struktur unter dem Desktop überprüfen.

Windows Software Development Kit (SDK) for Windows 8.1 http://msdn.microsoft.com/en-us/windows/desktop/bg162891.aspx

Wenn Sie das Windows SDK installieren, wird Folgendes angezeigt (xxx ist x86, x64, arm. Die Version kann je nach der von Ihnen installierten Version des SDK unterschiedlich sein). Kein Visual Studio erforderlich.

%ProgramFiles%\Windows Kits\8.1\bin\xxx

Einzelheiten zur Verwendung des Tools finden Sie unten. Inspect http://msdn.microsoft.com/en-us/library/windows/desktop/dd318521(v=vs.85).aspx

Visual UI Automation Verify http://msdn.microsoft.com/en-us/library/windows/desktop/jj160544(v=vs.85).aspx

Recommended Posts

UI-Automatisierung Teil 2 in Python
UI-Automatisierung mit Python
Verschieben von CSV-Dateien mit Python Teil 1
[Mit Python automatisiert! ] Teil 1: Datei einstellen
[Mit Python automatisiert! ] Teil 2: Dateivorgang
Quadtree in Python --2
QGIS + Python Teil 2
Python in der Optimierung
CURL in Python
Metaprogrammierung mit Python
Python 3.3 mit Anaconda
Geokodierung in Python
SendKeys in Python
GUI-Erstellung in Python mit tkinter Teil 1
AM-Modulation und Demodulation mit Python Part 2
Metaanalyse in Python
Unittest in Python
QGIS + Python Teil 1
Epoche in Python
Zwietracht in Python
Mit Python Teil 2 ein Herz zeichnen (SymPy Edition)
Deutsch in Python
DCI in Python
Quicksort in Python
N-Gramm in Python
Programmieren mit Python
Plink in Python
Konstante in Python
FizzBuzz in Python
SQLite in Python
Python: Scraping Teil 1
Schritt AIC in Python
LINE-Bot [0] in Python
CSV in Python
Reverse Assembler mit Python
Reflexion in Python
Konstante in Python
nCr in Python.
Format in Python
Scons in Python 3
Puyopuyo in Python
Python in Virtualenv
PPAP in Python
Quad-Tree in Python
Reflexion in Python
Chemie mit Python
Hashbar in Python
DirectLiNGAM in Python
LiNGAM in Python
In Python reduzieren
Lösung Wenn Sie Python 3.6 oder höher verwenden, benötigen Sie die enum34-Bibliothek ebenfalls nicht. Deinstallieren Sie sie daher und verwenden Sie das Standard-Enum-Modul. Enum34 deinstallieren Führen Sie nach der Deinstallation von enum34 erneut `pip install optuna` aus und Sie haben Optuna erfolgreich installiert! Python, pip, Python3, enum, OptunaPython3 Beginn Teil 1
Python: Scraping Teil 2
In Python flach drücken
[Automatisierung] Extrahieren Sie die Tabelle als PDF mit Python
[Python] Automatisierung zum Kopieren von Excel-Dateien implementiert
Verwenden Sie Python in Ihrer Umgebung von Win Automation
DICOM-Bilder mit Python Part 2 entfernen
Verschieben von CSV-Dateien in Python Teil 2: Leistungsmessung