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
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()
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.
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