JavaFX Steuerung bzw. Test von externer JavaFX Anwendung (liegt nur als jar vor)

george

Mitglied
Hallo,
ich suche eine Lib oder ein Framework (am besten eigentlich Code Examples) wie ich mit Java respektive Python auf eine geöffnete JavaFX App unter Windows zugreifen und diese dann steuern bzw. testen kann.
Es ist eine externe App, die ich über ein jar File öffne.

Besser wäre natürlich ich öffne die externe Java App aus meinem Test Programm direkt selbst und kann es dann bedienen.

Ich habe schon diverse Beispiele im Netz gesucht und alles was mit Tests und Steuerung zu tun hat benötigt m.E. immer Code Zugriff
 
Y

yfons123

Gast
du hast halt das problem dass java in einer vm handelt dh die objekte die innerhalb bedeutung haben haben außerhalb keinerlei bedeutung


du kannst zb eine VM so einstellen dass sie grafik events an javafx sendet udn somit user input simuliert

aber wahrscheinlich hast du ein XY problem wo du versuchst für deine Lösung eine Lösung zu finden obwohl dein problem gazn woanders ist.. was willst du überhaupt machen

da javafx ja fxml hat könntest du mal schauen ob du da drüber was raus finden kannst über deine fern steuerung aber das ist blind geraten ob das geht
 

george

Mitglied
du hast halt das problem dass java in einer vm handelt dh die objekte die innerhalb bedeutung haben haben außerhalb keinerlei bedeutung


du kannst zb eine VM so einstellen dass sie grafik events an javafx sendet udn somit user input simuliert

aber wahrscheinlich hast du ein XY problem wo du versuchst für deine Lösung eine Lösung zu finden obwohl dein problem gazn woanders ist.. was willst du überhaupt machen

da javafx ja fxml hat könntest du mal schauen ob du da drüber was raus finden kannst über deine fern steuerung aber das ist blind geraten ob das geht
Eine *.fxml habe ich leider nicht. Es sei denn sie lässt sich über die *.jar Applikation generieren. Es ist ja nicht mein Projekt. Wenn ich diese hätte könnte ich mit den meisten TestFX Beispielen was anfangen.
ich habe nur die *.jar und kenne den String um die Anwendung über die Konsole zu starten.

Ich müsste eigentlich nur 2 Buttons automatisch bedienen.

WinAppDriverUI erkennt diese. Mein Ansatz würde im Moment in einem Robot Framework liegen.. Kann mir nur nicht vorstellen, dass es nur so geht.
 

KonradN

Super-Moderator
Mitarbeiter
Die Frage ist, was Du genau machen willst. Wenn die JavaFX Anwendung als jar vorliegt, dann hast Du natürlich alle Möglichkeiten, denn Du kannst alles in einem Java VM laufen lassen, d.h. Dein Test / Deine Automatisierung würde das jar einfach selbst anstarten. Damit hast Du generell alle Möglichkeiten, um das irgendwie zu beeinflussen.

Da bringen dann auch Libraries wie TestFX bestimmt noch einiges an interessanten Methoden und Möglichkeiten, aber zwingend notwendig ist das nicht einmal, denn man kann auch so extrem viel machen. Man muss nur aufpassen bezüglich der Threads und so - UI Controls mögen es generell nicht, wenn diese außerhalb des UI Threads verändert werden. (Platform.runLater ist da aber ja problemlos möglich!)

Dabei muss man man auch absolut nichts decompilieren oder so. Das kann zwar die Arbeit erleichtern, aber man kann auch ohne sowas vieles direkt sehen und heraus bekommen. (Man kann die Fenster identifizieren, Controls kann man auflisten, man kann sich Koordinaten der Controls auf dem Bildschirm geben lassen und und und ... Also auch trial and error kann schnell zielführend sein!)

Wenn man eine Applikation testen will, dann sollte man aber tieferes Wissen haben, denn dann geht es ja speziell darum, dass man bei neuen Versionen prüfen will, ob diese richtig funktioniert. Die Fernsteuerung unterscheidet sich davon - da wird eine bekannte Version einfach genutzt und fern gesteuert. Der Unterschied ist halt zum einen bei der Behandlung von Fehlern (Beim Test ist es: Ups, Fehler im Programm und bei der Automatisierung: Ups, bei neuer Version funktioniert etwas nicht) und auch bei der Fehlerchance: Test wird nur bei neuen Versionen gemacht (Normalfall: Neue Version) und bei der Automatisierung ist die neue Version der Sonderfall: Bei Aktualisierung von Software sind ggf. Anpassungen notwendig.)
 
Y

yfons123

Gast
Die Frage ist, was Du genau machen willst. Wenn die JavaFX Anwendung als jar vorliegt, dann hast Du natürlich alle Möglichkeiten, denn Du kannst alles in einem Java VM laufen lassen, d.h. Dein Test / Deine Automatisierung würde das jar einfach selbst anstarten. Damit hast Du generell alle Möglichkeiten, um das irgendwie zu beeinflussen.

Da bringen dann auch Libraries wie TestFX bestimmt noch einiges an interessanten Methoden und Möglichkeiten, aber zwingend notwendig ist das nicht einmal, denn man kann auch so extrem viel machen. Man muss nur aufpassen bezüglich der Threads und so - UI Controls mögen es generell nicht, wenn diese außerhalb des UI Threads verändert werden. (Platform.runLater ist da aber ja problemlos möglich!)

Dabei muss man man auch absolut nichts decompilieren oder so. Das kann zwar die Arbeit erleichtern, aber man kann auch ohne sowas vieles direkt sehen und heraus bekommen. (Man kann die Fenster identifizieren, Controls kann man auflisten, man kann sich Koordinaten der Controls auf dem Bildschirm geben lassen und und und ... Also auch trial and error kann schnell zielführend sein!)

Wenn man eine Applikation testen will, dann sollte man aber tieferes Wissen haben, denn dann geht es ja speziell darum, dass man bei neuen Versionen prüfen will, ob diese richtig funktioniert. Die Fernsteuerung unterscheidet sich davon - da wird eine bekannte Version einfach genutzt und fern gesteuert. Der Unterschied ist halt zum einen bei der Behandlung von Fehlern (Beim Test ist es: Ups, Fehler im Programm und bei der Automatisierung: Ups, bei neuer Version funktioniert etwas nicht) und auch bei der Fehlerchance: Test wird nur bei neuen Versionen gemacht (Normalfall: Neue Version) und bei der Automatisierung ist die neue Version der Sonderfall: Bei Aktualisierung von Software sind ggf. Anpassungen notwendig.)
Eine *.fxml habe ich leider nicht. Es sei denn sie lässt sich über die *.jar Applikation generieren. Es ist ja nicht mein Projekt. Wenn ich diese hätte könnte ich mit den meisten TestFX Beispielen was anfangen.
ich habe nur die *.jar und kenne den String um die Anwendung über die Konsole zu starten.

Ich müsste eigentlich nur 2 Buttons automatisch bedienen.
es geht überhaupt nicht ums testen?
 

KonradN

Super-Moderator
Mitarbeiter
es geht überhaupt nicht ums testen?
Da hier ja evtl. auch andere über diesen Thread kommen können und im Titel halt "Steuerung bzw. Test" steht, habe ich allgemein geantwortet. Es sollte aus meiner Sicht relativ problemlos möglich sein. Das jar File ist vorhanden. Da kann man also die main Methode aufrufen und das sollte die JavaFX Anwendung starten.

Und man sollte - das habe ich noch nicht probiert - mittels Windows.getWindows() an alle Fenster kommen und das dürfte dann auch die Stage (erbt ja von Window) enthalten, die da geöffnet wurde. (Maximal mal schauen welche JavaFX Version verwendet wurde - getWindows gab es noch nicht immer ... nicht dass es daran scheitert. Aber dann findet man andere Wege. Wir sind in der JavaVM und haben auf alles Zugriff! Im Worst Case haben wir noch etwas mit Reflection zu arbeiten und müssen uns ggf. doch noch an ein / zwei Stellen etwas einhacken. ich kenne TestFX nicht, aber es gibt genug Tools, die da massiv unterstützen können.

Man kann da also relativ einfach mit relativ wenig Mitteln sehr viel machen. Das habe ich aufgezeigt und um mehr ging es mir nicht.
 

george

Mitglied
Und man sollte - das habe ich noch nicht probiert - mittels Windows.getWindows() ...
Hallo. Erstmal vielen Dank auch für deinen Input.
es geht überhaupt nicht ums testen?
Wahrscheinlich doch :). Deswegen wäre dekompilieren und irgendwas einfügen nur ne Not-Lösung.

Ich gehe aber nicht ganz mit, dass man tieferes Wissen benötigt. (Komponententest ja, höheres Level nicht unbedingt)
Ich automatisiere auf Systemtest-Ebene und muss deswegen die Java AP erstmal nur bedienen können. Ich hatte aber trotzdem erstmal nach was gesucht, um nicht mit einem beliebigen Roboter den Punkt x,y ansteuern zu müssen (Anfällig gegenüber Auflösung, Focus etc.).
Das Robot Framework TestFX Library soll wohl ein Wrapper-Projekt sein. Habe es aber bisher nicht ausprobieren können.

TestFx ist leider nicht für Level Systemteste-Ebene gedacht. Ich habe da trotzdem erstmal eine hinreichend genügende Lösung gefunden und das Glück, dass ich nur Buttons bedienen muss deren ID ich kenne.

Hier erstmal eine Lösung für eine App, die was dazu:

Java:
//Main starter class from external *.jar
import de.external.StartApplication;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.testfx.api.FxToolkit;
import org.testfx.framework.junit.ApplicationTest;

import static org.testfx.api.FxAssert.verifyThat;
import static org.testfx.api.FxToolkit.setupApplication;

public class ExternalAppTest extends ApplicationTest {
 
@Before
    public void setUp() throws Exception {
        // before test class:
        Stage stage = FxToolkit.registerPrimaryStage();
        //...
        String applicationArgs = "";

        System.setProperty("user.home", userprofile + "\\AppData\\Local\\Temp");
  
        // Start the app
        Application app = setupApplication(StartApplication.class, applicationArgs);

        // Give time to start app
        Thread.sleep(3000);
    }

    @Test
    public void doSomthing() {
        clickOn("Button1");
        clickOn("Button2");
    }
}

Wenn der Test aufgerufen wird, wird zuvor die App gestartet und die beiden Buttons können geklickt werden.

Was war nötig:
  • Jar muss vorliegen und Main.class muss bekannt sein
  • Externe App in das Projekt integrieren (*.jar und alle abhängigen Libs von de App)
  • IDs/Nodes der zu bedienenden Elemente müssen bekannt sein.
1. Was ich nicht verstehe: Ich kann theoretisch meine Argumente alle in setupApplication() setzen, dies funktioniert bei mir aber nicht. Workaround ist System.setProperty().
2. Die App wird immer nach dem Test beendet. Ich würde sie gerne offen lassen.
 
Zuletzt bearbeitet:

george

Mitglied
Ich hatte Glück die Nodes/Ids zu kenne. Ich habe mal Scenic View ausprobiert, um mir die restlichen Elemente anzugucken. Leider ist das Programm sehr instabiel und zeigt mir bei IDs nur null an. Die Buttons werden scheinbar an ihrem Text erkannt.

Für einen guten Workflow müsste ich nun doch gerne auf ein paar mehr Dinge zugreifen.
Wenn ich denn schon Zugriff auf Application, Stage und Scene habe. Müsste ich nicht irgendwie Zugriff auf alle elemente bekommen? Scene View schafft es ja auch diese zu entschlüsseln.
Ich bin leider nicht so fit an der Stelle den Zugriff nachzuverfolgen. Wüsste jemand eine Lösung auf eine JAvaFX Element zuzugriefen ohne der Node/Id zu erkennen. Eine Notlösung wäre ja auch schon Zugriff über Position/Klassentyp innerhalb des App-Fensters.
 

KonradN

Super-Moderator
Mitarbeiter
Über die Stage hast Du Zugriff auf alle Elemente der Stage. Eine Stage hat eine Scene, daher ist getScene hier der erste Schritt.
Eine Scene hat einen root Node -> getRoot()

Ab dem Punkt hast Du nur noch die JavaFX Controls, die alle von Node erben. Elemente, die auch Child-Elemente haben, erben von Parent.

Somit kannst Du alle Elemente durchgehen um das zu finden, das Du brauchst.

1. Was ich nicht verstehe: Ich kann theoretisch meine Argumente alle in setupApplication() setzen, dies funktioniert bei mir aber nicht. Workaround ist System.setProperty().
Mit TestFX habe ich bisher keine Erfahrungen gesammelt. Daher kann ich dazu erst einmal nicht viel sagen.

2. Die App wird immer nach dem Test beendet. Ich würde sie gerne offen lassen.
Dein Test ist die App. Es findet kein eigener Start der App statt. Was man hier also maximal schauen muss, ist die Frage, was das verwendete Toolkit so macht. Vielleicht brauchst Du das Toolkit auch gar nicht wirklich oder nur in geringeren Teilen. Die Mittel, mit denen sowas geht, sind ja nicht weiter komplex und wurden auch schon etwas aufgezeigt.

So einen Button auszulösen könnte über ein einfaches button.fire() gehen - das ist also nichts, das irgendwas kompliziertes braucht.

Der Vorteil einer so einfachen Lösung ist, dass Du die volle Kontrolle hast. Das läuft halt einfach mit und ist von den Ressourcen her so minimal, dass es nicht stören dürfte.

Und der Start erfolgt auch einfach über die main Methode, die Du halt aufrufst und da ist dann klar, dass Du die Kommandozeilenparameter angeben kannst, die Du haben willst.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Javafx KeyPressed Steuerung AWT, Swing, JavaFX & SWT 2
D JinternaFrame Steuerung in JDesktopPane AWT, Swing, JavaFX & SWT 5
D Swing JTree Steuerung AWT, Swing, JavaFX & SWT 11
O Applet-Steuerung mit Tastaturbefehlen AWT, Swing, JavaFX & SWT 3
N Herkunft des Fokus erkennbar (via Klick oder Tab-Steuerung)? AWT, Swing, JavaFX & SWT 4
B Eine Alternative zur Steuerung einer ProgressBar? AWT, Swing, JavaFX & SWT 5
T GUI Steuerung (mehrere Panels) AWT, Swing, JavaFX & SWT 5
T Frage zur GUI Steuerung AWT, Swing, JavaFX & SWT 2
H steuerung durch jtree AWT, Swing, JavaFX & SWT 4
N Swing Mocken von JOptionPane im JUnit-Test AWT, Swing, JavaFX & SWT 3
W JavaFX GUI Test Framework AWT, Swing, JavaFX & SWT 4
T SWT SWTBot Test: Dialog soll sich öffnen,wenn button gedrückt AWT, Swing, JavaFX & SWT 3
7 AWT problem: KeyListener/ test im Label umändern AWT, Swing, JavaFX & SWT 4
S Multiple Choice Test AWT, Swing, JavaFX & SWT 2
T [LWJGL] Depth-Test? AWT, Swing, JavaFX & SWT 2
P Swing Test ob Tabellenspalte sortiert ist AWT, Swing, JavaFX & SWT 6
D JTables, Test highlighten innerhalb einer Zelle AWT, Swing, JavaFX & SWT 5
S Binär Test AWT, Swing, JavaFX & SWT 3
G Test, ob Fenster sichtbar? AWT, Swing, JavaFX & SWT 2
A Automatisierter Test von Swing GUIs AWT, Swing, JavaFX & SWT 3
T SWT Externer zugrif auf SWT Komponenten AWT, Swing, JavaFX & SWT 3
F Swing ImageIcons von externer Quelle (relativ) AWT, Swing, JavaFX & SWT 6
D Panel aus externer Klasse holen AWT, Swing, JavaFX & SWT 2
A Paint Methode externer auruf AWT, Swing, JavaFX & SWT 5
S AWT Arrays in externer jTable Klasse ausgeben AWT, Swing, JavaFX & SWT 3
P JMenu-Erweiterung in externer Datei AWT, Swing, JavaFX & SWT 5
B In externer Eventhandlerklasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
M Probleme mit JFrame und nicht angezeigter externer Klasse AWT, Swing, JavaFX & SWT 8
J Aufruf externer Quellen aus java AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben