android / android/android-test

DeviceCapture.takeScreenshot() timeout issue

Open
#2,273 3 comments 3 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
1.2k
Forks
342
Avg merge
11h 29m
Merged PRs (30d)
2

Description

### 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()
`

Contributor guide

Open the contributing guide

Research direction

Start by reading the current DeviceCapture.takeScreenshot() and forceRedrawGlobalWindowViews() implementation, then compare it with the core v1.5.0 implementation. Reproduce the failure with an Espresso TestWatcher and inspect why a non-shown view blocks the redraw; done means failed tests capture and write a screenshot on Android OS versions 31–33 without timing out.

Written by the indexing model from the issue text.

Assessment

Tech stack
android, kotlin
Domain
mobile-dev, testing
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
35/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.