我在项目中使用Espresso进行UI测试。我想拍摄每个活动(屏幕)的屏幕截图。我正在使用GoogleCloudTestLab中的ScreenShooter进行截屏。
ScreenShotter.takeScreenshot("main_screen_2", getActivity());
但它只拍摄了我在ActivityTestRule中定义的第一个活动的屏幕截图。如何在同一个测试用例中使用其他活动屏幕截图。
答案 0 :(得分:2)
我的理解是ActivityTestRule旨在测试测试用例中的一个Activity,因此getActivity()只返回您在ActivityTestRule中指定的活动。
要捕获屏幕截图,库目前使用:
View screenView = activity.getWindow().getDecorView().getRootView();
screenView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
screenView.setDrawingCacheEnabled(false);
(活动是用户传递给我们的活动。)
因为同样的活动被赋予了截屏,我们当时只能捕获该活动的视图层次结构。您是否能够将测试分开以仅测试每个测试用例的一个活动?
此外,我们目前正在探索捕获屏幕的其他方法,如果我们更改此方法,则会添加到此主题。
注意:如果您使用此库在Firebase测试实验室中运行测试,并且您有一种优先捕获屏幕截图(而不是使用库)的方法,只要它们最终位于/ sdcard / screenshots目录中,那么它们将在测试结束时拉出并上传到仪表板。
答案 1 :(得分: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(),你应该好好去。