Grundlegende Automatisierungsoperationen

Dieses Kapitel beschreibt die grundlegenden Automatisierungsfunktionen, die von FIRERPA bereitgestellt werden. Fortgeschrittenere Anwendungen werden später beschrieben. In diesem Kapitel werden einige der häufig verwendeten grundlegenden Funktionsschnittstellen vorgestellt.

Geräteinformationen abrufen

Ruft Informationen über das aktuelle Gerät ab, wie z. B. Gerätename, Bildschirmgröße, Bildschirmausrichtung und aktuelle Anwendung.

d.device_info()
>>> d.device_info()
productName: "bumblebee"
sdkInt: 34
displayHeight: 2400
displaySizeDpX: 411
displaySizeDpY: 914
displayWidth: 1080
screenOn: true
naturalOrientation: true
currentPackageName: "com.android.launcher3"
>>> result = d.device_info()
>>> print (result.displayWidth)
1080

Dienstinformationen abrufen

Ruft Informationen über den aktuellen Dienst ab, wie z. B. Version, eindeutige Geräte-ID, Version, ABI usw.

d.server_info()
>>> d.server_info( )
uniqueId: "673abbe0-ff7b-9d82-1792-8876cb72cf56"
version: "8.28"
architecture: "arm64-v8a"
uptime: 293
secure: True
>>> result = d.server_info()
>>> print (result.secure)
False

Bildschirm ausschalten

Die folgende Schnittstelle schaltet den Bildschirm des aktuellen Mobiltelefons aus, was dem Drücken der Ein-/Aus-Taste bei eingeschaltetem Bildschirm entspricht.

d.sleep()

Bildschirm einschalten

Die folgende Schnittstelle schaltet den Bildschirm des aktuellen Mobiltelefons ein, was dem Drücken der Ein-/Aus-Taste bei ausgeschaltetem Bildschirm entspricht.

d.wake_up()

Ist der Bildschirm eingeschaltet?

Mit der folgenden Schnittstelle können Sie überprüfen, ob der Bildschirm des aktuellen Geräts eingeschaltet ist, um zu beurteilen, ob Operationen durchgeführt werden können.

d.is_screen_on()

Ist der Bildschirm gesperrt?

Mit der folgenden Schnittstelle können Sie überprüfen, ob der Bildschirm des aktuellen Geräts entsperrt ist, um zu beurteilen, ob Operationen durchgeführt werden können.

d.is_screen_locked()

Toast anzeigen

Sie können die folgende Schnittstelle verwenden, um eine Toast-Nachricht Hello from Lamda! auf dem Bildschirm des Mobiltelefons anzuzeigen.

d.show_toast("Hello from Lamda!")

Zwischenablage lesen

Die folgende Schnittstelle wird verwendet, um den aktuellen Inhalt der Zwischenablage des Mobiltelefons zu lesen. Android 10+ wird vorübergehend nicht unterstützt.

d.get_clipboard()

In die Zwischenablage schreiben

Die folgende Schnittstelle wird verwendet, um Inhalte in die Zwischenablage des aktuellen Geräts zu schreiben.

d.set_clipboard("Inhalt der Zwischenablage")

Physische Tasten

Sie können die folgenden Methoden verwenden, um Tastendrücke zu simulieren. Es werden mehr als zehn Tasten wie KEY_BACK, KEY_DOWN, KEY_HOME usw. unterstützt.

d.press_key(Keys.KEY_BACK)
d.press_key(Keys.KEY_CAMERA)
d.press_key(Keys.KEY_CENTER)
d.press_key(Keys.KEY_DELETE)
d.press_key(Keys.KEY_DOWN)
d.press_key(Keys.KEY_ENTER)
d.press_key(Keys.KEY_HOME)
d.press_key(Keys.KEY_LEFT)
d.press_key(Keys.KEY_MENU)
d.press_key(Keys.KEY_POWER)
d.press_key(Keys.KEY_RECENT)
d.press_key(Keys.KEY_RIGHT)
d.press_key(Keys.KEY_SEARCH)
d.press_key(Keys.KEY_UP)
d.press_key(Keys.KEY_VOLUME_DOWN)
d.press_key(Keys.KEY_VOLUME_MUTE)
d.press_key(Keys.KEY_VOLUME_UP)

Um weitere Tasten zu unterstützen, kann auch diese Methode zur Simulation verwendet werden. Sie finden alle unterstützten Tastennamen in diesem offiziellen Android-Dokument: https://developer.android.com/reference/android/view/KeyEvent.

d.press_keycode(KeyCodes.KEYCODE_CALL)

Bildschirmaufnahme

Wir bieten eine Methode zur Bildschirmaufnahme, damit Sie den Prozess aufzeichnen oder Bilderkennungsoperationen durchführen können. Der folgende Aufruf bedeutet, ein Bild mit einer Qualität von 60 aufzunehmen und es in der Datei screenshot.png im aktuellen Verzeichnis zu speichern.

d.screenshot(60).save("screenshot.png")
>>> result = d.screenshot(60)
>>> result
<lamda.types.BytesIO object at 0x7a28361d60>
>>> result.save("screenshot.png")
52917
>>> result.getvalue( )
b'\xff\xd8\xff\xe0\x00\x10JFIF\x00\x01....'

Derzeit unterstützen wir auch Bereichs- und Element-Screenshots. Element-Screenshots werden in diesem Kapitel nicht behandelt. Hier stellen wir Bereichs-Screenshots vor. Sie müssen das Konzept und die Definition eines Bereichs verstehen. In unserer Schnittstelle wird ein Bereich durch Bound definiert, das vier Parameter enthält: top, left, right, bottom. Der Android-Bildschirm unterscheidet sich von herkömmlichen Koordinatensystemen. Die obere linke Ecke des aktuellen Gerätebildschirms ist der Ursprung mit den Koordinaten x=0, y=0. Angenommen, der aktuelle Bildschirm ist im Hochformat mit einer Auflösung von 1080x1920. Um einen Screenshot des gesamten Bildschirms zu erstellen, können Sie dies wie folgt tun.

d.screenshot(60, bound=Bound(top=0, left=0, right=1080, bottom=1920)).save("screenshot.png")

Dies erzeugt einen Screenshot des gesamten Bildschirms, was natürlich unnötig ist, da dies die Standardeinstellung ist. Wie machen wir also einen Screenshot eines 200x200-Bildes in der oberen linken Ecke? Das ist auch sehr einfach, Sie müssen es nur wie folgt machen.

d.screenshot(60, bound=Bound(top=0, left=0, right=200, bottom=200)).save("screenshot.png")

An dieser Stelle sollten wir die Bedeutung dieser Parameter erläutern. In den Parametern steht top für die Anzahl der Pixel von der Y-Achse nach unten, bottom für die Anzahl der Pixel von der Y-Achse nach unten, und left sowie right für die Anzahl der Pixel von der X-Achse nach rechts. Dabei ist top immer kleiner als bottom und left immer kleiner als right. Unten demonstrieren wir noch ein Beispiel: die Aufnahme eines 200x200-Bildes in der unteren rechten Ecke des Bildschirms. Sie müssen die Schnittstelle nur wie folgt aufrufen.

d.screenshot(60, bound=Bound(top=1920-200, bottom=1920, left=1080-200, right=1080)).save("screenshot.png")

Auf einen Punkt auf dem Bildschirm klicken

Mit der folgenden Schnittstelle können Sie einen Klick auf dem Bildschirm simulieren. Im Beispiel klicken wir auf den Punkt mit den Koordinaten 100,100 auf dem Bildschirm.

d.click(Point(x=100, y=100))

Punkt A antippen und zu Punkt B ziehen

Mit der folgenden Schnittstelle können Sie ein Objekt von Position A nach Position B ziehen, z. B. ein Symbol in einen Ordner ziehen.

A = Point(x=100, y=100)
B = Point(x=500, y=500)

d.drag(A, B)

Von Punkt A zu Punkt B wischen

Mit der folgenden Schnittstelle können Sie vom Koordinatenpunkt 100x100 auf dem Bildschirm zum Koordinatenpunkt 500x500 wischen.

A = Point(x=100, y=100)
B = Point(x=500, y=500)

d.swipe(A, B)

Komplexeres Wischen über mehrere Punkte

Die folgende Schnittstelle kann das Wischen über mehrere Punkte simulieren. Der folgende Aufruf wischt beispielsweise von 100x100 zu 500x500 und zurück zu 200x200. In der folgenden Demonstration werden nur drei Punkte gewischt, aber Sie können tatsächlich mehr Punkte angeben, um sogar ein Entsperrmuster zu realisieren.

p1 = Point(x=100, y=100)
p2 = Point(x=500, y=500)
p3 = Point(x=200, y=200)

d.swipe_points(p1, p2, p3)

Schnelleinstellungen öffnen

Der folgende Aufruf kann die Benachrichtigungsleiste auf dem Bildschirm öffnen, jedoch nur halb geöffnet.

d.open_quick_settings()

Benachrichtigungsleiste öffnen

Der folgende Aufruf kann die Benachrichtigungsleiste auf dem Bildschirm öffnen.

d.open_notification()

Seitenlayout abrufen

Der folgende Aufruf kann das XML-Layout der aktuellen Seite abrufen. Sie können es auch selbst parsen, um die XPath-Automatisierung zu unterstützen.

d.dump_window_hierarchy()
>>> result = d.dump_window_hierarchy()
>>> result
<lamda.types.BytesIO object at 0x7add660680>
>>> result.getvalue()
b'<?xml version=\'1.0\' encoding=\'UTF-8\' standalone=\'yes\' ?>\r\n<hierarchy rotation="0">\r\n  <node index="0" text="" resource-id="" class="android.widget.FrameLayout" package="com.android.systemui" content-desc="" checkable="false" checked="false" clickable="false"...

Auf stabilen Fensterzustand warten

Sie können den folgenden Aufruf ausführen, um darauf zu warten, dass sich das aktuelle Fenster in einem stabilen Zustand befindet, ähnlich wie implicitly_wait bei Selenium. Die Einheit des Parameters ist Millisekunden, 5*1000 bedeutet also 5 Sekunden zu warten. Die Umrechnungseinheit von Millisekunden in Sekunden ist 1000.

d.wait_for_idle(5*1000)

Letzten Toast abrufen

Sie können den folgenden Aufruf ausführen, um die letzte Toast-Nachricht im System abzurufen. Beachten Sie jedoch, dass nur Toast-Nachrichten unterstützt werden, die über die System-API gesendet werden. Nachrichten von Drittanbieter-Implementierungen, die Toast-ähnliche UIs verwenden, können nicht abgerufen werden.

d.get_last_toast()
>>> result = d.get_last_toast()
>>> print (result)
timestamp: 1700000000000
package: "com.android.settings"
message: "\346\202\250\345\267\262\345\244\204\344\272\216\345\274\200\345\217\221\350\200\205\346\250\241\345\274\217\357\274\214\346\227\240\351\234\200\350\277\233\350\241\214\346\255\244\346\223\215\344\275\234\343\200\202"
>>> print (result.message)
Sie sind bereits im Entwicklermodus, dieser Vorgang ist nicht erforderlich.