Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

DeviceCapture.takeScreenshot() timeout issue #2273

Open
nikolas-scaleforce opened this issue Aug 21, 2024 · 0 comments
Open

DeviceCapture.takeScreenshot() timeout issue #2273

nikolas-scaleforce opened this issue Aug 21, 2024 · 0 comments

Comments

@nikolas-scaleforce
Copy link

nikolas-scaleforce commented Aug 21, 2024

Description

Calling DeviceCapture.takeScreenshot() in a test rule on test failure times out and takes no screenshot

Steps to Reproduce

  1. Create any kind of Espresso JUnit test
  2. 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()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant