4

我在我的项目中使用 Espresso 进行 UI 测试。我想为每个活动(屏幕)截屏。我正在使用 GoogleCloudTestLab 的 ScreenShooter 进行屏幕截图。

   ScreenShotter.takeScreenshot("main_screen_2", getActivity());

但它只截取我在 ActivityTestRule 中定义的第一个活动的屏幕截图。如何在同一个测试用例中拍摄其他活动屏幕截图。

4

2 回答 2

2

我的理解是 ActivityTestRule 旨在仅测试测试用例中的一个活动,因此 getActivity() 只会返回您在 ActivityTestRule 中指定的活动。

要捕获屏幕截图,该库当前使用:

View screenView = activity.getWindow().getDecorView().getRootView(); screenView.setDrawingCacheEnabled(true); Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache()); screenView.setDrawingCacheEnabled(false);

(其中活动是用户传递给我们的活动。)

因此,由于相同的活动被提供给截屏,我们只能在那时捕获该活动的视图层次结构。您能否将测试拆分为每个测试用例仅测试一项活动?

此外,我们目前正在探索其他捕获屏幕的方法,如果我们更改此方法,我们将添加到此线程中。

注意:如果您使用此库在 Firebase 测试实验室中运行测试,并且您有一种捕获屏幕截图的首选方式(而不是使用库),只要它们最终位于 /sdcard/screenshots 目录中,它们就会被拉取并在测试结束时上传到仪表板。

于 2016-06-13T22:14:47.120 回答
1

我遇到了同样的问题,因为我的测试涵盖了跨越多个活动的流程。诸如此类的辅助方法可用于获取对当前活动(顶部)活动的引用:

/**
 * A helper method to get the currently running activity under test when a test run spans across multiple
 * activities. The {@link android.support.test.rule.ActivityTestRule} only returns the initial activity that
 * was started.
 */
public static final Activity getCurrentActivity(Instrumentation instrumentation)
{
    final Activity[] currentActivity = new Activity[1];
    instrumentation.runOnMainSync(new Runnable()
    {
        public void run()
        {
            Collection<Activity> resumedActivities =
                ActivityLifecycleMonitorRegistry.getInstance().getActivitiesInStage(RESUMED);
            if (resumedActivities.iterator().hasNext())
            {
                currentActivity[0] = resumedActivities.iterator().next();
            }
        }
    });
    return currentActivity[0];
}

从你的测试中传递它 getInstrumentation() ,你应该很高兴。

于 2016-09-07T20:34:29.713 回答