You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Calling DeviceCapture.takeScreenshot() in a test rule on test failure times out and takes no screenshot
Steps to Reproduce
Create any kind of Espresso JUnit test
Create a test rule extending TestWatcher() and try to take a screenshot on failure and write it to test storage.
Expected Results
Screenshot should be taken and saved in the test storage
Actual Results
No screenshot is taken, calling takeScreenshot() times out.
AndroidX Test and Android OS Versions
androidx.test.core v1.6.1
androidx.test.espresso:espresso* v3.6.1
OS: Tested on emulators with OS versions 31-33
Additional debug information
I am just a QA engineer so I can't speak about the app implementation but what I found is that forceRedrawGlobalWindowViews() finds 2 views in the context of our app. For one of the views view.isShown returns false and the redraw seems to fail on this particular one. I copied the DeviceCapture implementation and added a condition to redraw only views that are "shown" and screenshots started working.
NB The issue cannot be observed on core v1.5.0 and espresso libraries v3.5.1 but there the DeviceCapture implementation is completely different than the latest one.
Link to a public git repo demonstrating the problem:
Example test rule used
class ScreenshotTestRule : TestWatcher() {
override fun failed(e: Throwable?, description: Description?) {
super.failed(e, description)
val className = description?.testClass?.simpleName ?: "NullClassname"
val methodName = description?.methodName ?: "NullMethodName"
takeScreenshot().writeToTestStorage("${className}_${methodName}")
}}
Rule added to test class @get:Rule(order = 1) var screenshotWatcher = ScreenshotTestRule()
The text was updated successfully, but these errors were encountered:
kotlinx.coroutines.TimeoutCancellationException: Timed out waiting for 5000 ms
at kotlinx.coroutines.TimeoutKt.TimeoutCancellationException(Timeout.kt:191)
at kotlinx.coroutines.TimeoutCoroutine.run(Timeout.kt:159)
at kotlinx.coroutines.EventLoopImplBase$DelayedRunnableTask.run(EventLoop.common.kt:501)
at kotlinx.coroutines.EventLoopImplBase.processNextEvent(EventLoop.common.kt:280)
at kotlinx.coroutines.DefaultExecutor.run(DefaultExecutor.kt:109)
at java.lang.Thread.run(Thread.java:919)
Description
Calling
DeviceCapture.takeScreenshot()
in a test rule on test failure times out and takes no screenshotSteps to Reproduce
TestWatcher()
and try to take a screenshot on failure and write it to test storage.Expected Results
Screenshot should be taken and saved in the test storage
Actual Results
No screenshot is taken, calling
takeScreenshot()
times out.AndroidX Test and Android OS Versions
androidx.test.core v1.6.1
androidx.test.espresso:espresso* v3.6.1
OS: Tested on emulators with OS versions 31-33
Additional debug information
I am just a QA engineer so I can't speak about the app implementation but what I found is that
forceRedrawGlobalWindowViews()
finds 2 views in the context of our app. For one of the viewsview.isShown
returns false and the redraw seems to fail on this particular one. I copied theDeviceCapture
implementation and added a condition to redraw only views that are "shown" and screenshots started working.NB The issue cannot be observed on core v1.5.0 and espresso libraries v3.5.1 but there the
DeviceCapture
implementation is completely different than the latest one.Link to a public git repo demonstrating the problem:
Example test rule used
Rule added to test class
@get:Rule(order = 1) var screenshotWatcher = ScreenshotTestRule()
The text was updated successfully, but these errors were encountered: