From b844b69c2acf1c4f421780c0ced30b223034c3c8 Mon Sep 17 00:00:00 2001 From: Ext Haavisto Jukka Date: Fri, 12 Oct 2018 12:13:39 +0300 Subject: [PATCH 01/59] 0.5.2-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index 43341a4..372bf1d 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.robotframework javafxlibrary jar - 0.5.1 + 0.5.2-SNAPSHOT UTF-8 From 7e50b03478a62f0df478240bfa0a438bd65ff67b Mon Sep 17 00:00:00 2001 From: Sami Pesonen Date: Fri, 12 Oct 2018 14:23:46 +0300 Subject: [PATCH 02/59] update README to have Maven Central link for releases --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index fc81a4a..e6b25a7 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ See keyword [documentation](https://eficode.github.io/JavaFXLibrary/javafxlibrar ## Taking the library into use ### As a local library -1. Download JavaFXLibrary jar file from [releases](https://github.com/eficode/JavaFXLibrary/releases/) +1. Download JavaFXLibrary jar file from [releases](https://github.com/eficode/JavaFXLibrary/releases/) or [Maven Central](https://search.maven.org/artifact/org.robotframework/javafxlibrary). 2. Import JavaFXLibrary in test settings: ``` *** Settings *** @@ -23,7 +23,7 @@ jython -J-cp javafxlibrary-.jar -m robot.run tests.robot ``` ### As a remote library -1. Download JavaFXLibrary jar file from [releases](https://github.com/eficode/JavaFXLibrary/releases/) +1. Download JavaFXLibrary jar file from [releases](https://github.com/eficode/JavaFXLibrary/releases/) or [Maven Central](https://search.maven.org/artifact/org.robotframework/javafxlibrary). 2. Start JavaFXLibrary as a remote library: `java -jar javafxlibrary-.jar` - Remote library starts in port [8270](http://localhost:8270) by default. - Port number can also be defined in the start command: `java -jar javafxlibrary-.jar 1234` From 5d5b945b2c97f286a33ae2668f40fdb6d98b7656 Mon Sep 17 00:00:00 2001 From: Pasi Saikkonen Date: Mon, 5 Nov 2018 17:12:35 +0200 Subject: [PATCH 03/59] Add instructions for enabling accessibility features on MacOS Mojave --- README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/README.md b/README.md index e6b25a7..dee4a32 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,16 @@ JavaFXLibrary is tested to work with Robot Framework 3.0.2 or later. See keyword [documentation](https://eficode.github.io/JavaFXLibrary/javafxlibrary.html). ## Taking the library into use +### On MacOS Mojave +MacOS Mojave introduced changes to security settings and disabled some of the features JavaFXLibrary uses by default. +To use JavaFXLibrary on MacOS Mojave you must enable the accessibility features for terminal in system preferences: +- Navigate to `Apple menu > System Preferences > Security & Privacy > Privacy > Accessibility`. +- Click the lock and enter your password to change these settings +- If terminal has requested accessibility features before, it should show in the list +- If not, add it by clicking :heavy_plus_sign: and selecting `Applications > Utilities > Terminal` +- Enable accessibility features by checking the box +- :white_check_mark: Terminal + ### As a local library 1. Download JavaFXLibrary jar file from [releases](https://github.com/eficode/JavaFXLibrary/releases/) or [Maven Central](https://search.maven.org/artifact/org.robotframework/javafxlibrary). 2. Import JavaFXLibrary in test settings: From e047c4c987be3a259da7d5b1a99e600cbde44ce7 Mon Sep 17 00:00:00 2001 From: Pasi Saikkonen Date: Mon, 5 Nov 2018 17:27:14 +0200 Subject: [PATCH 04/59] Adjust readme --- README.md | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index dee4a32..9d5acd1 100644 --- a/README.md +++ b/README.md @@ -10,16 +10,6 @@ JavaFXLibrary is tested to work with Robot Framework 3.0.2 or later. See keyword [documentation](https://eficode.github.io/JavaFXLibrary/javafxlibrary.html). ## Taking the library into use -### On MacOS Mojave -MacOS Mojave introduced changes to security settings and disabled some of the features JavaFXLibrary uses by default. -To use JavaFXLibrary on MacOS Mojave you must enable the accessibility features for terminal in system preferences: -- Navigate to `Apple menu > System Preferences > Security & Privacy > Privacy > Accessibility`. -- Click the lock and enter your password to change these settings -- If terminal has requested accessibility features before, it should show in the list -- If not, add it by clicking :heavy_plus_sign: and selecting `Applications > Utilities > Terminal` -- Enable accessibility features by checking the box -- :white_check_mark: Terminal - ### As a local library 1. Download JavaFXLibrary jar file from [releases](https://github.com/eficode/JavaFXLibrary/releases/) or [Maven Central](https://search.maven.org/artifact/org.robotframework/javafxlibrary). 2. Import JavaFXLibrary in test settings: @@ -44,6 +34,15 @@ Library Remote http://127.0.0.1:8270 WITH NAME JavaFXLibrary ``` 4. Run your tests: `robot tests.robot` +## Using JavaFXLibrary on macOS Mojave +MacOS Mojave introduced changes to security settings and disabled some of the features JavaFXLibrary uses by default. +To use JavaFXLibrary on macOS Mojave you must enable the accessibility features for terminal in system preferences: +- Navigate to `Apple menu > System Preferences > Security & Privacy > Privacy > Accessibility` +- Click the lock and enter your password to change these settings +- If terminal has requested accessibility features before it should show in the list +- If not, add it by clicking :heavy_plus_sign: and selecting `Applications > Utilities > Terminal` +- Enable accessibility features by checking the box: :white_check_mark: Terminal + ## Identifying JavaFX UI objects [Scenic View](http://fxexperience.com/scenic-view/) is a tool that allows you to inspect the JavaFX application scenegraph. This can be useful especially when you do not have access to the source code. From c4d819d32a3455bece2eab0e76dbd14acc9f699f Mon Sep 17 00:00:00 2001 From: Pasi Saikkonen Date: Fri, 9 Nov 2018 15:32:22 +0200 Subject: [PATCH 05/59] Get FxRobotContext from the active sessionRobot in TestFxAdapter --- pom.xml | 5 ----- .../keywords/AdditionalKeywords/Verifiers.java | 4 ++-- .../keywords/Keywords/ScreenCapturing.java | 6 +++--- src/main/java/javafxlibrary/utils/Session.java | 7 +++---- .../javafxlibrary/utils/TestFxAdapter.java | 18 +++++------------- 5 files changed, 13 insertions(+), 27 deletions(-) diff --git a/pom.xml b/pom.xml index 372bf1d..72ac47c 100644 --- a/pom.xml +++ b/pom.xml @@ -317,11 +317,6 @@ testfx-core 4.0.14-alpha - - org.testfx - testfx-junit - 4.0.14-alpha - org.testfx openjfx-monocle diff --git a/src/main/java/javafxlibrary/keywords/AdditionalKeywords/Verifiers.java b/src/main/java/javafxlibrary/keywords/AdditionalKeywords/Verifiers.java index f9b0c16..fa48610 100644 --- a/src/main/java/javafxlibrary/keywords/AdditionalKeywords/Verifiers.java +++ b/src/main/java/javafxlibrary/keywords/AdditionalKeywords/Verifiers.java @@ -252,7 +252,7 @@ public void imagesShouldMatch(Image image1, Image image2, double percentage) { throw new JavaFXLibraryNonFatalException("Images must be same size to compare: Image1 is " + (int)image1.getWidth() + "x" + (int)image1.getHeight() + " and Image2 is " + (int)image2.getWidth() + "x" + (int)image2.getHeight()); - PixelMatcherResult result = robotContext.getCaptureSupport().matchImages(image1, image2, new PixelMatcherRgb()); + PixelMatcherResult result = robotContext().getCaptureSupport().matchImages(image1, image2, new PixelMatcherRgb()); int sharedPixels = (int) (result.getMatchFactor() * 100); RobotLog.info("Matching pixels: " + sharedPixels + "%"); @@ -280,7 +280,7 @@ public void imagesShouldNotMatch(Image image1, Image image2, double percentage) throw new JavaFXLibraryNonFatalException("Images must be same size to compare: Image1 is " + (int)image1.getWidth() + "x" + (int)image1.getHeight() + " and Image2 is " + (int)image2.getWidth() + "x" + (int)image2.getHeight()); - PixelMatcherResult result = robotContext.getCaptureSupport().matchImages(image1, image2, new PixelMatcherRgb()); + PixelMatcherResult result = robotContext().getCaptureSupport().matchImages(image1, image2, new PixelMatcherRgb()); int nonSharedPixels = (int) (result.getNonMatchFactor() * 100); RobotLog.info("Matching pixels: " + nonSharedPixels + "%"); diff --git a/src/main/java/javafxlibrary/keywords/Keywords/ScreenCapturing.java b/src/main/java/javafxlibrary/keywords/Keywords/ScreenCapturing.java index d855160..ce546dd 100644 --- a/src/main/java/javafxlibrary/keywords/Keywords/ScreenCapturing.java +++ b/src/main/java/javafxlibrary/keywords/Keywords/ScreenCapturing.java @@ -86,7 +86,7 @@ public Object captureImage(Object locator, boolean logImage){ try { image = robot.capture(targetBounds).getImage(); Path path = createNewImageFileNameWithPath(); - robotContext.getCaptureSupport().saveImage(image, path); + robotContext().getCaptureSupport().saveImage(image, path); if (logImage) { Double printSize = targetBounds.getWidth() > 800 ? 800 : targetBounds.getWidth(); @@ -94,7 +94,7 @@ public Object captureImage(Object locator, boolean logImage){ if(TestFxAdapter.logImages.toLowerCase().equals("embedded")) { Image resizedImage = resizeImage(image, path); Path tempPath = Paths.get(getCurrentSessionScreenshotDirectory(), "temp.png"); - robotContext.getCaptureSupport().saveImage(resizedImage, tempPath); + robotContext().getCaptureSupport().saveImage(resizedImage, tempPath); File imageFile = convertToJpeg(tempPath); byte[] imageBytes = IOUtils.toByteArray(new FileInputStream(imageFile)); @@ -157,7 +157,7 @@ public Object loadImageFromUrl(String url) { public void saveImageAs(Image image, String path) { try { RobotLog.info("Saving image \"" + image + "\" to path \"" + path + "\""); - robotContext.getCaptureSupport().saveImage(image, Paths.get(path)); + robotContext().getCaptureSupport().saveImage(image, Paths.get(path)); } catch (Exception e) { if(e instanceof JavaFXLibraryNonFatalException) throw e; diff --git a/src/main/java/javafxlibrary/utils/Session.java b/src/main/java/javafxlibrary/utils/Session.java index 45b78a5..5554031 100644 --- a/src/main/java/javafxlibrary/utils/Session.java +++ b/src/main/java/javafxlibrary/utils/Session.java @@ -24,14 +24,13 @@ import javafxlibrary.exceptions.JavaFXLibraryNonFatalException; import org.testfx.api.FxRobot; import org.testfx.api.FxToolkit; -import org.testfx.framework.junit.ApplicationTest; import javax.swing.*; import java.awt.*; import java.awt.event.WindowEvent; import java.util.concurrent.TimeoutException; -public class Session extends ApplicationTest { +public class Session { public Stage primaryStage; public FxRobot sessionRobot; @@ -40,7 +39,7 @@ public class Session extends ApplicationTest { public String screenshotDirectory = null; public Session(String appName, String... appArgs) { - try{ + try { // start the client this.primaryStage = FxToolkit.registerPrimaryStage(); this.sessionApplication = FxToolkit.setupApplication((Class)Class.forName(appName), appArgs); @@ -88,7 +87,7 @@ public void closeApplication() { sessionRobot.release(new KeyCode[] {}); sessionRobot.release(new MouseButton[] {}); FxToolkit.cleanupApplication(sessionApplication); - } catch (Exception e){ + } catch (Exception e) { throw new JavaFXLibraryNonFatalException("Problem shutting down the application: " + e.getMessage(), e); } } diff --git a/src/main/java/javafxlibrary/utils/TestFxAdapter.java b/src/main/java/javafxlibrary/utils/TestFxAdapter.java index 4ce01d9..9d79ce7 100644 --- a/src/main/java/javafxlibrary/utils/TestFxAdapter.java +++ b/src/main/java/javafxlibrary/utils/TestFxAdapter.java @@ -35,12 +35,6 @@ public static void setRobot(FxRobotInterface robot) { } public static FxRobotInterface getRobot() { return robot; } - // current robot context - protected static FxRobotContext robotContext; - public static void setRobotContext(FxRobotContext context) { - TestFxAdapter.robotContext = context; - } - // TODO: consider adding support for multiple sessions private static Session activeSession = null; @@ -62,14 +56,12 @@ in their start method for the controller class to load properly */ } setRobot(activeSession.sessionRobot); - setRobotContext(activeSession.robotContext()); } public void createNewSession(Application application) { activeSession = new Session(application); setRobot(activeSession.sessionRobot); - setRobotContext(activeSession.robotContext()); } public void deleteSession() { @@ -95,17 +87,17 @@ public String getCurrentSessionScreenshotDirectory() { public void setCurrentSessionScreenshotDirectory(String dir){ - if(activeSession != null) { + if (activeSession != null) { File errDir = new File(dir); - if(!errDir.exists()) + if (!errDir.exists()) errDir.mkdirs(); activeSession.screenshotDirectory = dir; - } - else + } else { throw new JavaFXLibraryNonFatalException("Unable to set screenshot directory, no application is currently open!"); + } } public static FxRobotContext robotContext() { - return robotContext; + return activeSession.sessionRobot.robotContext(); } } From dbb7cc92893bf95681d737b207242967c04b6e7a Mon Sep 17 00:00:00 2001 From: Juho Saarinen Date: Tue, 13 Nov 2018 09:51:54 +0200 Subject: [PATCH 06/59] Prevent conflicts with Commons by shading it --- pom.xml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/pom.xml b/pom.xml index 72ac47c..88db914 100644 --- a/pom.xml +++ b/pom.xml @@ -272,6 +272,10 @@ com.google.common shaded.com.google.common + + org.apache.commons + shaded.org.apache.commons + From e81d02bbc60c4c70e69cf1c434ac0f5089bdc084 Mon Sep 17 00:00:00 2001 From: Pasi Saikkonen Date: Fri, 16 Nov 2018 14:18:42 +0200 Subject: [PATCH 07/59] Add keyword Launch Swing Application In Separate Thread --- .../ApplicationLauncher.java | 36 ++++++++++++++----- .../javafxlibrary/utils/HelperFunctions.java | 22 ++++++++++++ 2 files changed, 50 insertions(+), 8 deletions(-) diff --git a/src/main/java/javafxlibrary/keywords/AdditionalKeywords/ApplicationLauncher.java b/src/main/java/javafxlibrary/keywords/AdditionalKeywords/ApplicationLauncher.java index 5485539..1e8c896 100644 --- a/src/main/java/javafxlibrary/keywords/AdditionalKeywords/ApplicationLauncher.java +++ b/src/main/java/javafxlibrary/keywords/AdditionalKeywords/ApplicationLauncher.java @@ -31,6 +31,7 @@ import java.net.URLClassLoader; import java.util.*; +import static javafxlibrary.utils.HelperFunctions.createThreadedWrapperApplication; import static javafxlibrary.utils.HelperFunctions.createWrapperApplication; import static javafxlibrary.utils.HelperFunctions.getMainClassFromJarFile; @@ -66,21 +67,40 @@ public void launchJavafxApplication(String appName, String... appArgs) { @ArgumentNames({"appName", "*args"}) public void launchSwingApplication(String appName, String... appArgs) { RobotLog.info("Starting application:" + appName); - Class c; + Class c = getMainClass(appName); + Application app = createWrapperApplication(c, appArgs); + createNewSession(app); + RobotLog.info("Application: " + appName + " started."); + } + + @RobotKeyword("Creates a wrapper application the same way as in `Launch Swing Application`, but starts it in a new " + + "thread. This is required when main method of the test application is blocked and execution does not " + + "return after calling it until the application gets closed. Be sure to set the library timeout with " + + "`Set Timeout` so that the test application will have enough time to load, as the test execution will " + + "continue instantly after calling the main method.\n\n" + + "``appName`` is the name of the application to launch. \n\n" + + "``appArgs`` is a list of arguments to be passed for the application. \n\n" + + "Example:\n" + + "| Launch Swing Application In Separate Thread | _javafxlibrary.testapps.SwingApplication |\n" + + "| Launch Swing Application In Separate Thread | _TestApplication.jar_ |\n") + @ArgumentNames({"appName", "*args"}) + public void launchSwingApplicationInSeparateThread(String appName, String... appArgs) { + RobotLog.info("Starting application:" + appName); + Class c = getMainClass(appName); + Application app = createThreadedWrapperApplication(c, appArgs); + createNewSession(app); + RobotLog.info("Application: " + appName + " started."); + } + private Class getMainClass(String appName) { try { if (appName.endsWith(".jar")) - c = getMainClassFromJarFile(appName); + return getMainClassFromJarFile(appName); else - c = Class.forName(appName); - + return Class.forName(appName); } catch (ClassNotFoundException e) { throw new JavaFXLibraryNonFatalException("Unable to launch application: " + appName, e); } - - Application app = createWrapperApplication(c, appArgs); - createNewSession(app); - RobotLog.info("Application: " + appName + " started."); } private void _addPathToClassPath(String path) { diff --git a/src/main/java/javafxlibrary/utils/HelperFunctions.java b/src/main/java/javafxlibrary/utils/HelperFunctions.java index d14142d..509be25 100644 --- a/src/main/java/javafxlibrary/utils/HelperFunctions.java +++ b/src/main/java/javafxlibrary/utils/HelperFunctions.java @@ -842,6 +842,28 @@ public void start(Stage primaryStage) { } } + public static Application createThreadedWrapperApplication(Class c, String... appArgs) { + try { + Method main = c.getMethod("main", String[].class); + return new Application() { + @Override + public void start(Stage primaryStage) { + Thread t = new Thread (() -> { + try { + main.invoke(null, (Object) appArgs); + + } catch (IllegalAccessException | InvocationTargetException e) { + throw new JavaFXLibraryNonFatalException("Unable to launch application: " + c.getName(), e); + } + }); + t.start(); + } + }; + } catch (NoSuchMethodException e) { + throw new JavaFXLibraryNonFatalException("Couldn't create wrapper application for " + c.getName(), e); + } + } + public static Finder createFinder() { return new Finder(); } From ffa9303ea5313b34ffd2d86b15e6ce183a9a3d99 Mon Sep 17 00:00:00 2001 From: Juho Saarinen Date: Tue, 27 Nov 2018 09:18:28 +0200 Subject: [PATCH 08/59] Moved test app to test code Updated some dependencies Testing what's delivered in containers Surefire update because of https://issues.apache.org/jira/browse/SUREFIRE-1588 / https://stackoverflow.com/questions/53010200/maven-surefire-could-not-find-forkedbooter-class --- Dockerfile_build | 1 + docker/robot-javafx-demo/test.sh | 6 ++- entrypoint_build.sh | 3 +- pom.xml | 45 +++++++++++++++++-- .../javafxlibrary/testapps/DatePickerApp.java | 0 .../java/javafxlibrary/testapps/DemoApp.java | 0 .../javafxlibrary/testapps/FinderApp.java | 0 .../java/javafxlibrary/testapps/MenuApp.java | 0 .../testapps/SwingApplication.java | 0 .../testapps/SwingApplicationWrapper.java | 0 .../testapps/TestBoundsLocation.java | 0 .../testapps/TestClickRobot.java | 0 .../javafxlibrary/testapps/TestDragRobot.java | 0 .../testapps/TestKeyboardRobot.java | 0 .../testapps/TestMultipleWindows.java | 0 .../testapps/TestPointLocation.java | 0 .../testapps/TestScreenCapturing.java | 0 .../testapps/TestScrollRobot.java | 0 .../testapps/TestScrollRobot2.java | 0 .../testapps/TestSleepRobot.java | 0 .../testapps/TestTableManagement.java | 0 .../testapps/TestWindowManagement.java | 0 .../controllers/DemoAppController.java | 0 .../controllers/ImageDemoController.java | 0 .../controllers/MenuAppController.java | 0 .../TestBoundsLocationController.java | 0 .../controllers/TestClickRobotController.java | 0 .../controllers/TestDragRobotController.java | 0 .../TestKeyboardRobotController.java | 0 .../TestMultipleWindowsController.java | 0 .../TestPointLocationController.java | 0 .../TestScreenCapturingController.java | 0 .../TestScrollRobot2Controller.java | 0 .../TestScrollRobotController.java | 0 .../controllers/TestSleepRobotController.java | 0 .../TestWindowManagementController.java | 0 .../controllers/TextListController.java | 0 .../ColorChangingRectangle.java | 0 .../testapps/customcomponents/ImageDemo.java | 0 .../testapps/customcomponents/Statistic.java | 0 .../testapps/customcomponents/TextList.java | 0 .../testapps/customcomponents/TextRow.java | 0 src/test/robotframework/resource.robot | 4 ++ 43 files changed, 52 insertions(+), 7 deletions(-) rename src/{main => test}/java/javafxlibrary/testapps/DatePickerApp.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/DemoApp.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/FinderApp.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/MenuApp.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/SwingApplication.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/SwingApplicationWrapper.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestBoundsLocation.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestClickRobot.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestDragRobot.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestKeyboardRobot.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestMultipleWindows.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestPointLocation.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestScreenCapturing.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestScrollRobot.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestScrollRobot2.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestSleepRobot.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestTableManagement.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestWindowManagement.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/DemoAppController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/ImageDemoController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/MenuAppController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestBoundsLocationController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestClickRobotController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestDragRobotController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestKeyboardRobotController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestMultipleWindowsController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestPointLocationController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestScreenCapturingController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestScrollRobot2Controller.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestScrollRobotController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestSleepRobotController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestWindowManagementController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TextListController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/customcomponents/ColorChangingRectangle.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/customcomponents/ImageDemo.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/customcomponents/Statistic.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/customcomponents/TextList.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/customcomponents/TextRow.java (100%) diff --git a/Dockerfile_build b/Dockerfile_build index c472fa7..d34c660 100644 --- a/Dockerfile_build +++ b/Dockerfile_build @@ -15,6 +15,7 @@ RUN mvn package FROM ubuntu:16.04 COPY --from=builder /code/target/javafxlibrary-*-SNAPSHOT-jar-with-dependencies.jar /. +COPY --from=builder /code/target/javafxlibrary-*-SNAPSHOT-tests.jar /. COPY entrypoint_build.sh /. RUN apt-get -qq update && apt-get dist-upgrade -y && apt-get install -qq --no-install-recommends --allow-unauthenticated -y \ openjdk-8-jre \ diff --git a/docker/robot-javafx-demo/test.sh b/docker/robot-javafx-demo/test.sh index b7572bc..59d1baf 100644 --- a/docker/robot-javafx-demo/test.sh +++ b/docker/robot-javafx-demo/test.sh @@ -5,7 +5,8 @@ function local() { echo "**********************" echo "INFO: Local execution:" file=$(ls -1 /javafxbinary/javafxlibrary-*-jar-with-dependencies.jar) - java -cp ${file} org.robotframework.RobotFramework -d /robot/results/local --include smoke $@ /robot/acceptance + testJar=$(ls -1 /javafxbinary/javafxlibrary-*-tests.jar) + java -cp ${file} org.robotframework.RobotFramework -d /robot/results/local --include smoke --variable appJar:${testJar} $@ /robot/acceptance # $@ #just to testing script if [[ "$?" != "0" ]]; then EXIT_VALUE=$((EXIT_VALUE+1)) @@ -15,7 +16,8 @@ function local() { function remote() { echo "***********************" echo "INFO: Remote execution:" - robot -d /robot/results/remote --include smoke $@ /robot/acceptance + testJar=$(ls -1 /javafxbinary/javafxlibrary-*-tests.jar) + robot -d /robot/results/remote --include smoke --variable appJar:${testJar} $@ /robot/acceptance # $@ #just to testing script if [[ "$?" != "0" ]]; then EXIT_VALUE=$((EXIT_VALUE+2)) diff --git a/entrypoint_build.sh b/entrypoint_build.sh index 1c61959..a4ba273 100644 --- a/entrypoint_build.sh +++ b/entrypoint_build.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash rm -rvf /javafxbinary/* cp -vf /javafxlibrary-*-jar-with-dependencies.jar /javafxbinary/. -chmod 555 /javafxbinary/javafxlibrary-*-jar-with-dependencies.jar +cp -vf /javafxlibrary-*-tests.jar /javafxbinary/. +chmod 555 /javafxbinary/* java -jar /javafxlibrary-*-jar-with-dependencies.jar diff --git a/pom.xml b/pom.xml index 72ac47c..5566f19 100644 --- a/pom.xml +++ b/pom.xml @@ -102,6 +102,33 @@ + + + org.codehaus.mojo + build-helper-maven-plugin + 1.10 + + + attach-artifacts + package + + attach-artifact + + + + + ${project.build.directory}/${project.artifactId}.html + html + + + ${project.build.directory}/${project.artifactId}.xml + xml + + + + + + org.apache.maven.plugins maven-gpg-plugin @@ -138,6 +165,11 @@ + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M1 + org.sonatype.plugins nexus-staging-maven-plugin @@ -219,6 +251,9 @@ TRACE:INFO false + + appJar:${project.build.directory}/${project.artifactId}*tests.jar + @@ -229,6 +264,7 @@ + ${project.build.directory} ${project.artifactId}.html JavaFXLibrary ${project.version} @@ -243,6 +279,7 @@ + ${project.build.directory} ${project.artifactId}.xml JavaFXLibrary ${project.version} @@ -299,7 +336,7 @@ org.apache.maven maven-model - 3.3.9 + 3.6.0 org.jmockit @@ -315,7 +352,7 @@ org.testfx testfx-core - 4.0.14-alpha + 4.0.15-alpha org.testfx @@ -331,7 +368,7 @@ org.robotframework robotframework - 3.0.2 + 3.0.4 org.hamcrest @@ -341,7 +378,7 @@ com.google.guava guava - 23.0 + 27.0.1-jre com.github.ombre42 diff --git a/src/main/java/javafxlibrary/testapps/DatePickerApp.java b/src/test/java/javafxlibrary/testapps/DatePickerApp.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/DatePickerApp.java rename to src/test/java/javafxlibrary/testapps/DatePickerApp.java diff --git a/src/main/java/javafxlibrary/testapps/DemoApp.java b/src/test/java/javafxlibrary/testapps/DemoApp.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/DemoApp.java rename to src/test/java/javafxlibrary/testapps/DemoApp.java diff --git a/src/main/java/javafxlibrary/testapps/FinderApp.java b/src/test/java/javafxlibrary/testapps/FinderApp.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/FinderApp.java rename to src/test/java/javafxlibrary/testapps/FinderApp.java diff --git a/src/main/java/javafxlibrary/testapps/MenuApp.java b/src/test/java/javafxlibrary/testapps/MenuApp.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/MenuApp.java rename to src/test/java/javafxlibrary/testapps/MenuApp.java diff --git a/src/main/java/javafxlibrary/testapps/SwingApplication.java b/src/test/java/javafxlibrary/testapps/SwingApplication.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/SwingApplication.java rename to src/test/java/javafxlibrary/testapps/SwingApplication.java diff --git a/src/main/java/javafxlibrary/testapps/SwingApplicationWrapper.java b/src/test/java/javafxlibrary/testapps/SwingApplicationWrapper.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/SwingApplicationWrapper.java rename to src/test/java/javafxlibrary/testapps/SwingApplicationWrapper.java diff --git a/src/main/java/javafxlibrary/testapps/TestBoundsLocation.java b/src/test/java/javafxlibrary/testapps/TestBoundsLocation.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestBoundsLocation.java rename to src/test/java/javafxlibrary/testapps/TestBoundsLocation.java diff --git a/src/main/java/javafxlibrary/testapps/TestClickRobot.java b/src/test/java/javafxlibrary/testapps/TestClickRobot.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestClickRobot.java rename to src/test/java/javafxlibrary/testapps/TestClickRobot.java diff --git a/src/main/java/javafxlibrary/testapps/TestDragRobot.java b/src/test/java/javafxlibrary/testapps/TestDragRobot.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestDragRobot.java rename to src/test/java/javafxlibrary/testapps/TestDragRobot.java diff --git a/src/main/java/javafxlibrary/testapps/TestKeyboardRobot.java b/src/test/java/javafxlibrary/testapps/TestKeyboardRobot.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestKeyboardRobot.java rename to src/test/java/javafxlibrary/testapps/TestKeyboardRobot.java diff --git a/src/main/java/javafxlibrary/testapps/TestMultipleWindows.java b/src/test/java/javafxlibrary/testapps/TestMultipleWindows.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestMultipleWindows.java rename to src/test/java/javafxlibrary/testapps/TestMultipleWindows.java diff --git a/src/main/java/javafxlibrary/testapps/TestPointLocation.java b/src/test/java/javafxlibrary/testapps/TestPointLocation.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestPointLocation.java rename to src/test/java/javafxlibrary/testapps/TestPointLocation.java diff --git a/src/main/java/javafxlibrary/testapps/TestScreenCapturing.java b/src/test/java/javafxlibrary/testapps/TestScreenCapturing.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestScreenCapturing.java rename to src/test/java/javafxlibrary/testapps/TestScreenCapturing.java diff --git a/src/main/java/javafxlibrary/testapps/TestScrollRobot.java b/src/test/java/javafxlibrary/testapps/TestScrollRobot.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestScrollRobot.java rename to src/test/java/javafxlibrary/testapps/TestScrollRobot.java diff --git a/src/main/java/javafxlibrary/testapps/TestScrollRobot2.java b/src/test/java/javafxlibrary/testapps/TestScrollRobot2.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestScrollRobot2.java rename to src/test/java/javafxlibrary/testapps/TestScrollRobot2.java diff --git a/src/main/java/javafxlibrary/testapps/TestSleepRobot.java b/src/test/java/javafxlibrary/testapps/TestSleepRobot.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestSleepRobot.java rename to src/test/java/javafxlibrary/testapps/TestSleepRobot.java diff --git a/src/main/java/javafxlibrary/testapps/TestTableManagement.java b/src/test/java/javafxlibrary/testapps/TestTableManagement.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestTableManagement.java rename to src/test/java/javafxlibrary/testapps/TestTableManagement.java diff --git a/src/main/java/javafxlibrary/testapps/TestWindowManagement.java b/src/test/java/javafxlibrary/testapps/TestWindowManagement.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestWindowManagement.java rename to src/test/java/javafxlibrary/testapps/TestWindowManagement.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/DemoAppController.java b/src/test/java/javafxlibrary/testapps/controllers/DemoAppController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/DemoAppController.java rename to src/test/java/javafxlibrary/testapps/controllers/DemoAppController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/ImageDemoController.java b/src/test/java/javafxlibrary/testapps/controllers/ImageDemoController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/ImageDemoController.java rename to src/test/java/javafxlibrary/testapps/controllers/ImageDemoController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/MenuAppController.java b/src/test/java/javafxlibrary/testapps/controllers/MenuAppController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/MenuAppController.java rename to src/test/java/javafxlibrary/testapps/controllers/MenuAppController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestBoundsLocationController.java b/src/test/java/javafxlibrary/testapps/controllers/TestBoundsLocationController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestBoundsLocationController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestBoundsLocationController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestClickRobotController.java b/src/test/java/javafxlibrary/testapps/controllers/TestClickRobotController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestClickRobotController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestClickRobotController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestDragRobotController.java b/src/test/java/javafxlibrary/testapps/controllers/TestDragRobotController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestDragRobotController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestDragRobotController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestKeyboardRobotController.java b/src/test/java/javafxlibrary/testapps/controllers/TestKeyboardRobotController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestKeyboardRobotController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestKeyboardRobotController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestMultipleWindowsController.java b/src/test/java/javafxlibrary/testapps/controllers/TestMultipleWindowsController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestMultipleWindowsController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestMultipleWindowsController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestPointLocationController.java b/src/test/java/javafxlibrary/testapps/controllers/TestPointLocationController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestPointLocationController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestPointLocationController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestScreenCapturingController.java b/src/test/java/javafxlibrary/testapps/controllers/TestScreenCapturingController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestScreenCapturingController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestScreenCapturingController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestScrollRobot2Controller.java b/src/test/java/javafxlibrary/testapps/controllers/TestScrollRobot2Controller.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestScrollRobot2Controller.java rename to src/test/java/javafxlibrary/testapps/controllers/TestScrollRobot2Controller.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestScrollRobotController.java b/src/test/java/javafxlibrary/testapps/controllers/TestScrollRobotController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestScrollRobotController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestScrollRobotController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestSleepRobotController.java b/src/test/java/javafxlibrary/testapps/controllers/TestSleepRobotController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestSleepRobotController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestSleepRobotController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestWindowManagementController.java b/src/test/java/javafxlibrary/testapps/controllers/TestWindowManagementController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestWindowManagementController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestWindowManagementController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TextListController.java b/src/test/java/javafxlibrary/testapps/controllers/TextListController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TextListController.java rename to src/test/java/javafxlibrary/testapps/controllers/TextListController.java diff --git a/src/main/java/javafxlibrary/testapps/customcomponents/ColorChangingRectangle.java b/src/test/java/javafxlibrary/testapps/customcomponents/ColorChangingRectangle.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/customcomponents/ColorChangingRectangle.java rename to src/test/java/javafxlibrary/testapps/customcomponents/ColorChangingRectangle.java diff --git a/src/main/java/javafxlibrary/testapps/customcomponents/ImageDemo.java b/src/test/java/javafxlibrary/testapps/customcomponents/ImageDemo.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/customcomponents/ImageDemo.java rename to src/test/java/javafxlibrary/testapps/customcomponents/ImageDemo.java diff --git a/src/main/java/javafxlibrary/testapps/customcomponents/Statistic.java b/src/test/java/javafxlibrary/testapps/customcomponents/Statistic.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/customcomponents/Statistic.java rename to src/test/java/javafxlibrary/testapps/customcomponents/Statistic.java diff --git a/src/main/java/javafxlibrary/testapps/customcomponents/TextList.java b/src/test/java/javafxlibrary/testapps/customcomponents/TextList.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/customcomponents/TextList.java rename to src/test/java/javafxlibrary/testapps/customcomponents/TextList.java diff --git a/src/main/java/javafxlibrary/testapps/customcomponents/TextRow.java b/src/test/java/javafxlibrary/testapps/customcomponents/TextRow.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/customcomponents/TextRow.java rename to src/test/java/javafxlibrary/testapps/customcomponents/TextRow.java diff --git a/src/test/robotframework/resource.robot b/src/test/robotframework/resource.robot index 2802640..bff1e77 100644 --- a/src/test/robotframework/resource.robot +++ b/src/test/robotframework/resource.robot @@ -1,7 +1,11 @@ +*** Variables *** +${appJar} javafxlibrary-*-tests.jar + *** Keywords *** Import JavaFXLibrary Run Keyword If sys.platform.startswith('java') Import Library JavaFXLibrary ... ELSE Import Library Remote http://javafxcompile:8270 WITH NAME RemoteJavaFXLibrary + Set To Classpath ${appJar} Disable Embedded Image Logging For Negative Tests :FOR ${tag} IN @{TEST TAGS} From f86b9bbc73eeeb6ea3e819765d5d19156b677970 Mon Sep 17 00:00:00 2001 From: Juho Saarinen Date: Tue, 27 Nov 2018 09:50:28 +0200 Subject: [PATCH 09/59] Continuing to use awt robot with library --- src/main/java/JavaFXLibrary.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/main/java/JavaFXLibrary.java b/src/main/java/JavaFXLibrary.java index da646a5..c80b415 100644 --- a/src/main/java/JavaFXLibrary.java +++ b/src/main/java/JavaFXLibrary.java @@ -60,6 +60,9 @@ public class JavaFXLibrary extends AnnotationLibrary { public JavaFXLibrary() { super(includePatterns); deleteScreenshotsFrom("report-images/imagecomparison"); + //v4.0.15-alpha sets default robot as glass, which breaks rolling + //Forcing usage of awt robot as previous versions + System.setProperty("testfx.robot", "awt"); } @Autowired From 9052b63131898b13a752f03c3eec96884864e2f0 Mon Sep 17 00:00:00 2001 From: Juho Saarinen Date: Wed, 28 Nov 2018 09:00:13 +0200 Subject: [PATCH 10/59] Added init argument to determine if tests are run headless Documentation for the headless mode activation --- src/main/java/JavaFXLibrary.java | 34 ++++++++++++++++++--- src/main/java/libdoc-documentation.txt | 7 ++++- src/main/java/libdoc-init-documentation.txt | 3 ++ 3 files changed, 38 insertions(+), 6 deletions(-) create mode 100644 src/main/java/libdoc-init-documentation.txt diff --git a/src/main/java/JavaFXLibrary.java b/src/main/java/JavaFXLibrary.java index c80b415..54d65a3 100644 --- a/src/main/java/JavaFXLibrary.java +++ b/src/main/java/JavaFXLibrary.java @@ -58,12 +58,23 @@ public class JavaFXLibrary extends AnnotationLibrary { }}; public JavaFXLibrary() { + this(false); + } + + public JavaFXLibrary(boolean headless) { super(includePatterns); deleteScreenshotsFrom("report-images/imagecomparison"); - //v4.0.15-alpha sets default robot as glass, which breaks rolling - //Forcing usage of awt robot as previous versions - System.setProperty("testfx.robot", "awt"); - } + if (headless) { + System.setProperty("testfx.robot", "glass"); + System.setProperty("testfx.headless", "true"); + System.setProperty("prism.order", "sw"); + System.setProperty("prism.text", "t2k"); + } else { + //v4.0.15-alpha sets default robot as glass, which breaks rolling + //Forcing usage of awt robot as previous versions + System.setProperty("testfx.robot", "awt"); + } + } @Autowired protected RunOnFailure runOnFailure; @@ -136,8 +147,21 @@ public String getKeywordDocumentation(String keywordName) { e.printStackTrace(); return "IOException occured while reading the documentation file!"; } + } else if (keywordName.equals("__init__")) { + try { + return FileUtils.readFileToString(new File("./src/main/java/libdoc-init-documentation.txt"), "utf-8"); + } catch (IOException e) { + e.printStackTrace(); + return "IOException occured while reading the init documentation file!"; + } + } else { + try { + return super.getKeywordDocumentation(keywordName); + } + catch (Exception e) { + return keywordName; + } } - return super.getKeywordDocumentation(keywordName); } /** diff --git a/src/main/java/libdoc-documentation.txt b/src/main/java/libdoc-documentation.txt index 20d20f0..d46f063 100644 --- a/src/main/java/libdoc-documentation.txt +++ b/src/main/java/libdoc-documentation.txt @@ -21,6 +21,9 @@ First, the JavaFXLibrary needs to be taken into use in the settings table. | *Settings* | *Value* | | Library | JavaFXLibrary | +Experimental headless mode can be activated at the import time by setting first argument to ${True} +| *Settings* | *Value* | +| Library | JavaFXLibrary | ${True} | === 2.2 Usage in remote mode(Jython & Python) === When using the test library in remote mode, the library needs to be started at the remote end first. This can be done as follows: @@ -40,7 +43,9 @@ Multiple JavaFXLibraries in remote mode: | Library | Remote | ip_address:8270 | WITH NAME | my_application | | Library | Remote | ip_address:8271 | WITH NAME | my_other_application | - +Experimental headless mode can be activated in remote mode at the import time by setting first argument to ${True} +| *Settings* | *Value* | +| Library | Remote | http://localhost:8270 | ${True} | WITH NAME | JavaFXLibrary | == 3. Locating JavaFX Nodes == === 3.1 Locator syntax === diff --git a/src/main/java/libdoc-init-documentation.txt b/src/main/java/libdoc-init-documentation.txt new file mode 100644 index 0000000..9c67516 --- /dev/null +++ b/src/main/java/libdoc-init-documentation.txt @@ -0,0 +1,3 @@ +JavaFXLibrary can be imported with one optional arguments. + +- ``headless``: Determines if tests will be run in headless mode using [https://wiki.openjdk.java.net/display/OpenJFX/Monocle|Monocle]. Default value is ``false``. From 642701f7e2c8f86089abac2361c595e0523baf37 Mon Sep 17 00:00:00 2001 From: Juho Saarinen Date: Wed, 28 Nov 2018 10:17:39 +0200 Subject: [PATCH 11/59] Added javaagent explicitly (windows build failed without it) --- pom.xml | 345 +++++++++++++++++++++++++++++--------------------------- 1 file changed, 176 insertions(+), 169 deletions(-) diff --git a/pom.xml b/pom.xml index a98e2a3..a586d1c 100644 --- a/pom.xml +++ b/pom.xml @@ -24,6 +24,7 @@ 0.5.2-SNAPSHOT UTF-8 + 1.44 ${project.groupId}:${project.artifactId} @@ -163,178 +164,184 @@ - - - + + + org.apache.maven.plugins maven-surefire-plugin 3.0.0-M1 + + + -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar + + - - org.sonatype.plugins - nexus-staging-maven-plugin - 1.6.7 - true - - ossrh - https://oss.sonatype.org/ - false - - - - maven-compiler-plugin - 3.6.1 - - 1.8 - 1.8 - - - - org.apache.maven.plugins - maven-jar-plugin - 3.0.2 - - - - true - JavaFXLibrary - - - - - - - test-jar - - - - - - maven-assembly-plugin - 3.0.0 - - - package - - single - - - - - - - JavaFXLibrary - - - - jar-with-dependencies - - - - - org.robotframework - robotframework-maven-plugin - 1.4.7 - - - acceptance tests - integration-test - - run - - - - smoke - - - not-ready - - TRACE:INFO - false - - appJar:${project.build.directory}/${project.artifactId}*tests.jar - - - - - documentation - package - - libdoc - - - - ${project.build.directory} - ${project.artifactId}.html - JavaFXLibrary - ${project.version} - - - - - xml - package - - libdoc - - - - ${project.build.directory} - ${project.artifactId}.xml - JavaFXLibrary - ${project.version} - - - - - - - org.apache.maven.plugins - maven-shade-plugin - 3.1.0 - - - package - - shade - - - - - JavaFXLibrary - - - - - com.google.common - shaded.com.google.common - - - org.apache.commons - shaded.org.apache.commons - - - - - *:* - - - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - - - + + org.sonatype.plugins + nexus-staging-maven-plugin + 1.6.7 + true + + ossrh + https://oss.sonatype.org/ + false + + + + maven-compiler-plugin + 3.6.1 + + 1.8 + 1.8 + + + + org.apache.maven.plugins + maven-jar-plugin + 3.0.2 + + + + true + JavaFXLibrary + + + + + + + test-jar + + + + + + maven-assembly-plugin + 3.0.0 + + + package + + single + + + + + + + JavaFXLibrary + + + + jar-with-dependencies + + + + + org.robotframework + robotframework-maven-plugin + 1.4.7 + + + acceptance tests + integration-test + + run + + + + smoke + + + not-ready + + TRACE:INFO + false + + appJar:${project.build.directory}/${project.artifactId}*tests.jar + + + + + documentation + package + + libdoc + + + + ${project.build.directory} + ${project.artifactId}.html + JavaFXLibrary + ${project.version} + + + + + xml + package + + libdoc + + + + ${project.build.directory} + ${project.artifactId}.xml + JavaFXLibrary + ${project.version} + + + + + + + org.apache.maven.plugins + maven-shade-plugin + 3.1.0 + + + package + + shade + + + + + JavaFXLibrary + + + + + com.google.common + shaded.com.google.common + + + org.apache.commons + shaded.org.apache.commons + + + + + *:* + + + + + *:* + + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + + + + + + + + + @@ -346,7 +353,7 @@ org.jmockit jmockit test - 1.38 + ${jmockit.version} junit From 72754fba9cffdbe87ad25d5be919710a1ef9a99f Mon Sep 17 00:00:00 2001 From: Juho Saarinen Date: Wed, 28 Nov 2018 10:36:15 +0200 Subject: [PATCH 12/59] Including monocle also in actual package --- pom.xml | 1 - 1 file changed, 1 deletion(-) diff --git a/pom.xml b/pom.xml index a98e2a3..e71343e 100644 --- a/pom.xml +++ b/pom.xml @@ -362,7 +362,6 @@ org.testfx openjfx-monocle 8u76-b04 - test org.robotframework From 3e3e1abb277d10c8a47c6c586e2aad2d1233ebec Mon Sep 17 00:00:00 2001 From: Sami Pesonen Date: Wed, 28 Nov 2018 22:38:41 +0200 Subject: [PATCH 13/59] merge 0.5.2-development branch => release 0.5.2 - Merge pull request #9 from Hi-Fi/packageImprovements - Package improvements - Merge pull request #8 from Hi-Fi/shadeCommons - Prevent conflicts with Commons by shading it - Continuing to use awt robot with library - Moved test app to test code - Updated some dependencies - Testing what's delivered in containers - Surefire update because of https://issues.apache.org/jira/browse/SUREFIRE-1588 / https://stackoverflow.com/questions/53010200/maven-surefire-could-not-find-forkedbooter-class - Add keyword Launch Swing Application In Separate Thread - Prevent conflicts with Commons by shading it - Get FxRobotContext from the active sessionRobot in TestFxAdapter - Adjust readme - Add instructions for enabling accessibility features on MacOS Mojave --- AUTHORS.txt | 1 + Dockerfile_build | 1 + README.md | 9 +++ docker/robot-javafx-demo/test.sh | 6 +- entrypoint_build.sh | 3 +- pom.xml | 56 +++++++++++++++---- src/main/java/JavaFXLibrary.java | 3 + .../ApplicationLauncher.java | 36 +++++++++--- .../AdditionalKeywords/Verifiers.java | 4 +- .../keywords/Keywords/KeyboardRobot.java | 2 +- .../keywords/Keywords/ScreenCapturing.java | 6 +- .../javafxlibrary/utils/HelperFunctions.java | 22 ++++++++ .../java/javafxlibrary/utils/Session.java | 7 +-- .../javafxlibrary/utils/TestFxAdapter.java | 18 ++---- .../javafxlibrary/testapps/DatePickerApp.java | 0 .../java/javafxlibrary/testapps/DemoApp.java | 0 .../javafxlibrary/testapps/FinderApp.java | 0 .../java/javafxlibrary/testapps/MenuApp.java | 0 .../testapps/SwingApplication.java | 0 .../testapps/SwingApplicationWrapper.java | 0 .../testapps/TestBoundsLocation.java | 0 .../testapps/TestClickRobot.java | 0 .../javafxlibrary/testapps/TestDragRobot.java | 0 .../testapps/TestKeyboardRobot.java | 0 .../testapps/TestMultipleWindows.java | 0 .../testapps/TestPointLocation.java | 0 .../testapps/TestScreenCapturing.java | 0 .../testapps/TestScrollRobot.java | 0 .../testapps/TestScrollRobot2.java | 0 .../testapps/TestSleepRobot.java | 0 .../testapps/TestTableManagement.java | 0 .../testapps/TestWindowManagement.java | 0 .../controllers/DemoAppController.java | 0 .../controllers/ImageDemoController.java | 0 .../controllers/MenuAppController.java | 0 .../TestBoundsLocationController.java | 0 .../controllers/TestClickRobotController.java | 0 .../controllers/TestDragRobotController.java | 0 .../TestKeyboardRobotController.java | 0 .../TestMultipleWindowsController.java | 0 .../TestPointLocationController.java | 0 .../TestScreenCapturingController.java | 0 .../TestScrollRobot2Controller.java | 0 .../TestScrollRobotController.java | 0 .../controllers/TestSleepRobotController.java | 0 .../TestWindowManagementController.java | 0 .../controllers/TextListController.java | 0 .../ColorChangingRectangle.java | 0 .../testapps/customcomponents/ImageDemo.java | 0 .../testapps/customcomponents/Statistic.java | 0 .../testapps/customcomponents/TextList.java | 0 .../testapps/customcomponents/TextRow.java | 0 src/test/robotframework/resource.robot | 4 ++ 53 files changed, 134 insertions(+), 44 deletions(-) rename src/{main => test}/java/javafxlibrary/testapps/DatePickerApp.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/DemoApp.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/FinderApp.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/MenuApp.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/SwingApplication.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/SwingApplicationWrapper.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestBoundsLocation.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestClickRobot.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestDragRobot.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestKeyboardRobot.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestMultipleWindows.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestPointLocation.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestScreenCapturing.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestScrollRobot.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestScrollRobot2.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestSleepRobot.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestTableManagement.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/TestWindowManagement.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/DemoAppController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/ImageDemoController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/MenuAppController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestBoundsLocationController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestClickRobotController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestDragRobotController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestKeyboardRobotController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestMultipleWindowsController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestPointLocationController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestScreenCapturingController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestScrollRobot2Controller.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestScrollRobotController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestSleepRobotController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TestWindowManagementController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/controllers/TextListController.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/customcomponents/ColorChangingRectangle.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/customcomponents/ImageDemo.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/customcomponents/Statistic.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/customcomponents/TextList.java (100%) rename src/{main => test}/java/javafxlibrary/testapps/customcomponents/TextRow.java (100%) diff --git a/AUTHORS.txt b/AUTHORS.txt index e294876..4b5c288 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -7,3 +7,4 @@ Other contributors: Tatu Lahtela Find All With Pseudo Class and Find Class keywords Sakari Hoisko Dockerized linux env with X Juho Lehtonen Optimized docker environment. +Juho Saarinen Package improvements diff --git a/Dockerfile_build b/Dockerfile_build index c472fa7..d34c660 100644 --- a/Dockerfile_build +++ b/Dockerfile_build @@ -15,6 +15,7 @@ RUN mvn package FROM ubuntu:16.04 COPY --from=builder /code/target/javafxlibrary-*-SNAPSHOT-jar-with-dependencies.jar /. +COPY --from=builder /code/target/javafxlibrary-*-SNAPSHOT-tests.jar /. COPY entrypoint_build.sh /. RUN apt-get -qq update && apt-get dist-upgrade -y && apt-get install -qq --no-install-recommends --allow-unauthenticated -y \ openjdk-8-jre \ diff --git a/README.md b/README.md index e6b25a7..9d5acd1 100644 --- a/README.md +++ b/README.md @@ -34,6 +34,15 @@ Library Remote http://127.0.0.1:8270 WITH NAME JavaFXLibrary ``` 4. Run your tests: `robot tests.robot` +## Using JavaFXLibrary on macOS Mojave +MacOS Mojave introduced changes to security settings and disabled some of the features JavaFXLibrary uses by default. +To use JavaFXLibrary on macOS Mojave you must enable the accessibility features for terminal in system preferences: +- Navigate to `Apple menu > System Preferences > Security & Privacy > Privacy > Accessibility` +- Click the lock and enter your password to change these settings +- If terminal has requested accessibility features before it should show in the list +- If not, add it by clicking :heavy_plus_sign: and selecting `Applications > Utilities > Terminal` +- Enable accessibility features by checking the box: :white_check_mark: Terminal + ## Identifying JavaFX UI objects [Scenic View](http://fxexperience.com/scenic-view/) is a tool that allows you to inspect the JavaFX application scenegraph. This can be useful especially when you do not have access to the source code. diff --git a/docker/robot-javafx-demo/test.sh b/docker/robot-javafx-demo/test.sh index b7572bc..59d1baf 100644 --- a/docker/robot-javafx-demo/test.sh +++ b/docker/robot-javafx-demo/test.sh @@ -5,7 +5,8 @@ function local() { echo "**********************" echo "INFO: Local execution:" file=$(ls -1 /javafxbinary/javafxlibrary-*-jar-with-dependencies.jar) - java -cp ${file} org.robotframework.RobotFramework -d /robot/results/local --include smoke $@ /robot/acceptance + testJar=$(ls -1 /javafxbinary/javafxlibrary-*-tests.jar) + java -cp ${file} org.robotframework.RobotFramework -d /robot/results/local --include smoke --variable appJar:${testJar} $@ /robot/acceptance # $@ #just to testing script if [[ "$?" != "0" ]]; then EXIT_VALUE=$((EXIT_VALUE+1)) @@ -15,7 +16,8 @@ function local() { function remote() { echo "***********************" echo "INFO: Remote execution:" - robot -d /robot/results/remote --include smoke $@ /robot/acceptance + testJar=$(ls -1 /javafxbinary/javafxlibrary-*-tests.jar) + robot -d /robot/results/remote --include smoke --variable appJar:${testJar} $@ /robot/acceptance # $@ #just to testing script if [[ "$?" != "0" ]]; then EXIT_VALUE=$((EXIT_VALUE+2)) diff --git a/entrypoint_build.sh b/entrypoint_build.sh index 1c61959..a4ba273 100644 --- a/entrypoint_build.sh +++ b/entrypoint_build.sh @@ -1,5 +1,6 @@ #!/usr/bin/env bash rm -rvf /javafxbinary/* cp -vf /javafxlibrary-*-jar-with-dependencies.jar /javafxbinary/. -chmod 555 /javafxbinary/javafxlibrary-*-jar-with-dependencies.jar +cp -vf /javafxlibrary-*-tests.jar /javafxbinary/. +chmod 555 /javafxbinary/* java -jar /javafxlibrary-*-jar-with-dependencies.jar diff --git a/pom.xml b/pom.xml index 372bf1d..c011ec2 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.robotframework javafxlibrary jar - 0.5.2-SNAPSHOT + 0.5.2 UTF-8 @@ -102,6 +102,33 @@ + + + org.codehaus.mojo + build-helper-maven-plugin + 1.10 + + + attach-artifacts + package + + attach-artifact + + + + + ${project.build.directory}/${project.artifactId}.html + html + + + ${project.build.directory}/${project.artifactId}.xml + xml + + + + + + org.apache.maven.plugins maven-gpg-plugin @@ -138,6 +165,11 @@ + + org.apache.maven.plugins + maven-surefire-plugin + 3.0.0-M1 + org.sonatype.plugins nexus-staging-maven-plugin @@ -219,6 +251,9 @@ TRACE:INFO false + + appJar:${project.build.directory}/${project.artifactId}*tests.jar + @@ -229,6 +264,7 @@ + ${project.build.directory} ${project.artifactId}.html JavaFXLibrary ${project.version} @@ -243,6 +279,7 @@ + ${project.build.directory} ${project.artifactId}.xml JavaFXLibrary ${project.version} @@ -272,6 +309,10 @@ com.google.common shaded.com.google.common + + org.apache.commons + shaded.org.apache.commons + @@ -299,7 +340,7 @@ org.apache.maven maven-model - 3.3.9 + 3.6.0 org.jmockit @@ -315,12 +356,7 @@ org.testfx testfx-core - 4.0.14-alpha - - - org.testfx - testfx-junit - 4.0.14-alpha + 4.0.15-alpha org.testfx @@ -336,7 +372,7 @@ org.robotframework robotframework - 3.0.2 + 3.0.4 org.hamcrest @@ -346,7 +382,7 @@ com.google.guava guava - 23.0 + 27.0.1-jre com.github.ombre42 diff --git a/src/main/java/JavaFXLibrary.java b/src/main/java/JavaFXLibrary.java index da646a5..c80b415 100644 --- a/src/main/java/JavaFXLibrary.java +++ b/src/main/java/JavaFXLibrary.java @@ -60,6 +60,9 @@ public class JavaFXLibrary extends AnnotationLibrary { public JavaFXLibrary() { super(includePatterns); deleteScreenshotsFrom("report-images/imagecomparison"); + //v4.0.15-alpha sets default robot as glass, which breaks rolling + //Forcing usage of awt robot as previous versions + System.setProperty("testfx.robot", "awt"); } @Autowired diff --git a/src/main/java/javafxlibrary/keywords/AdditionalKeywords/ApplicationLauncher.java b/src/main/java/javafxlibrary/keywords/AdditionalKeywords/ApplicationLauncher.java index 5485539..1e8c896 100644 --- a/src/main/java/javafxlibrary/keywords/AdditionalKeywords/ApplicationLauncher.java +++ b/src/main/java/javafxlibrary/keywords/AdditionalKeywords/ApplicationLauncher.java @@ -31,6 +31,7 @@ import java.net.URLClassLoader; import java.util.*; +import static javafxlibrary.utils.HelperFunctions.createThreadedWrapperApplication; import static javafxlibrary.utils.HelperFunctions.createWrapperApplication; import static javafxlibrary.utils.HelperFunctions.getMainClassFromJarFile; @@ -66,21 +67,40 @@ public void launchJavafxApplication(String appName, String... appArgs) { @ArgumentNames({"appName", "*args"}) public void launchSwingApplication(String appName, String... appArgs) { RobotLog.info("Starting application:" + appName); - Class c; + Class c = getMainClass(appName); + Application app = createWrapperApplication(c, appArgs); + createNewSession(app); + RobotLog.info("Application: " + appName + " started."); + } + + @RobotKeyword("Creates a wrapper application the same way as in `Launch Swing Application`, but starts it in a new " + + "thread. This is required when main method of the test application is blocked and execution does not " + + "return after calling it until the application gets closed. Be sure to set the library timeout with " + + "`Set Timeout` so that the test application will have enough time to load, as the test execution will " + + "continue instantly after calling the main method.\n\n" + + "``appName`` is the name of the application to launch. \n\n" + + "``appArgs`` is a list of arguments to be passed for the application. \n\n" + + "Example:\n" + + "| Launch Swing Application In Separate Thread | _javafxlibrary.testapps.SwingApplication |\n" + + "| Launch Swing Application In Separate Thread | _TestApplication.jar_ |\n") + @ArgumentNames({"appName", "*args"}) + public void launchSwingApplicationInSeparateThread(String appName, String... appArgs) { + RobotLog.info("Starting application:" + appName); + Class c = getMainClass(appName); + Application app = createThreadedWrapperApplication(c, appArgs); + createNewSession(app); + RobotLog.info("Application: " + appName + " started."); + } + private Class getMainClass(String appName) { try { if (appName.endsWith(".jar")) - c = getMainClassFromJarFile(appName); + return getMainClassFromJarFile(appName); else - c = Class.forName(appName); - + return Class.forName(appName); } catch (ClassNotFoundException e) { throw new JavaFXLibraryNonFatalException("Unable to launch application: " + appName, e); } - - Application app = createWrapperApplication(c, appArgs); - createNewSession(app); - RobotLog.info("Application: " + appName + " started."); } private void _addPathToClassPath(String path) { diff --git a/src/main/java/javafxlibrary/keywords/AdditionalKeywords/Verifiers.java b/src/main/java/javafxlibrary/keywords/AdditionalKeywords/Verifiers.java index f9b0c16..fa48610 100644 --- a/src/main/java/javafxlibrary/keywords/AdditionalKeywords/Verifiers.java +++ b/src/main/java/javafxlibrary/keywords/AdditionalKeywords/Verifiers.java @@ -252,7 +252,7 @@ public void imagesShouldMatch(Image image1, Image image2, double percentage) { throw new JavaFXLibraryNonFatalException("Images must be same size to compare: Image1 is " + (int)image1.getWidth() + "x" + (int)image1.getHeight() + " and Image2 is " + (int)image2.getWidth() + "x" + (int)image2.getHeight()); - PixelMatcherResult result = robotContext.getCaptureSupport().matchImages(image1, image2, new PixelMatcherRgb()); + PixelMatcherResult result = robotContext().getCaptureSupport().matchImages(image1, image2, new PixelMatcherRgb()); int sharedPixels = (int) (result.getMatchFactor() * 100); RobotLog.info("Matching pixels: " + sharedPixels + "%"); @@ -280,7 +280,7 @@ public void imagesShouldNotMatch(Image image1, Image image2, double percentage) throw new JavaFXLibraryNonFatalException("Images must be same size to compare: Image1 is " + (int)image1.getWidth() + "x" + (int)image1.getHeight() + " and Image2 is " + (int)image2.getWidth() + "x" + (int)image2.getHeight()); - PixelMatcherResult result = robotContext.getCaptureSupport().matchImages(image1, image2, new PixelMatcherRgb()); + PixelMatcherResult result = robotContext().getCaptureSupport().matchImages(image1, image2, new PixelMatcherRgb()); int nonSharedPixels = (int) (result.getNonMatchFactor() * 100); RobotLog.info("Matching pixels: " + nonSharedPixels + "%"); diff --git a/src/main/java/javafxlibrary/keywords/Keywords/KeyboardRobot.java b/src/main/java/javafxlibrary/keywords/Keywords/KeyboardRobot.java index ab6c70c..b45b44f 100644 --- a/src/main/java/javafxlibrary/keywords/Keywords/KeyboardRobot.java +++ b/src/main/java/javafxlibrary/keywords/Keywords/KeyboardRobot.java @@ -204,7 +204,7 @@ public void writeFast(String text) { + "`3. Locating or specifying UI elements`. \n\n" + "``text`` is the text characters to write\n" + "\nExample: \n" - + "| Write | Robot Framework | \n") + + "| Write To | Robot Framework | \n") @ArgumentNames({ "locator", "text" }) public FxRobotInterface writeTo(Object locator, String text) { RobotLog.info("Writing to " + locator); diff --git a/src/main/java/javafxlibrary/keywords/Keywords/ScreenCapturing.java b/src/main/java/javafxlibrary/keywords/Keywords/ScreenCapturing.java index d855160..ce546dd 100644 --- a/src/main/java/javafxlibrary/keywords/Keywords/ScreenCapturing.java +++ b/src/main/java/javafxlibrary/keywords/Keywords/ScreenCapturing.java @@ -86,7 +86,7 @@ public Object captureImage(Object locator, boolean logImage){ try { image = robot.capture(targetBounds).getImage(); Path path = createNewImageFileNameWithPath(); - robotContext.getCaptureSupport().saveImage(image, path); + robotContext().getCaptureSupport().saveImage(image, path); if (logImage) { Double printSize = targetBounds.getWidth() > 800 ? 800 : targetBounds.getWidth(); @@ -94,7 +94,7 @@ public Object captureImage(Object locator, boolean logImage){ if(TestFxAdapter.logImages.toLowerCase().equals("embedded")) { Image resizedImage = resizeImage(image, path); Path tempPath = Paths.get(getCurrentSessionScreenshotDirectory(), "temp.png"); - robotContext.getCaptureSupport().saveImage(resizedImage, tempPath); + robotContext().getCaptureSupport().saveImage(resizedImage, tempPath); File imageFile = convertToJpeg(tempPath); byte[] imageBytes = IOUtils.toByteArray(new FileInputStream(imageFile)); @@ -157,7 +157,7 @@ public Object loadImageFromUrl(String url) { public void saveImageAs(Image image, String path) { try { RobotLog.info("Saving image \"" + image + "\" to path \"" + path + "\""); - robotContext.getCaptureSupport().saveImage(image, Paths.get(path)); + robotContext().getCaptureSupport().saveImage(image, Paths.get(path)); } catch (Exception e) { if(e instanceof JavaFXLibraryNonFatalException) throw e; diff --git a/src/main/java/javafxlibrary/utils/HelperFunctions.java b/src/main/java/javafxlibrary/utils/HelperFunctions.java index d14142d..509be25 100644 --- a/src/main/java/javafxlibrary/utils/HelperFunctions.java +++ b/src/main/java/javafxlibrary/utils/HelperFunctions.java @@ -842,6 +842,28 @@ public void start(Stage primaryStage) { } } + public static Application createThreadedWrapperApplication(Class c, String... appArgs) { + try { + Method main = c.getMethod("main", String[].class); + return new Application() { + @Override + public void start(Stage primaryStage) { + Thread t = new Thread (() -> { + try { + main.invoke(null, (Object) appArgs); + + } catch (IllegalAccessException | InvocationTargetException e) { + throw new JavaFXLibraryNonFatalException("Unable to launch application: " + c.getName(), e); + } + }); + t.start(); + } + }; + } catch (NoSuchMethodException e) { + throw new JavaFXLibraryNonFatalException("Couldn't create wrapper application for " + c.getName(), e); + } + } + public static Finder createFinder() { return new Finder(); } diff --git a/src/main/java/javafxlibrary/utils/Session.java b/src/main/java/javafxlibrary/utils/Session.java index 45b78a5..5554031 100644 --- a/src/main/java/javafxlibrary/utils/Session.java +++ b/src/main/java/javafxlibrary/utils/Session.java @@ -24,14 +24,13 @@ import javafxlibrary.exceptions.JavaFXLibraryNonFatalException; import org.testfx.api.FxRobot; import org.testfx.api.FxToolkit; -import org.testfx.framework.junit.ApplicationTest; import javax.swing.*; import java.awt.*; import java.awt.event.WindowEvent; import java.util.concurrent.TimeoutException; -public class Session extends ApplicationTest { +public class Session { public Stage primaryStage; public FxRobot sessionRobot; @@ -40,7 +39,7 @@ public class Session extends ApplicationTest { public String screenshotDirectory = null; public Session(String appName, String... appArgs) { - try{ + try { // start the client this.primaryStage = FxToolkit.registerPrimaryStage(); this.sessionApplication = FxToolkit.setupApplication((Class)Class.forName(appName), appArgs); @@ -88,7 +87,7 @@ public void closeApplication() { sessionRobot.release(new KeyCode[] {}); sessionRobot.release(new MouseButton[] {}); FxToolkit.cleanupApplication(sessionApplication); - } catch (Exception e){ + } catch (Exception e) { throw new JavaFXLibraryNonFatalException("Problem shutting down the application: " + e.getMessage(), e); } } diff --git a/src/main/java/javafxlibrary/utils/TestFxAdapter.java b/src/main/java/javafxlibrary/utils/TestFxAdapter.java index 4ce01d9..9d79ce7 100644 --- a/src/main/java/javafxlibrary/utils/TestFxAdapter.java +++ b/src/main/java/javafxlibrary/utils/TestFxAdapter.java @@ -35,12 +35,6 @@ public static void setRobot(FxRobotInterface robot) { } public static FxRobotInterface getRobot() { return robot; } - // current robot context - protected static FxRobotContext robotContext; - public static void setRobotContext(FxRobotContext context) { - TestFxAdapter.robotContext = context; - } - // TODO: consider adding support for multiple sessions private static Session activeSession = null; @@ -62,14 +56,12 @@ in their start method for the controller class to load properly */ } setRobot(activeSession.sessionRobot); - setRobotContext(activeSession.robotContext()); } public void createNewSession(Application application) { activeSession = new Session(application); setRobot(activeSession.sessionRobot); - setRobotContext(activeSession.robotContext()); } public void deleteSession() { @@ -95,17 +87,17 @@ public String getCurrentSessionScreenshotDirectory() { public void setCurrentSessionScreenshotDirectory(String dir){ - if(activeSession != null) { + if (activeSession != null) { File errDir = new File(dir); - if(!errDir.exists()) + if (!errDir.exists()) errDir.mkdirs(); activeSession.screenshotDirectory = dir; - } - else + } else { throw new JavaFXLibraryNonFatalException("Unable to set screenshot directory, no application is currently open!"); + } } public static FxRobotContext robotContext() { - return robotContext; + return activeSession.sessionRobot.robotContext(); } } diff --git a/src/main/java/javafxlibrary/testapps/DatePickerApp.java b/src/test/java/javafxlibrary/testapps/DatePickerApp.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/DatePickerApp.java rename to src/test/java/javafxlibrary/testapps/DatePickerApp.java diff --git a/src/main/java/javafxlibrary/testapps/DemoApp.java b/src/test/java/javafxlibrary/testapps/DemoApp.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/DemoApp.java rename to src/test/java/javafxlibrary/testapps/DemoApp.java diff --git a/src/main/java/javafxlibrary/testapps/FinderApp.java b/src/test/java/javafxlibrary/testapps/FinderApp.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/FinderApp.java rename to src/test/java/javafxlibrary/testapps/FinderApp.java diff --git a/src/main/java/javafxlibrary/testapps/MenuApp.java b/src/test/java/javafxlibrary/testapps/MenuApp.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/MenuApp.java rename to src/test/java/javafxlibrary/testapps/MenuApp.java diff --git a/src/main/java/javafxlibrary/testapps/SwingApplication.java b/src/test/java/javafxlibrary/testapps/SwingApplication.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/SwingApplication.java rename to src/test/java/javafxlibrary/testapps/SwingApplication.java diff --git a/src/main/java/javafxlibrary/testapps/SwingApplicationWrapper.java b/src/test/java/javafxlibrary/testapps/SwingApplicationWrapper.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/SwingApplicationWrapper.java rename to src/test/java/javafxlibrary/testapps/SwingApplicationWrapper.java diff --git a/src/main/java/javafxlibrary/testapps/TestBoundsLocation.java b/src/test/java/javafxlibrary/testapps/TestBoundsLocation.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestBoundsLocation.java rename to src/test/java/javafxlibrary/testapps/TestBoundsLocation.java diff --git a/src/main/java/javafxlibrary/testapps/TestClickRobot.java b/src/test/java/javafxlibrary/testapps/TestClickRobot.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestClickRobot.java rename to src/test/java/javafxlibrary/testapps/TestClickRobot.java diff --git a/src/main/java/javafxlibrary/testapps/TestDragRobot.java b/src/test/java/javafxlibrary/testapps/TestDragRobot.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestDragRobot.java rename to src/test/java/javafxlibrary/testapps/TestDragRobot.java diff --git a/src/main/java/javafxlibrary/testapps/TestKeyboardRobot.java b/src/test/java/javafxlibrary/testapps/TestKeyboardRobot.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestKeyboardRobot.java rename to src/test/java/javafxlibrary/testapps/TestKeyboardRobot.java diff --git a/src/main/java/javafxlibrary/testapps/TestMultipleWindows.java b/src/test/java/javafxlibrary/testapps/TestMultipleWindows.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestMultipleWindows.java rename to src/test/java/javafxlibrary/testapps/TestMultipleWindows.java diff --git a/src/main/java/javafxlibrary/testapps/TestPointLocation.java b/src/test/java/javafxlibrary/testapps/TestPointLocation.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestPointLocation.java rename to src/test/java/javafxlibrary/testapps/TestPointLocation.java diff --git a/src/main/java/javafxlibrary/testapps/TestScreenCapturing.java b/src/test/java/javafxlibrary/testapps/TestScreenCapturing.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestScreenCapturing.java rename to src/test/java/javafxlibrary/testapps/TestScreenCapturing.java diff --git a/src/main/java/javafxlibrary/testapps/TestScrollRobot.java b/src/test/java/javafxlibrary/testapps/TestScrollRobot.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestScrollRobot.java rename to src/test/java/javafxlibrary/testapps/TestScrollRobot.java diff --git a/src/main/java/javafxlibrary/testapps/TestScrollRobot2.java b/src/test/java/javafxlibrary/testapps/TestScrollRobot2.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestScrollRobot2.java rename to src/test/java/javafxlibrary/testapps/TestScrollRobot2.java diff --git a/src/main/java/javafxlibrary/testapps/TestSleepRobot.java b/src/test/java/javafxlibrary/testapps/TestSleepRobot.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestSleepRobot.java rename to src/test/java/javafxlibrary/testapps/TestSleepRobot.java diff --git a/src/main/java/javafxlibrary/testapps/TestTableManagement.java b/src/test/java/javafxlibrary/testapps/TestTableManagement.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestTableManagement.java rename to src/test/java/javafxlibrary/testapps/TestTableManagement.java diff --git a/src/main/java/javafxlibrary/testapps/TestWindowManagement.java b/src/test/java/javafxlibrary/testapps/TestWindowManagement.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/TestWindowManagement.java rename to src/test/java/javafxlibrary/testapps/TestWindowManagement.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/DemoAppController.java b/src/test/java/javafxlibrary/testapps/controllers/DemoAppController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/DemoAppController.java rename to src/test/java/javafxlibrary/testapps/controllers/DemoAppController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/ImageDemoController.java b/src/test/java/javafxlibrary/testapps/controllers/ImageDemoController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/ImageDemoController.java rename to src/test/java/javafxlibrary/testapps/controllers/ImageDemoController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/MenuAppController.java b/src/test/java/javafxlibrary/testapps/controllers/MenuAppController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/MenuAppController.java rename to src/test/java/javafxlibrary/testapps/controllers/MenuAppController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestBoundsLocationController.java b/src/test/java/javafxlibrary/testapps/controllers/TestBoundsLocationController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestBoundsLocationController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestBoundsLocationController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestClickRobotController.java b/src/test/java/javafxlibrary/testapps/controllers/TestClickRobotController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestClickRobotController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestClickRobotController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestDragRobotController.java b/src/test/java/javafxlibrary/testapps/controllers/TestDragRobotController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestDragRobotController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestDragRobotController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestKeyboardRobotController.java b/src/test/java/javafxlibrary/testapps/controllers/TestKeyboardRobotController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestKeyboardRobotController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestKeyboardRobotController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestMultipleWindowsController.java b/src/test/java/javafxlibrary/testapps/controllers/TestMultipleWindowsController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestMultipleWindowsController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestMultipleWindowsController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestPointLocationController.java b/src/test/java/javafxlibrary/testapps/controllers/TestPointLocationController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestPointLocationController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestPointLocationController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestScreenCapturingController.java b/src/test/java/javafxlibrary/testapps/controllers/TestScreenCapturingController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestScreenCapturingController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestScreenCapturingController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestScrollRobot2Controller.java b/src/test/java/javafxlibrary/testapps/controllers/TestScrollRobot2Controller.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestScrollRobot2Controller.java rename to src/test/java/javafxlibrary/testapps/controllers/TestScrollRobot2Controller.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestScrollRobotController.java b/src/test/java/javafxlibrary/testapps/controllers/TestScrollRobotController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestScrollRobotController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestScrollRobotController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestSleepRobotController.java b/src/test/java/javafxlibrary/testapps/controllers/TestSleepRobotController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestSleepRobotController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestSleepRobotController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TestWindowManagementController.java b/src/test/java/javafxlibrary/testapps/controllers/TestWindowManagementController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TestWindowManagementController.java rename to src/test/java/javafxlibrary/testapps/controllers/TestWindowManagementController.java diff --git a/src/main/java/javafxlibrary/testapps/controllers/TextListController.java b/src/test/java/javafxlibrary/testapps/controllers/TextListController.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/controllers/TextListController.java rename to src/test/java/javafxlibrary/testapps/controllers/TextListController.java diff --git a/src/main/java/javafxlibrary/testapps/customcomponents/ColorChangingRectangle.java b/src/test/java/javafxlibrary/testapps/customcomponents/ColorChangingRectangle.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/customcomponents/ColorChangingRectangle.java rename to src/test/java/javafxlibrary/testapps/customcomponents/ColorChangingRectangle.java diff --git a/src/main/java/javafxlibrary/testapps/customcomponents/ImageDemo.java b/src/test/java/javafxlibrary/testapps/customcomponents/ImageDemo.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/customcomponents/ImageDemo.java rename to src/test/java/javafxlibrary/testapps/customcomponents/ImageDemo.java diff --git a/src/main/java/javafxlibrary/testapps/customcomponents/Statistic.java b/src/test/java/javafxlibrary/testapps/customcomponents/Statistic.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/customcomponents/Statistic.java rename to src/test/java/javafxlibrary/testapps/customcomponents/Statistic.java diff --git a/src/main/java/javafxlibrary/testapps/customcomponents/TextList.java b/src/test/java/javafxlibrary/testapps/customcomponents/TextList.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/customcomponents/TextList.java rename to src/test/java/javafxlibrary/testapps/customcomponents/TextList.java diff --git a/src/main/java/javafxlibrary/testapps/customcomponents/TextRow.java b/src/test/java/javafxlibrary/testapps/customcomponents/TextRow.java similarity index 100% rename from src/main/java/javafxlibrary/testapps/customcomponents/TextRow.java rename to src/test/java/javafxlibrary/testapps/customcomponents/TextRow.java diff --git a/src/test/robotframework/resource.robot b/src/test/robotframework/resource.robot index 2802640..bff1e77 100644 --- a/src/test/robotframework/resource.robot +++ b/src/test/robotframework/resource.robot @@ -1,7 +1,11 @@ +*** Variables *** +${appJar} javafxlibrary-*-tests.jar + *** Keywords *** Import JavaFXLibrary Run Keyword If sys.platform.startswith('java') Import Library JavaFXLibrary ... ELSE Import Library Remote http://javafxcompile:8270 WITH NAME RemoteJavaFXLibrary + Set To Classpath ${appJar} Disable Embedded Image Logging For Negative Tests :FOR ${tag} IN @{TEST TAGS} From e82853ba9887ebb1182a2290681576e36bc78acf Mon Sep 17 00:00:00 2001 From: Sami Pesonen Date: Wed, 28 Nov 2018 22:56:51 +0200 Subject: [PATCH 14/59] 0.5.2 released --- docs/javafxlibrary.html | 1822 ++++++++--------- .../keywords/Keywords/KeyboardRobot.java | 2 +- 2 files changed, 912 insertions(+), 912 deletions(-) diff --git a/docs/javafxlibrary.html b/docs/javafxlibrary.html index de3aa26..7d15eb3 100644 --- a/docs/javafxlibrary.html +++ b/docs/javafxlibrary.html @@ -1,911 +1,911 @@ - - - - - - - - - - - - - - - - - - - -Codestin Search App - - - -
-

Opening library documentation failed

-
    -
  • Verify that you have JavaScript enabled in your browser.
  • -
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • -
  • Check are there messages in your browser's JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • -
-
- - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + +Codestin Search App + + + +
+

Opening library documentation failed

+
    +
  • Verify that you have JavaScript enabled in your browser.
  • +
  • Make sure you are using a modern enough browser. Firefox 3.5, IE 8, or equivalent is required, newer browsers are recommended.
  • +
  • Check are there messages in your browser's JavaScript error log. Please report the problem if you suspect you have encountered a bug.
  • +
+
+ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/java/javafxlibrary/keywords/Keywords/KeyboardRobot.java b/src/main/java/javafxlibrary/keywords/Keywords/KeyboardRobot.java index b45b44f..828a277 100644 --- a/src/main/java/javafxlibrary/keywords/Keywords/KeyboardRobot.java +++ b/src/main/java/javafxlibrary/keywords/Keywords/KeyboardRobot.java @@ -204,7 +204,7 @@ public void writeFast(String text) { + "`3. Locating or specifying UI elements`. \n\n" + "``text`` is the text characters to write\n" + "\nExample: \n" - + "| Write To | Robot Framework | \n") + + "| Write To | .css-name | Robot Framework | \n") @ArgumentNames({ "locator", "text" }) public FxRobotInterface writeTo(Object locator, String text) { RobotLog.info("Writing to " + locator); From 233a42ff696e7886d98aaf6ef5d4bf16d87a4489 Mon Sep 17 00:00:00 2001 From: Sami Pesonen Date: Thu, 29 Nov 2018 09:26:27 +0200 Subject: [PATCH 15/59] development branch with 0.5.3-SNAPSHOT --- pom.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pom.xml b/pom.xml index c011ec2..114f5e2 100644 --- a/pom.xml +++ b/pom.xml @@ -21,7 +21,7 @@ org.robotframework javafxlibrary jar - 0.5.2 + 0.5.3-SNAPSHOT UTF-8 From 599c6df0e267f01e532825a33182d5e230675123 Mon Sep 17 00:00:00 2001 From: Sami Pesonen Date: Thu, 29 Nov 2018 10:13:54 +0200 Subject: [PATCH 16/59] add Nexus part to BUILD.md --- BUILD.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/BUILD.md b/BUILD.md index 903c64e..defb0d8 100644 --- a/BUILD.md +++ b/BUILD.md @@ -58,8 +58,12 @@ JavaFXLibrary uses Apache Maven as a build tool. ```` * Release snapshot or actual release (depending what is in version tag in pom.xml)``mvn clean deploy -P release`` + * In case of release log in to https://oss.sonatype.org: + * from left choose `Staging repositories` and scroll down, choose `robotframework-*` repository and review + * choose from top toolbar `Release`, add to reason field `x.y.z release` and submit + * sync takes typically hours before visible in Maven Central * snapshots can be found from https://oss.sonatype.org/content/repositories/snapshots/org/robotframework/javafxlibrary/ - * actual releases can be found from https://search.maven.org/ and typing `javafxlibrary` in the search field. + * actual releases can be found from https://search.maven.org/ and typing `javafxlibrary` in the search field. ## Announcements From 10e29319d305ed332af251346058111a9903b5ff Mon Sep 17 00:00:00 2001 From: Juho Saarinen Date: Thu, 29 Nov 2018 14:56:06 +0200 Subject: [PATCH 17/59] Helper function for bringing the window that's going to be clicked on the front --- src/main/java/javafxlibrary/utils/HelperFunctions.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/javafxlibrary/utils/HelperFunctions.java b/src/main/java/javafxlibrary/utils/HelperFunctions.java index 509be25..e4a7327 100644 --- a/src/main/java/javafxlibrary/utils/HelperFunctions.java +++ b/src/main/java/javafxlibrary/utils/HelperFunctions.java @@ -29,6 +29,7 @@ import javafx.stage.Window; import javafxlibrary.exceptions.JavaFXLibraryNonFatalException; import javafxlibrary.exceptions.JavaFXLibraryTimeoutException; +import javafxlibrary.keywords.AdditionalKeywords.ConvenienceKeywords; import javafxlibrary.matchers.ProgressBarMatchers; import javafxlibrary.utils.finder.Finder; import org.apache.commons.lang3.StringUtils; @@ -425,6 +426,7 @@ public static void checkClickLocation(int x, int y) { public static void checkClickLocation(Object object) { RobotLog.trace("Checking if target \"" + object.toString() + "\" is within active window"); + verifyClickLocationOnFront(object); if (safeClicking) { @@ -438,6 +440,10 @@ public static void checkClickLocation(Object object) { } RobotLog.trace("Target location checks out OK, it is within active window"); } + + public static void verifyClickLocationOnFront(Object object) { + new ConvenienceKeywords().bringStageToFront((Stage) objectToNode(object).getScene().getWindow()); + } public static Object checkClickTarget(Object target) { try { From a480220f54074cb067f88528f4269f4b752e878d Mon Sep 17 00:00:00 2001 From: Juho Saarinen Date: Fri, 30 Nov 2018 09:49:55 +0200 Subject: [PATCH 18/59] Storing info about headless execution to variable Using normal write if fast write is called at headless mode At clicking trying to bring window containing element to the top --- src/main/java/JavaFXLibrary.java | 2 ++ .../keywords/Keywords/KeyboardRobot.java | 33 +++++++++++-------- .../javafxlibrary/utils/HelperFunctions.java | 12 ++++--- .../javafxlibrary/utils/TestFxAdapter.java | 1 + 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/src/main/java/JavaFXLibrary.java b/src/main/java/JavaFXLibrary.java index 54d65a3..984259d 100644 --- a/src/main/java/JavaFXLibrary.java +++ b/src/main/java/JavaFXLibrary.java @@ -31,6 +31,7 @@ import javafxlibrary.keywords.AdditionalKeywords.RunOnFailure; import javafxlibrary.utils.HelperFunctions; import javafxlibrary.utils.RobotLog; +import javafxlibrary.utils.TestFxAdapter; import javafxlibrary.utils.TestListener; import org.apache.commons.io.FileUtils; import org.python.google.common.base.Throwables; @@ -69,6 +70,7 @@ public JavaFXLibrary(boolean headless) { System.setProperty("testfx.headless", "true"); System.setProperty("prism.order", "sw"); System.setProperty("prism.text", "t2k"); + TestFxAdapter.isHeadless = true; } else { //v4.0.15-alpha sets default robot as glass, which breaks rolling //Forcing usage of awt robot as previous versions diff --git a/src/main/java/javafxlibrary/keywords/Keywords/KeyboardRobot.java b/src/main/java/javafxlibrary/keywords/Keywords/KeyboardRobot.java index 828a277..eb31498 100644 --- a/src/main/java/javafxlibrary/keywords/Keywords/KeyboardRobot.java +++ b/src/main/java/javafxlibrary/keywords/Keywords/KeyboardRobot.java @@ -183,20 +183,25 @@ public FxRobotInterface write(String text) { + "| Write Fast | Robot Framework | \n") @ArgumentNames({ "text" }) public void writeFast(String text) { - try { - Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); - StringSelection testData = new StringSelection(text); - c.setContents(testData, testData); - - if(isMac()) - robot.push(KeyCode.META, KeyCode.V).sleep(100); - else - robot.push(KeyCode.CONTROL, KeyCode.V).sleep(100); - } catch (Exception e) { - if(e instanceof JavaFXLibraryNonFatalException) - throw e; - throw new JavaFXLibraryNonFatalException("Unable to write text using copy/paste method.", e); - } + if (TestFxAdapter.isHeadless) { + RobotLog.info("Fast write not working in headless mode. Writing text normally"); + this.write(text); + } else { + try { + Clipboard c = Toolkit.getDefaultToolkit().getSystemClipboard(); + StringSelection testData = new StringSelection(text); + c.setContents(testData, testData); + + if(isMac()) + robot.push(KeyCode.META, KeyCode.V).sleep(100); + else + robot.push(KeyCode.CONTROL, KeyCode.V).sleep(100); + } catch (Exception e) { + if(e instanceof JavaFXLibraryNonFatalException) + throw e; + throw new JavaFXLibraryNonFatalException("Unable to write text using copy/paste method.", e); + } + } } @RobotKeyword("Writes a given text characters one after the other to given locator.\n\n" diff --git a/src/main/java/javafxlibrary/utils/HelperFunctions.java b/src/main/java/javafxlibrary/utils/HelperFunctions.java index e4a7327..04e4983 100644 --- a/src/main/java/javafxlibrary/utils/HelperFunctions.java +++ b/src/main/java/javafxlibrary/utils/HelperFunctions.java @@ -426,7 +426,6 @@ public static void checkClickLocation(int x, int y) { public static void checkClickLocation(Object object) { RobotLog.trace("Checking if target \"" + object.toString() + "\" is within active window"); - verifyClickLocationOnFront(object); if (safeClicking) { @@ -442,15 +441,20 @@ public static void checkClickLocation(Object object) { } public static void verifyClickLocationOnFront(Object object) { - new ConvenienceKeywords().bringStageToFront((Stage) objectToNode(object).getScene().getWindow()); + try { + new ConvenienceKeywords().bringStageToFront((Stage) objectToNode(object).getScene().getWindow()); + } catch (Exception e) { + RobotLog.trace("Node's window wasn't castable to Stage. Tried with object: "+object); + } } public static Object checkClickTarget(Object target) { try { - if (target instanceof String || target instanceof Node) + if (target instanceof String || target instanceof Node) { target = waitUntilEnabled(waitUntilVisible(target, waitUntilTimeout), waitUntilTimeout); - + verifyClickLocationOnFront(target); + } checkClickLocation(target); return target; diff --git a/src/main/java/javafxlibrary/utils/TestFxAdapter.java b/src/main/java/javafxlibrary/utils/TestFxAdapter.java index 9d79ce7..3fd7b45 100644 --- a/src/main/java/javafxlibrary/utils/TestFxAdapter.java +++ b/src/main/java/javafxlibrary/utils/TestFxAdapter.java @@ -28,6 +28,7 @@ public class TestFxAdapter { + public static boolean isHeadless = false; // current robot instance in use protected static FxRobotInterface robot; public static void setRobot(FxRobotInterface robot) { From bbb9236dd8a923ddefeba3786327d2652ec4059d Mon Sep 17 00:00:00 2001 From: Juho Saarinen Date: Fri, 30 Nov 2018 12:50:05 +0200 Subject: [PATCH 19/59] - Tagging monocle failing tests with "monocle-issue" if headless mode is enabled - Checking in scrolling tests that app is in right stage at the beginning of test case - Initializing library as headless mode false --- src/test/robotframework/acceptance/ScrollRobotTest.robot | 1 + src/test/robotframework/acceptance/ScrollRobotTest2.robot | 8 ++++++++ .../acceptance/SwingApplicationWrapperTest.robot | 3 +++ src/test/robotframework/acceptance/WindowLookupTest.robot | 1 + src/test/robotframework/resource.robot | 5 +++-- 5 files changed, 16 insertions(+), 2 deletions(-) diff --git a/src/test/robotframework/acceptance/ScrollRobotTest.robot b/src/test/robotframework/acceptance/ScrollRobotTest.robot index f84cc8d..8ed56ed 100644 --- a/src/test/robotframework/acceptance/ScrollRobotTest.robot +++ b/src/test/robotframework/acceptance/ScrollRobotTest.robot @@ -69,6 +69,7 @@ Scroll Right *** Keywords *** Setup all tests Import JavaFXLibrary + Run Keyword If ${headless} Set Tags monocle-issue Launch Javafx Application ${TEST_APPLICATION} Set Screenshot Directory ${OUTPUT_DIR}${/}report-images Set Variables diff --git a/src/test/robotframework/acceptance/ScrollRobotTest2.robot b/src/test/robotframework/acceptance/ScrollRobotTest2.robot index abe7f4c..6f046e8 100644 --- a/src/test/robotframework/acceptance/ScrollRobotTest2.robot +++ b/src/test/robotframework/acceptance/ScrollRobotTest2.robot @@ -13,23 +13,27 @@ ${TEST_APPLICATION} javafxlibrary.testapps.TestScrollRobot2 *** Test Cases *** Scroll down [Tags] smoke demo-set + Verify String Should Not Match id=verticalScrollLocation max Scroll Vertically DOWN 50 Verify String id=verticalScrollLocation max Scroll up [Tags] smoke demo-set + Verify String Should Not Match id=verticalScrollLocation min Scroll Vertically UP 50 Verify String id=verticalScrollLocation min Scroll right [Tags] smoke demo-set Skip Test On Linux + Verify String Should Not Match id=horizontalScrollLocation max Scroll Horizontally RIGHT 50 Verify String id=horizontalScrollLocation max Scroll left [Tags] smoke demo-set Skip Test On Linux + Verify String Should Not Match id=horizontalScrollLocation min Scroll Horizontally LEFT 50 Verify String id=horizontalScrollLocation min @@ -41,24 +45,28 @@ Scroll down once Scroll up once [Tags] smoke + Verify String Should Not Match id=verticalScrollLocation min Scroll Vertically UP 1 Verify String id=verticalScrollLocation min Scroll Right Once [Tags] smoke Skip Test On Linux + Verify String id=horizontalScrollLocation min Scroll Horizontally RIGHT 1 Verify String Should Not Match id=horizontalScrollLocation min Scroll Left Once [Tags] smoke Skip Test On Linux + Verify String Should Not Match id=horizontalScrollLocation min Scroll Horizontally LEFT 1 Verify String id=horizontalScrollLocation min *** Keywords *** Setup all tests Import JavaFXLibrary + Run Keyword If ${headless} Set Tags monocle-issue Launch Javafx Application ${TEST_APPLICATION} Set Screenshot Directory ${OUTPUT_DIR}${/}report-images Move To id=scrollPane diff --git a/src/test/robotframework/acceptance/SwingApplicationWrapperTest.robot b/src/test/robotframework/acceptance/SwingApplicationWrapperTest.robot index 430e053..1043cfa 100644 --- a/src/test/robotframework/acceptance/SwingApplicationWrapperTest.robot +++ b/src/test/robotframework/acceptance/SwingApplicationWrapperTest.robot @@ -9,6 +9,7 @@ Test Teardown Teardown Test Case *** Testcases *** Swing Embedded JavaFX Click Test [Tags] smoke demo-set + Run Keyword If ${headless} Set Tags monocle-issue Launch Swing Application javafxlibrary.testapps.SwingApplication Wait Until Keyword Succeeds 15 sec 250ms Find css=.button failIfNotFound=True ${colors} Create List 0xdc143cff 0x00fa9aff 0xee82eeff 0xffff00ff 0x00ffffff @@ -19,6 +20,7 @@ Swing Embedded JavaFX Click Test Swing Embedded JavaFX Type Test [Tags] smoke + Run Keyword If ${headless} Set Tags monocle-issue Launch Swing Application javafxlibrary.testapps.SwingApplication Wait Until Keyword Succeeds 15 sec 250ms Find id=textField failIfNotFound=True Write To id=textField JavaFXLibrary @@ -26,6 +28,7 @@ Swing Embedded JavaFX Type Test Launch Swing Application Using External Wrapper Class [Tags] smoke + Run Keyword If ${headless} Set Tags monocle-issue Launch Javafx Application javafxlibrary.testapps.SwingApplicationWrapper Wait Until Keyword Succeeds 15 sec 250ms Find id=textField failIfNotFound=True Write To id=textField JavaFXLibrary diff --git a/src/test/robotframework/acceptance/WindowLookupTest.robot b/src/test/robotframework/acceptance/WindowLookupTest.robot index a0fb5fd..271a7f9 100644 --- a/src/test/robotframework/acceptance/WindowLookupTest.robot +++ b/src/test/robotframework/acceptance/WindowLookupTest.robot @@ -91,6 +91,7 @@ Bring Stage To Front # Keyword is located in TypeRobot Close Current Window [Tags] smoke set-todo + Run Keyword If ${headless} Set Tags monocle-issue ${START} List Windows Activate window @{START}[0] Close Current Window diff --git a/src/test/robotframework/resource.robot b/src/test/robotframework/resource.robot index bff1e77..754f8d3 100644 --- a/src/test/robotframework/resource.robot +++ b/src/test/robotframework/resource.robot @@ -1,10 +1,11 @@ *** Variables *** ${appJar} javafxlibrary-*-tests.jar +${headless} ${False} *** Keywords *** Import JavaFXLibrary - Run Keyword If sys.platform.startswith('java') Import Library JavaFXLibrary - ... ELSE Import Library Remote http://javafxcompile:8270 WITH NAME RemoteJavaFXLibrary + Run Keyword If sys.platform.startswith('java') Import Library JavaFXLibrary ${headless} + ... ELSE Import Library Remote http://javafxcompile:8270 ${headless} WITH NAME RemoteJavaFXLibrary Set To Classpath ${appJar} Disable Embedded Image Logging For Negative Tests From 14085d31a0737dc6aaf060ea9fd6ed45189e6403 Mon Sep 17 00:00:00 2001 From: Juho Saarinen Date: Fri, 30 Nov 2018 12:54:19 +0200 Subject: [PATCH 20/59] Updated documentation monocle-issue as non-critical tag --- BUILD.md | 4 ++-- README.md | 33 ++++++++++++++++++++++++++++++--- pom.xml | 3 +++ 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/BUILD.md b/BUILD.md index defb0d8..7265cc9 100644 --- a/BUILD.md +++ b/BUILD.md @@ -16,8 +16,8 @@ JavaFXLibrary uses Apache Maven as a build tool. are being used by both JavaFXLibrary and the AUT. It's not uncommon that a specific version is needed for AUT and another version of the same dependency is required for JavaFXLibrary(e.g. TestFX dependency for Google Guava). Not always are these dependencies backwards compatible and therefore JavaFXLibrary has adopted Apache Maven Shade Plugin to cope with this issue. - Currently the package com.google.common has been renamed in JavaFXLibrary as shaded.com.google.common to avoid version - mismatches with Google Guava dependencies. See https://maven.apache.org/plugins/maven-shade-plugin/ for more info. + Currently the package com.google.common has been renamed in JavaFXLibrary as shaded.com.google.common and org.apache.commons as shaded.org.apache.commons to avoid version + mismatches with dependencies in AUT and internally. See https://maven.apache.org/plugins/maven-shade-plugin/ for more info. ## Releasing diff --git a/README.md b/README.md index 9d5acd1..2302f0f 100644 --- a/README.md +++ b/README.md @@ -7,7 +7,9 @@ JavaFXLibrary works with both Jython (local and remote use) and Python (remote o JavaFXLibrary is tested to work with Robot Framework 3.0.2 or later. ## Keyword documentation -See keyword [documentation](https://eficode.github.io/JavaFXLibrary/javafxlibrary.html). +See keyword [documentation](https://repo1.maven.org/maven2/org/robotframework/javafxlibrary/0.5.2/javafxlibrary-0.5.2.html). + +For editors (IDEs) keyword documentation can be obtained from [here](https://repo1.maven.org/maven2/org/robotframework/javafxlibrary/0.5.2/javafxlibrary-0.5.2.xml). ## Taking the library into use ### As a local library @@ -17,7 +19,7 @@ See keyword [documentation](https://eficode.github.io/JavaFXLibrary/javafxlibrar *** Settings *** Library JavaFXLibrary ``` -3. Add library jar to Jython [module search path](http://robotframework.org/robotframework/3.0b1/RobotFrameworkUserGuide.html#configuring-where-to-search-libraries-and-other-extensions) and run your tests: +3. Add library jar to Jython [module search path](http://robotframework.org/robotframework/3.0.4/RobotFrameworkUserGuide.html#configuring-where-to-search-libraries-and-other-extensions) and run your tests: ``` jython -J-cp javafxlibrary-.jar -m robot.run tests.robot ``` @@ -70,4 +72,29 @@ Library's acceptance test suite can be used as a JavaFXLibrary demo. Running the Executing _test.sh_ runs the acceptance suite twice: first using JavaFXLibrary as a local Robot Framework library on Jython, and after that using the library in remote mode executing the same tests on python version of Robot Framework. -If you want the suite to run only once, you can define which type of library to use by including **local** or **remote** as an argument. For example command `test.sh remote` will execute the suite only in remote mode. \ No newline at end of file +If you want the suite to run only once, you can define which type of library to use by including **local** or **remote** as an argument. For example command `test.sh remote` will execute the suite only in remote mode. + +## Experimental: Headless support +Library supports headless operation utilizing [Monocle](https://wiki.openjdk.java.net/display/OpenJFX/Monocle). The support for this is still at experimental level. + +### Main issues with headless function +* Scrolling doesn't work same way as with screen +** "Tick" (amount of scrolling) is much smaller in headless than normally +** Vertical (left/right) scrolling is not working +* Separate app windows' can't be closed (unless app offers that functionality itself) +* Swing applications can't be tested in headless mode. + +### Enabling headless mode +Headless mode can be enabled by setting first library initialization to "True". + +Locally: +``` +*** Settings *** +Library JavaFXLibrary ${True} +``` + +Remote: +``` +*** Settings *** +Library Remote http://127.0.0.1:8270 ${True} WITH NAME JavaFXLibrary +``` \ No newline at end of file diff --git a/pom.xml b/pom.xml index 79246a9..ce5cfcb 100644 --- a/pom.xml +++ b/pom.xml @@ -255,6 +255,9 @@ not-ready + + monocle-issue + TRACE:INFO false From e2c774a7e1fc1d6da3f7e054bc9da5316a558300 Mon Sep 17 00:00:00 2001 From: Juho Saarinen Date: Fri, 30 Nov 2018 14:23:48 +0200 Subject: [PATCH 21/59] Fixed list indent --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 2302f0f..0128a0d 100644 --- a/README.md +++ b/README.md @@ -79,8 +79,8 @@ Library supports headless operation utilizing [Monocle](https://wiki.openjdk.jav ### Main issues with headless function * Scrolling doesn't work same way as with screen -** "Tick" (amount of scrolling) is much smaller in headless than normally -** Vertical (left/right) scrolling is not working + * "Tick" (amount of scrolling) is much smaller in headless than normally + * Vertical (left/right) scrolling is not working * Separate app windows' can't be closed (unless app offers that functionality itself) * Swing applications can't be tested in headless mode. From f56306a2b762da44949bf317512b979db481190c Mon Sep 17 00:00:00 2001 From: Juho Saarinen Date: Tue, 4 Dec 2018 08:37:00 +0200 Subject: [PATCH 22/59] Capturing active window if locator is not given Capturing full screen in case of error (as focus is not probably set to window that is interesting Possibility to capture whole (primary) screen as a separate keyword Fixes eficode/JavaFXLibrary#19 --- .../AdditionalKeywords/RunOnFailure.java | 34 +++++++++++-------- .../keywords/Keywords/ScreenCapturing.java | 34 +++++++++++++++++-- 2 files changed, 52 insertions(+), 16 deletions(-) diff --git a/src/main/java/javafxlibrary/keywords/AdditionalKeywords/RunOnFailure.java b/src/main/java/javafxlibrary/keywords/AdditionalKeywords/RunOnFailure.java index bd94c52..6797357 100644 --- a/src/main/java/javafxlibrary/keywords/AdditionalKeywords/RunOnFailure.java +++ b/src/main/java/javafxlibrary/keywords/AdditionalKeywords/RunOnFailure.java @@ -17,10 +17,14 @@ package javafxlibrary.keywords.AdditionalKeywords; -import javafx.stage.Screen; +import javafx.geometry.Rectangle2D; import javafxlibrary.keywords.Keywords.ScreenCapturing; import javafxlibrary.utils.RobotLog; import javafxlibrary.utils.TestFxAdapter; + +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; + import org.robotframework.javalib.annotation.RobotKeywords; @RobotKeywords @@ -30,7 +34,7 @@ public class RunOnFailure extends TestFxAdapter{ private String runOnFailureKeyword = "Take Screenshot"; // Only run keyword on failure if false - private boolean runningOnFailureRoutine = false; + private static boolean runningOnFailureRoutine = false; // ############################## @@ -55,17 +59,19 @@ public void runOnFailure() { runningOnFailureRoutine = true; - RobotLog.info("JavaFXLibrary keyword has failed!"); - if (robot == null) { - RobotLog.error("FxRobot not initialized, launch test application with the library"); - } - - if (robot.targetWindow() != null) { - new ScreenCapturing().captureImage(robot.targetWindow()); - } else { - new ScreenCapturing().captureImage(Screen.getPrimary().getBounds()); - } - - runningOnFailureRoutine = false; + try { + RobotLog.info("JavaFXLibrary keyword has failed!"); + if (robot == null) { + RobotLog.error("FxRobot not initialized, launch test application with the library"); + } else { + GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); + RobotLog.debug("Capturing screenshot from primary screen with resolution "+gd.getDisplayMode().getWidth()+"x"+gd.getDisplayMode().getHeight()+"."); + new ScreenCapturing().captureImage(new Rectangle2D(0, 0, gd.getDisplayMode().getWidth(), gd.getDisplayMode().getHeight())); + } + } catch (Exception e) { + RobotLog.error("Error when capturing screenshot. Actual error: "+e.getMessage()); + } finally { + runningOnFailureRoutine = false; + } } } \ No newline at end of file diff --git a/src/main/java/javafxlibrary/keywords/Keywords/ScreenCapturing.java b/src/main/java/javafxlibrary/keywords/Keywords/ScreenCapturing.java index ce546dd..a240b75 100644 --- a/src/main/java/javafxlibrary/keywords/Keywords/ScreenCapturing.java +++ b/src/main/java/javafxlibrary/keywords/Keywords/ScreenCapturing.java @@ -18,8 +18,12 @@ package javafxlibrary.keywords.Keywords; import javafx.embed.swing.SwingFXUtils; +import javafx.scene.Scene; import javafx.geometry.Bounds; +import javafx.geometry.Rectangle2D; import javafxlibrary.exceptions.JavaFXLibraryNonFatalException; +import javafxlibrary.keywords.AdditionalKeywords.ConvenienceKeywords; +import javafxlibrary.keywords.AdditionalKeywords.Find; import javafxlibrary.utils.RobotLog; import javafxlibrary.utils.TestFxAdapter; import org.apache.commons.io.IOUtils; @@ -29,6 +33,9 @@ import org.robotframework.javalib.annotation.RobotKeywords; import javafx.scene.image.Image; import javax.imageio.ImageIO; + +import java.awt.GraphicsDevice; +import java.awt.GraphicsEnvironment; import java.awt.image.BufferedImage; import java.io.*; import java.net.MalformedURLException; @@ -58,13 +65,25 @@ else if (value.toLowerCase().equals("diskonly")) throw new JavaFXLibraryNonFatalException("Value \"" + value + "\" is not supported! Value must be either " + "\"EMBEDDED\" or \"DISKONLY\""); } + + @RobotKeyword("Returns a screenshot from whole primary screen. Note that this shows also other applications that are open.") + public Object capturePrimaryScreen() { + GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice(); + return this.captureImage(new Rectangle2D(0, 0, gd.getDisplayMode().getWidth(), gd.getDisplayMode().getHeight())); + } + + @RobotKeywordOverload + public Object captureImage() { + return captureImage(robot.targetWindow()); + } @RobotKeywordOverload public Object captureImage(Object locator){ return captureImage(locator, true); } - @RobotKeyword("Returns a screenshot of the given locator.\n\n" + @RobotKeyword("Returns a screenshot of the given locator, or if not given from whole active window.\n\n" + + "Note that active window might only be part of the visible window, it e.g. dialog is active.\n\n" + "``locator`` is either a _query_ or _Object:Bounds, Node, Point2D, Rectangle, PointQuery, Scene, Window_ for identifying the element, see " + "`3. Locating or specifying UI elements`. \n\n" + "Argument ``logImage`` is a boolean value that specifies whether a captured image is also printed to test execution log. \n\n " @@ -73,8 +92,9 @@ public Object captureImage(Object locator){ + "| ${capture}= | Capture Image | ${region} | \n" + "| ${capture}= | Capture Image | ${node} | \n" + "| ${capture}= | Capture Image | ${window} | \n" + + "| ${capture}= | Capture Image | | \n" + "| ${capture}= | Capture Image | \\#id | logImage=False |\n" ) - @ArgumentNames({"locator", "logImage=True"}) + @ArgumentNames({"locator=target window", "logImage=True"}) public Object captureImage(Object locator, boolean logImage){ if (locator == null) throw new JavaFXLibraryNonFatalException("Unable to capture image, given locator was null!"); @@ -118,6 +138,16 @@ public Object captureImage(Object locator, boolean logImage){ throw new JavaFXLibraryNonFatalException("Unable to take capture : \"" + locator + "\"", e); } } + + @RobotKeyword("Returns a screenshot of the scene conatining given locator.\n\n" + + "``locator`` is a query locator, see `3.1 Using queries`.\n\n " + + "\nExample:\n" + + "| ${capture}= | Capture Scene Containing Node | ${node} | \n" ) + @ArgumentNames({"locator", "logImage=True"}) + public Object captureSceneContainingNode(Object locator) { + Scene scene = (Scene) useMappedObject(new ConvenienceKeywords().getScene(locator)); + return this.captureImage(scene); + } @RobotKeyword("Loads an image from the given _path_ in hard drive \n\n" + "``path`` is the source path for image in local hard drive. \n\n" From e6704041f6e779c3565721ca019c2d87b3683473 Mon Sep 17 00:00:00 2001 From: Esko Tajakka Date: Sat, 4 May 2019 23:55:28 +0300 Subject: [PATCH 23/59] Fixed incorrect jar filename with SNAPSHOT from jar file copy step in Dockerfile_build, added print of jar files --- Dockerfile_build | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Dockerfile_build b/Dockerfile_build index d34c660..6086fa9 100644 --- a/Dockerfile_build +++ b/Dockerfile_build @@ -14,8 +14,9 @@ RUN mvn package # ENTRYPOINT java -jar /code/target/javafxlibrary-*-SNAPSHOT-jar-with-dependencies.jar FROM ubuntu:16.04 -COPY --from=builder /code/target/javafxlibrary-*-SNAPSHOT-jar-with-dependencies.jar /. -COPY --from=builder /code/target/javafxlibrary-*-SNAPSHOT-tests.jar /. +COPY --from=builder /code/target/javafxlibrary-*-jar-with-dependencies.jar /. +COPY --from=builder /code/target/javafxlibrary-*-tests.jar /. +RUN echo "Built following jar files" && ls -latr /*.jar COPY entrypoint_build.sh /. RUN apt-get -qq update && apt-get dist-upgrade -y && apt-get install -qq --no-install-recommends --allow-unauthenticated -y \ openjdk-8-jre \ From 5ba5ac7ca6b9121447112b3daeb4bd3cb1c6758e Mon Sep 17 00:00:00 2001 From: Sami Pesonen Date: Mon, 19 Aug 2019 16:03:10 +0300 Subject: [PATCH 24/59] add multipointer support to demo containers --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 6c63797..016492d 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -14,6 +14,7 @@ services: - testapp environment: - RESOLUTION=1920x1080 + - X11VNC_ARGS=-multiptr javafxcompile: build: From 8681dc1895a4729cc485e7d117292c581656d62e Mon Sep 17 00:00:00 2001 From: Sami Pesonen Date: Wed, 21 Aug 2019 12:47:58 +0300 Subject: [PATCH 25/59] SwingApplicationWrapperTest fine tuning, variable for remote hostname --- .../acceptance/SwingApplicationWrapperTest.robot | 8 ++++---- src/test/robotframework/resource.robot | 3 ++- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/src/test/robotframework/acceptance/SwingApplicationWrapperTest.robot b/src/test/robotframework/acceptance/SwingApplicationWrapperTest.robot index 1043cfa..9a16a2d 100644 --- a/src/test/robotframework/acceptance/SwingApplicationWrapperTest.robot +++ b/src/test/robotframework/acceptance/SwingApplicationWrapperTest.robot @@ -6,10 +6,10 @@ Suite Setup Import JavaFXLibrary Test Setup Disable Embedded Image Logging For Negative Tests Test Teardown Teardown Test Case -*** Testcases *** +*** Test Cases *** Swing Embedded JavaFX Click Test [Tags] smoke demo-set - Run Keyword If ${headless} Set Tags monocle-issue + Run Keyword If ${headless} Set Tags smonocle-issue Launch Swing Application javafxlibrary.testapps.SwingApplication Wait Until Keyword Succeeds 15 sec 250ms Find css=.button failIfNotFound=True ${colors} Create List 0xdc143cff 0x00fa9aff 0xee82eeff 0xffff00ff 0x00ffffff @@ -20,7 +20,7 @@ Swing Embedded JavaFX Click Test Swing Embedded JavaFX Type Test [Tags] smoke - Run Keyword If ${headless} Set Tags monocle-issue + Run Keyword If ${headless} Set Tags monocle-issue Launch Swing Application javafxlibrary.testapps.SwingApplication Wait Until Keyword Succeeds 15 sec 250ms Find id=textField failIfNotFound=True Write To id=textField JavaFXLibrary @@ -28,7 +28,7 @@ Swing Embedded JavaFX Type Test Launch Swing Application Using External Wrapper Class [Tags] smoke - Run Keyword If ${headless} Set Tags monocle-issue + Run Keyword If ${headless} Set Tags monocle-issue Launch Javafx Application javafxlibrary.testapps.SwingApplicationWrapper Wait Until Keyword Succeeds 15 sec 250ms Find id=textField failIfNotFound=True Write To id=textField JavaFXLibrary diff --git a/src/test/robotframework/resource.robot b/src/test/robotframework/resource.robot index 754f8d3..fa82c95 100644 --- a/src/test/robotframework/resource.robot +++ b/src/test/robotframework/resource.robot @@ -1,11 +1,12 @@ *** Variables *** ${appJar} javafxlibrary-*-tests.jar ${headless} ${False} +${host} javafxcompile *** Keywords *** Import JavaFXLibrary Run Keyword If sys.platform.startswith('java') Import Library JavaFXLibrary ${headless} - ... ELSE Import Library Remote http://javafxcompile:8270 ${headless} WITH NAME RemoteJavaFXLibrary + ... ELSE Import Library Remote http://${host}:8270 ${headless} WITH NAME RemoteJavaFXLibrary Set To Classpath ${appJar} Disable Embedded Image Logging For Negative Tests From cd6d81641fe4f75b3efd92acdc3ad9c84de3c7ce Mon Sep 17 00:00:00 2001 From: Sami Pesonen Date: Wed, 4 Sep 2019 12:11:30 +0300 Subject: [PATCH 26/59] workaround failIfNotFound at this point --- src/test/robotframework/acceptance/MiscTests.robot | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/robotframework/acceptance/MiscTests.robot b/src/test/robotframework/acceptance/MiscTests.robot index 20aaa9b..99f415a 100644 --- a/src/test/robotframework/acceptance/MiscTests.robot +++ b/src/test/robotframework/acceptance/MiscTests.robot @@ -15,15 +15,15 @@ ${CURRENT_APPLICATION} NOT SET Find Id That Does Not Exist [Tags] negative smoke Set Test Application javafxlibrary.testapps.TestBoundsLocation - ${MSG} Run Keyword And Expect Error * Find id=idThatDoesNotExist failIfNotFound=True + ${MSG} Run Keyword And Expect Error * Find id=idThatDoesNotExist ${True} # TODO: failIfNotFound=True Should Be Equal ${MSG} Unable to find anything with query: "id=idThatDoesNotExist" msg=Find does not fail with expected error message when query not found - ${MSG} Run Keyword Find id=idThatDoesNotExist failIfNotFound=False + ${MSG} Run Keyword Find id=idThatDoesNotExist ${False} # TODO: failIfNotFound=False Should Be Equal ${MSG} ${EMPTY} msg=Find does not return None value when query not found Find All With Wrong Style Class [Tags] negative smoke Set Test Application javafxlibrary.testapps.TestBoundsLocation - ${MSG} Run Keyword And Expect Error * Find All css=.thisIsNotAStyleClass failIfNotFound=True + ${MSG} Run Keyword And Expect Error * Find All css=.thisIsNotAStyleClass ${True} # TODO: failIfNotFound=True Should Be Equal ${MSG} Unable to find anything with query: "css=.thisIsNotAStyleClass" Print Child Nodes Of Incompatible Node From d4272a623d109e12831442d19d40d6ea18cf1987 Mon Sep 17 00:00:00 2001 From: Sami Pesonen Date: Fri, 8 Nov 2019 15:04:31 +0200 Subject: [PATCH 27/59] update dependencies, fix #26 async usage in waitUntilExists, library startup printout improvements --- pom.xml | 29 ++++++++++--------- src/main/java/JavaFXLibrary.java | 13 +++++---- .../javafxlibrary/utils/HelperFunctions.java | 21 +++++++++----- .../WaitUntilExistsTest.java | 1 - 4 files changed, 36 insertions(+), 28 deletions(-) diff --git a/pom.xml b/pom.xml index ce5cfcb..5434db4 100644 --- a/pom.xml +++ b/pom.xml @@ -80,7 +80,7 @@ org.apache.maven.plugins maven-source-plugin - 3.0.1 + 3.1.0 attach-sources @@ -93,7 +93,7 @@ org.apache.maven.plugins maven-javadoc-plugin - 3.0.1 + 3.1.1 attach-javadocs @@ -107,7 +107,7 @@ org.codehaus.mojo build-helper-maven-plugin - 1.10 + 3.0.0 attach-artifacts @@ -169,7 +169,7 @@ org.apache.maven.plugins maven-surefire-plugin - 3.0.0-M1 + 2.22.2 -javaagent:${settings.localRepository}/org/jmockit/jmockit/${jmockit.version}/jmockit-${jmockit.version}.jar @@ -189,7 +189,7 @@ maven-compiler-plugin - 3.6.1 + 3.8.1 1.8 1.8 @@ -198,7 +198,7 @@ org.apache.maven.plugins maven-jar-plugin - 3.0.2 + 3.2.0 @@ -217,7 +217,7 @@ maven-assembly-plugin - 3.0.0 + 3.2.0 package @@ -240,7 +240,7 @@ org.robotframework robotframework-maven-plugin - 1.4.7 + 1.5.1 acceptance tests @@ -251,6 +251,7 @@ smoke + not-ready @@ -300,7 +301,7 @@ org.apache.maven.plugins maven-shade-plugin - 3.1.0 + 3.2.1 package @@ -350,7 +351,7 @@ org.apache.maven maven-model - 3.6.0 + 3.6.2 org.jmockit @@ -366,7 +367,7 @@ org.testfx testfx-core - 4.0.15-alpha + 4.0.16-alpha org.testfx @@ -381,7 +382,7 @@ org.robotframework robotframework - 3.0.4 + 3.1.2 org.hamcrest @@ -391,7 +392,7 @@ com.google.guava guava - 27.0.1-jre + 28.1-jre com.github.ombre42 @@ -401,7 +402,7 @@ org.apache.commons commons-lang3 - 3.7 + 3.9 commons-io diff --git a/src/main/java/JavaFXLibrary.java b/src/main/java/JavaFXLibrary.java index 984259d..07d376c 100644 --- a/src/main/java/JavaFXLibrary.java +++ b/src/main/java/JavaFXLibrary.java @@ -44,6 +44,7 @@ import javax.script.ScriptEngineManager; import javax.script.ScriptException; import static javafxlibrary.utils.HelperFunctions.*; +import static org.testfx.util.WaitForAsyncUtils.waitFor; public class JavaFXLibrary extends AnnotationLibrary { @@ -64,7 +65,6 @@ public JavaFXLibrary() { public JavaFXLibrary(boolean headless) { super(includePatterns); - deleteScreenshotsFrom("report-images/imagecomparison"); if (headless) { System.setProperty("testfx.robot", "glass"); System.setProperty("testfx.headless", "true"); @@ -99,7 +99,7 @@ public Object runKeyword(String keywordName, Object[] args) { try { RobotLog.ignoreDuplicates(); // timeout + 500 ms so that underlying timeout has a chance to expire first - WaitForAsyncUtils.waitFor(getWaitUntilTimeout(TimeUnit.MILLISECONDS) + 500, TimeUnit.MILLISECONDS, () -> { + waitFor(getWaitUntilTimeout(TimeUnit.MILLISECONDS) + 500, TimeUnit.MILLISECONDS, () -> { try { retval.set(super.runKeyword(keywordName, finalArgs)); @@ -182,7 +182,7 @@ public static JavaFXLibrary getLibraryInstance() throws ScriptException { public static void main(String[] args) throws Exception { JavaFXLibraryRemoteServer.configureLogging(); - System.out.println("-------------------- JavaFXLibrary --------------------- "); + System.out.println("---------------------------= JavaFXLibrary =---------------------------- "); RemoteServer server = new JavaFXLibraryRemoteServer(); server.putLibrary("/RPC2", new JavaFXLibrary()); int port = 8270; @@ -192,12 +192,13 @@ public static void main(String[] args) throws Exception { if (args.length > 0) port = Integer.parseInt(args[0]); else - System.out.println("RemoteServer for JavaFXLibrary will be started at default port of: " + port + - ". If you wish to use another port, restart the library and give port number as an argument."); + System.out.println("RemoteServer for JavaFXLibrary will be started at default port of: " + port + ".\n" + + "If you wish to use another port, restart the library and give port number\n" + + "as an argument."); server.setPort(port); server.start(); - System.out.println("\n JavaFXLibrary " + ROBOT_LIBRARY_VERSION + " is now available at: " + + System.out.println("\n JavaFXLibrary " + ROBOT_LIBRARY_VERSION + " is now available at: " + ipAddr.getHostAddress() + ":" + port + "\n"); } catch (NumberFormatException nfe) { diff --git a/src/main/java/javafxlibrary/utils/HelperFunctions.java b/src/main/java/javafxlibrary/utils/HelperFunctions.java index 04e4983..1d68edb 100644 --- a/src/main/java/javafxlibrary/utils/HelperFunctions.java +++ b/src/main/java/javafxlibrary/utils/HelperFunctions.java @@ -54,7 +54,6 @@ import javafx.scene.input.KeyCode; import org.testfx.service.query.PointQuery; -import org.testfx.util.WaitForAsyncUtils; import java.util.List; import java.util.concurrent.TimeUnit; @@ -68,6 +67,9 @@ import static javafxlibrary.utils.TestFxAdapter.objectMap; import static javafxlibrary.utils.TestFxAdapter.robot; import static org.testfx.matcher.base.NodeMatchers.*; +import static org.testfx.util.WaitForAsyncUtils.waitFor; +import static org.testfx.util.WaitForAsyncUtils.asyncFx; +import static org.testfx.util.WaitForAsyncUtils.waitForFxEvents; public class HelperFunctions { @@ -83,10 +85,15 @@ public static Node waitUntilExists(String target, int timeout, String timeUnit) + timeout + ", timeUnit=" + timeUnit); try { - WaitForAsyncUtils.waitFor((long) timeout, getTimeUnit(timeUnit), () -> createFinder().find(target) != null); - Node node = createFinder().find(target); + waitFor(timeout, getTimeUnit(timeUnit), () -> { + return asyncFx(() -> createFinder().find(target) != null).get(); + }); + Node node = asyncFx(() -> createFinder().find(target)).get(); // TODO: Add null checks for node.getScene() - WaitForAsyncUtils.waitFor((long) timeout, getTimeUnit(timeUnit), () -> hasValidCoordinates(node)); + waitFor(timeout, getTimeUnit(timeUnit), () -> { + return asyncFx(() -> hasValidCoordinates(node)).get(); + }); + waitForFxEvents(); return node; } catch (TimeoutException te) { throw new JavaFXLibraryTimeoutException("Given element \"" + target + "\" was not found within given timeout of " @@ -108,7 +115,7 @@ public static Node waitUntilVisible(Object target, int timeout) { RobotLog.trace("Waiting until target \"" + target + "\" becomes visible, timeout=" + timeout); try { - WaitForAsyncUtils.waitFor((long) timeout, TimeUnit.SECONDS, () -> Matchers.is(isVisible()).matches(finalTarget)); + waitFor((long) timeout, TimeUnit.SECONDS, () -> Matchers.is(isVisible()).matches(finalTarget)); return (Node) target; } catch (JavaFXLibraryNonFatalException nfe) { throw nfe; @@ -129,7 +136,7 @@ public static Node waitUntilEnabled(Object target, int timeout) { RobotLog.trace("Waiting until target \"" + target + "\" becomes enabled, timeout=" + timeout); try { - WaitForAsyncUtils.waitFor((long) timeout, TimeUnit.SECONDS, () -> Matchers.is(isEnabled()).matches(finalTarget)); + waitFor((long) timeout, TimeUnit.SECONDS, () -> Matchers.is(isEnabled()).matches(finalTarget)); return (Node) target; } catch (JavaFXLibraryNonFatalException nfe) { throw nfe; @@ -143,7 +150,7 @@ public static Node waitUntilEnabled(Object target, int timeout) { public static void waitForProgressBarToFinish(ProgressBar pb, int timeout) { try { - WaitForAsyncUtils.waitFor((long) timeout, TimeUnit.SECONDS, () -> Matchers.is(ProgressBarMatchers.isComplete()).matches(pb)); + waitFor((long) timeout, TimeUnit.SECONDS, () -> Matchers.is(ProgressBarMatchers.isComplete()).matches(pb)); } catch (TimeoutException te) { throw new JavaFXLibraryNonFatalException("Given ProgressBar did not complete in " + timeout + " seconds!"); } diff --git a/src/test/java/javafxlibrary/utils/HelperFunctionsTests/WaitUntilExistsTest.java b/src/test/java/javafxlibrary/utils/HelperFunctionsTests/WaitUntilExistsTest.java index d1311e5..10aacc7 100644 --- a/src/test/java/javafxlibrary/utils/HelperFunctionsTests/WaitUntilExistsTest.java +++ b/src/test/java/javafxlibrary/utils/HelperFunctionsTests/WaitUntilExistsTest.java @@ -3,7 +3,6 @@ import javafx.scene.Node; import javafx.scene.control.Button; import javafxlibrary.TestFxAdapterTest; -import javafxlibrary.exceptions.JavaFXLibraryNonFatalException; import javafxlibrary.exceptions.JavaFXLibraryTimeoutException; import javafxlibrary.utils.finder.Finder; import javafxlibrary.utils.HelperFunctions; From 459329798751257d26f168582a7ad5de8a09fc1b Mon Sep 17 00:00:00 2001 From: Pasi Saikkonen Date: Fri, 8 Nov 2019 17:00:32 +0200 Subject: [PATCH 28/59] Fix local test set failing on Docker Running apt-get openjfx installs openjfx-11 which is incompatible with openjdk-8. Workaround is to install older version of openjfx. --- docker/robot-javafx-demo/Dockerfile | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/docker/robot-javafx-demo/Dockerfile b/docker/robot-javafx-demo/Dockerfile index fe1dbac..81e3eea 100644 --- a/docker/robot-javafx-demo/Dockerfile +++ b/docker/robot-javafx-demo/Dockerfile @@ -10,7 +10,12 @@ RUN apt-get -qq update && apt-get dist-upgrade -y && apt-get install -qq --no-i python-setuptools \ wget \ openjdk-8-jre \ - openjfx \ + # Install older version of openjfx, current version is incompatible with openjdk8 + # Bug ticket: https://bugs.launchpad.net/ubuntu/+source/openjfx/+bug/1799946 + openjfx=8u161-b12-1ubuntu2 \ + libopenjfx-java=8u161-b12-1ubuntu2 \ + libopenjfx-jni=8u161-b12-1ubuntu2 \ + openjfx-source=8u161-b12-1ubuntu2 \ && apt-get clean && rm -rf /var/lib/apt/lists/* COPY test.sh /bin/test.sh From ea2f3bb6a72d6d402a0f3cd19fb301d44be58b19 Mon Sep 17 00:00:00 2001 From: Sami Pesonen Date: Mon, 11 Nov 2019 13:45:58 +0200 Subject: [PATCH 29/59] fix named arguments in acceptance testing for now (without named argument) --- .../acceptance/SwingApplicationWrapperTest.robot | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/robotframework/acceptance/SwingApplicationWrapperTest.robot b/src/test/robotframework/acceptance/SwingApplicationWrapperTest.robot index 9a16a2d..f73662f 100644 --- a/src/test/robotframework/acceptance/SwingApplicationWrapperTest.robot +++ b/src/test/robotframework/acceptance/SwingApplicationWrapperTest.robot @@ -11,7 +11,7 @@ Swing Embedded JavaFX Click Test [Tags] smoke demo-set Run Keyword If ${headless} Set Tags smonocle-issue Launch Swing Application javafxlibrary.testapps.SwingApplication - Wait Until Keyword Succeeds 15 sec 250ms Find css=.button failIfNotFound=True + Wait Until Keyword Succeeds 15 sec 250ms Find css=.button ${True} ${colors} Create List 0xdc143cff 0x00fa9aff 0xee82eeff 0xffff00ff 0x00ffffff Text Value Should Be Swing Embedded JavaFX :FOR ${I} IN RANGE 0 5 @@ -22,7 +22,7 @@ Swing Embedded JavaFX Type Test [Tags] smoke Run Keyword If ${headless} Set Tags monocle-issue Launch Swing Application javafxlibrary.testapps.SwingApplication - Wait Until Keyword Succeeds 15 sec 250ms Find id=textField failIfNotFound=True + Wait Until Keyword Succeeds 15 sec 250ms Find id=textField ${True} Write To id=textField JavaFXLibrary Wait Until Keyword Succeeds 3 sec 250ms Text Value Should Be JavaFXLibrary @@ -30,7 +30,7 @@ Launch Swing Application Using External Wrapper Class [Tags] smoke Run Keyword If ${headless} Set Tags monocle-issue Launch Javafx Application javafxlibrary.testapps.SwingApplicationWrapper - Wait Until Keyword Succeeds 15 sec 250ms Find id=textField failIfNotFound=True + Wait Until Keyword Succeeds 15 sec 250ms Find id=textField ${True} Write To id=textField JavaFXLibrary Wait Until Keyword Succeeds 3 sec 250ms Text Value Should Be JavaFXLibrary From 63e70f19e7a4d427a23bd59c34715ed26cecd25f Mon Sep 17 00:00:00 2001 From: Sami Pesonen Date: Mon, 11 Nov 2019 15:58:44 +0200 Subject: [PATCH 30/59] 0.5.3 release preparation --- AUTHORS.txt | 15 ++++++++------- README.md | 6 +++--- docs/javafxlibrary.html | 19 ++++++++++--------- pom.xml | 2 +- 4 files changed, 22 insertions(+), 20 deletions(-) diff --git a/AUTHORS.txt b/AUTHORS.txt index 4b5c288..582711d 100644 --- a/AUTHORS.txt +++ b/AUTHORS.txt @@ -1,10 +1,11 @@ Core contributors: -Jukka Haavisto 2017 - -Sami Pesonen 2017 - -Pasi Saikkonen 2017 - +Jukka Haavisto 2017 - +Sami Pesonen 2017 - +Pasi Saikkonen 2017 - Other contributors: -Tatu Lahtela Find All With Pseudo Class and Find Class keywords -Sakari Hoisko Dockerized linux env with X -Juho Lehtonen Optimized docker environment. -Juho Saarinen Package improvements +Tatu Lahtela Find All With Pseudo Class and Find Class keywords +Sakari Hoisko Dockerized linux env with X +Juho Lehtonen Optimized docker environment. +Juho Saarinen Package improvements, initial monocle support, screenshot bug fix + diff --git a/README.md b/README.md index 0128a0d..96ae7b0 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ JavaFXLibrary works with both Jython (local and remote use) and Python (remote o JavaFXLibrary is tested to work with Robot Framework 3.0.2 or later. ## Keyword documentation -See keyword [documentation](https://repo1.maven.org/maven2/org/robotframework/javafxlibrary/0.5.2/javafxlibrary-0.5.2.html). +See keyword [documentation](https://repo1.maven.org/maven2/org/robotframework/javafxlibrary/0.5.3/javafxlibrary-0.5.3.html). -For editors (IDEs) keyword documentation can be obtained from [here](https://repo1.maven.org/maven2/org/robotframework/javafxlibrary/0.5.2/javafxlibrary-0.5.2.xml). +For editors (IDEs) keyword documentation can be obtained from [here](https://repo1.maven.org/maven2/org/robotframework/javafxlibrary/0.5.3/javafxlibrary-0.5.3.xml). ## Taking the library into use ### As a local library @@ -19,7 +19,7 @@ For editors (IDEs) keyword documentation can be obtained from [here](https://rep *** Settings *** Library JavaFXLibrary ``` -3. Add library jar to Jython [module search path](http://robotframework.org/robotframework/3.0.4/RobotFrameworkUserGuide.html#configuring-where-to-search-libraries-and-other-extensions) and run your tests: +3. Add library jar to Jython [module search path](http://robotframework.org/robotframework/3.1.2/RobotFrameworkUserGuide.html#configuring-where-to-search-libraries-and-other-extensions) and run your tests: ``` jython -J-cp javafxlibrary-.jar -m robot.run tests.robot ``` diff --git a/docs/javafxlibrary.html b/docs/javafxlibrary.html index 7d15eb3..ca40777 100644 --- a/docs/javafxlibrary.html +++ b/docs/javafxlibrary.html @@ -5,8 +5,8 @@ - - + +