Blog

JavaScript Days | Angular Days | React Days | HTML & CSS Days
Die großen Trainingsevents für JavaScript, Angular, React, HTML & CSS
20
Aug

Maus und Tastatur kontrollieren und Aufgaben automatisieren Node.js-Module: RobotJS

Sebastian Springer

Desktopsysteme mit Node.js steuern – das klingt auf den ersten Blick etwas exotisch. Auf den zweiten Blick macht diese Idee aber erstaunlich viel Sinn, denn Node.js wurde ursprünglich als Plattform für Webapplikationen konzipiert.

Mittlerweile basieren die meisten Werkzeuge für die Webentwicklung auf Node.js. Prominente Beispiele sind Paketmanager wie npm und Yarn, Buildwerkzeuge wie webpack und Babel sowie zahlreiche weitere Werkzeuge. Die überwiegende Anzahl dieser Werkzeuge sind Kommandozeilenapplikationen. Was nicht weiter verwunderlich ist, da sie häufig automatisiert im Buildprozess ausgeführt werden. Doch das Einsatzgebiet von Node.js endet nicht im Web und auf der Konsole. Auch auf Desktopsystemen findet sich die JavaScript-Plattform immer häufiger. So kommt Node.js als Herzstück von Electron zum Einsatz, einer Plattform zur Entwicklung von Desktopapplikationen. Node.js hat sich damit auf nahezu allen denkbaren Umgebungen etabliert. Es ist also kaum verwunderlich, dass Node.js auch zur Steuerung und Automatisierung von grafischen Oberflächen verwendet werden kann. Mit RobotJS existiert ein Projekt, das genau das versucht. Mit diesem Paket können Sie mit Node.js die Kontrolle über Maus, Tastatur und Bildschirm übernehmen und somit bestimmte Aufgaben automatisieren.

Installation und grundlegende Verwendung

RobotJS wird wie jedes Node.js-Paket über einen Paketmanager wie beispielsweise npm oder Yarn installiert und kann anschließend in einem Skript verwendet werden. Die Installation erfolgt über das Kommando npm install robotjs. Das Projekt befindet sich momentan in der Version 0.6.0 und ist laut seiner Entwickler noch nicht zu 100 Prozent stabil. Was bedeutet, dass sich die Schnittstellen und Methoden mit neueren Versionen auch noch ändern können.

Wie schon erwähnt lässt Sie RobotJS die Kontrolle über die Maus des Systems übernehmen. So bewegt die moveMouse-Funktion beispielsweise den Mauszeiger zu den angegebenen Koordinaten. So können Sie beispielsweise ein Skript schreiben, das das aktuelle Konsolenfenster schließt. Alles, was Sie dafür tun müssen, ist die Position des Schließen-Buttons herauszufinden. Nehmen wir als konkretes Beispiel das Schließen eines maximierten Konsolenfensters auf einem MacOS-Systems. Mit den Koordinaten 15/35 erreichen Sie den Schließen-Button und können ihn mit einem Klick betätigen. Das folgende Skript sorgt für das Schließen des Fensters:

const robot = require('robotjs');
 
robot.moveMouseSmooth(15, 35);
robot.mouseClick();

Speichern Sie den Quellcode in einer Datei mit dem Namen index.js, können Sie ihn mit dem Kommando node index.js ausführen. RobotJS bewegt die Maus auf die angegebenen Koordinaten und löst das Klick-Event auf dem System aus. Ein solches Skript stellt ein potenzielles Sicherheitsrisiko dar. Aus diesem Grund müssen Sie die Ausführung auf dem System zunächst erlauben. RobotJS schließt das aktuelle Konsolenfenster, in dem ein Node.js-Prozess, die RobotJS-Applikation, ausgeführt wird. Das System fragt vor dem Schließen des Fensters über ein Dialogfenster nach, ob der Prozess abgebrochen werden soll. Das Schließen funktioniert also mit dem Skript noch nicht ganz. Aber Sie sehen hier schon, welche Möglichkeiten Ihnen RobotJS bietet.

Kontrolle über die Tastatur

Ähnlich wie mit der Maus können Sie auch mit der Tastatur verfahren. Im vorherigen Beispiel haben Sie versucht, das aktuelle Fenster zu schließen und wurden von einem Bestätigungsdialog aufgehalten. Sie hätten an dieser Stelle natürlich die Möglichkeit, die Koordinaten des Bestätigen-Buttons herauszufinden und die entsprechende Stelle anzuklicken. Alternativ dazu können Sie aber auch einfach die ENTER-Taste betätigen, um den Dialog und damit das Fenster zu schließen. RobotJS stellt Ihnen hierfür die keyTap-Funktion zur Verfügung. Dieser Funktion übergeben Sie den KeyCode der Taste, die betätigt werden soll; in unserem Fall ist dies die Zeichenkette enter. Führen Sie anschließend das Skript mit dem Kommando node index.js aus, wird das Fenster geschlossen. Hier finden Sie den zugehörigen Quellcode:

const robot = require('robotjs');
 
robot.moveMouseSmooth(15, 35);
robot.mouseClick();
robot.keyTap('enter');

Weitere Möglichkeiten der Bedienung

Wo die moveMouse den Mauszeiger direkt auf die angegebene Position setzt, verschiebt die moveMouse-Smooth-Funktion den Mauszeiger, als würde sich die Maus selbst bewegen. Hiermit wird ein Effekt erzeugt, als würde eine Person die Kontrolle übernehmen. Mit RobotJS können Sie der mouseClick-Funktion als erstes Argument auch den Button übergeben, der geklickt werden soll. Der Wert wird als Zeichenkette mit den Werten leftmiddle oder right übergeben. Der Standardwert ist left. Als zweites Argument können Sie angeben, ob es sich um einen einfachen Klick oder einen Doppelklick handeln soll.

Auch bei den Tastatureingaben haben Sie noch eine Reihe weiterer Möglichkeiten, die über das reine Drücken einer Taste hinausgehen. Zu den Funktionen, die Sie wahrscheinlich am häufigsten benötigen, gehört typeString. Wo keyTap nur eine Taste zu einem bestimmten Zeitpunkt betätigen kann, können Sie der typeString-Funktion eine Zeichenkette übergeben, die dann eingegeben wird. Gerade beim Ausfüllen von Formularen oder ähnlichen Aktionen ist das hilfreich und spart enorm viel Zeit.

Sowohl bei der Tastatur- als auch bei der Mausbedienung können Sie mit Verzögerungen arbeiten. Das kann erforderlich werden, wenn Sie der Applikation oder dem System, das Sie automatisieren, kurz Zeit zum Reagieren geben möchten. Die Standardverzögerung beträgt sowohl bei der Tastatur als auch bei der Maus 10 Millisekunden und kann mit der Funktion setMouseDelay beziehungsweise setKeyboardDelay definiert werden. Diese Zeitspanne gibt die Wartezeit nach dem Auslösen des jeweiligen Events an.

Zugriff auf den Bildschirm

Die Arbeit mit der grafischen Ausgabe des Systems ist der dritte Bereich, mit dem Sie in RobotJS in Berührung kommen. Nach Angaben der Entwickler ist hier noch am meisten zu tun. Mit den Funktionen getPixelColor und getScreenSize können Sie zwei visuelle Informationen auslesen. Die Funktion getPixelColor liefert die Farbe des über die x- und y-Koordinaten angegebenen Pixels auf dem Bildschirm. Die getScreenSize-Funktion gibt, wie der Name vermuten lässt, die Größe des Bildschirms in Form eines Objekts mit einer width– und einer height-Eigenschaft zurück.

Der vielleicht spannendste, jedoch bis jetzt am wenigsten fertiggestellte Teil der Bildschirmkontrolle ist die Methode screen.capture. Mit ihr können Sie einen Ausschnitt des Bildschirms aufnehmen, mit der Sie dann weiterarbeiten. Als Rückgabewert der Methode erhalten Sie ein Bitmap-Objekt, mit dem Sie bis jetzt nur die Farbe eines bestimmten Pixels auslesen können. Der Plan für die weitere Entwicklung sieht hier jedoch vor, dass die Aufnahme als Bilddatei auf der Festplatte gespeichert werden kann.

Fazit

RobotJS ist entstanden, weil sein Schöpfer ein bekennender Freund der AutoHotkey-Applikation für Windows ist. Mit diesem Programm lassen sich bestimmte Aufgaben automatisieren. Es existiert allerdings keine Portierung für MacOS, also entwickelte Jason Stallings kurzerhand seine eigene Lösung, die sowohl MacOS als auch Windows und Linux unterstützt. Kleinere Aufgaben wie beispielsweise das Steuern der Maus oder die Betätigung der Tastatur funktionieren problemlos und zeigen eindrucksvoll, wofür Node.js außerhalb von Web- und Konsolenapplikationen noch verwendet werden kann.

Die Stärke von RobotJS liegt in der Möglichkeit, Funktionen in einem Node.js-Skript mit Programmlogik kombinieren zu können. So können Sie beispielsweise in einem bestimmten Bereich des Bildschirms nach einem roten Pixel suchen, der für den Schließen-Button eines Fensters steht. Sobald Sie einen solchen roten Pixel gefunden haben, können Sie darauf klicken, um das Fenster zu schließen. Solche Logikblöcke können Sie wiederum in eigene Funktionen und Klassen sowie Module kapseln und damit auch komplexere Aufgaben lösen.

Immer auf dem Laufenden bleiben!
Alle News & Updates: