RFR: 8328716: [TestBug] Screen capturing utility for failed tests [v3]

Andy Goryachev angorya at openjdk.org
Wed Apr 2 16:36:03 UTC 2025


On Tue, 1 Apr 2025 22:42:25 GMT, Kevin Rushforth <kcr at openjdk.org> wrote:

>> Turns out one can't intercept assertion exceptions with `Thread.setDefaultUncaughtExceptionHandler()` (duh!), so this is likely to be a known limitation.
>> 
>> We might still provide general purpose methods in `ScreenCapture` (new class) like 
>> 
>> 
>>     /**
>>      * Captures a screenshot using JavaFX {@link Robot} in the PNG format.
>>      * <p>
>>      * This method can be called from any thread.  If called from a thread other than
>>      * the JavaFX Application Thread, the current thread will be paused until the screenshot is taken.
>>      *
>>      * @return the byte array containing the screenshot
>>      * @throws IOException when an I/O error occurs
>>      */
>>     public static byte[] takeScreenshot() throws IOException {
>> 
>> 
>> and 
>> 
>> 
>>     /**
>>      * Captures a screenshot using JavaFX {@link Robot} in the PNG format,
>>      * in the form of a Base-64 encoded {@code String}.
>>      * <p>
>>      * This method can be called from any thread.  If called from a thread other than
>>      * the JavaFX Application Thread, the current thread will be paused until the screenshot is taken.
>>      *
>>      * @param prefix the string to append before the base-64 representation, or null
>>      * @param postfix the string to append after the base-64 representation, or null
>>      * @return the screenshot in Base-64 encoded PNG, or an error message
>>      */
>>     public static String takeScreenshotBase64(String prefix, String postfix) {
>> 
>> 
>> What do you think?
>
>> We might still provide general purpose methods in ScreenCapture (new class) like
> 
> That might work. So the idea would be a utility class not tied to a JUnit5 annotation? The usage would then be adding a call to that while debugging a test wherever it makes sense for your test, possible from an AfterEach method.
> 
>>     public static byte[] takeScreenshot() throws IOException {
> 
> What would this do? I can see the usefulness of returning a WritableImage (basically calling `Robot::getScreenCapture` on the whole screen) or a base64-encoded PNG file, but what does it mean to return a raw byte array? I probably wouldn't recommend this one.
> 
>>     public static String takeScreenshotBase64(String prefix, String postfix) {
> 
> This seems useful, although what are "prefix" and "postfix" for?

@kevinrushforth do you know why there are two java windows in the screenshot above?

-------------

PR Comment: https://git.openjdk.org/jfx/pull/1746#issuecomment-2773133380


More information about the openjfx-dev mailing list