我在我的项目中使用 Espresso 进行 UI 测试。我想为每个活动(屏幕)截屏。我正在使用 GoogleCloudTestLab 的 ScreenShooter 进行屏幕截图。
ScreenShotter.takeScreenshot("main_screen_2", getActivity());
但它只截取我在 ActivityTestRule 中定义的第一个活动的屏幕截图。如何在同一个测试用例中拍摄其他活动屏幕截图。
我在我的项目中使用 Espresso 进行 UI 测试。我想为每个活动(屏幕)截屏。我正在使用 GoogleCloudTestLab 的 ScreenShooter 进行屏幕截图。
ScreenShotter.takeScreenshot("main_screen_2", getActivity());
但它只截取我在 ActivityTestRule 中定义的第一个活动的屏幕截图。如何在同一个测试用例中拍摄其他活动屏幕截图。
我的理解是 ActivityTestRule 旨在仅测试测试用例中的一个活动,因此 getActivity() 只会返回您在 ActivityTestRule 中指定的活动。
要捕获屏幕截图,该库当前使用:
View screenView = activity.getWindow().getDecorView().getRootView();
screenView.setDrawingCacheEnabled(true);
Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
screenView.setDrawingCacheEnabled(false);
(其中活动是用户传递给我们的活动。)
因此,由于相同的活动被提供给截屏,我们只能在那时捕获该活动的视图层次结构。您能否将测试拆分为每个测试用例仅测试一项活动?
此外,我们目前正在探索其他捕获屏幕的方法,如果我们更改此方法,我们将添加到此线程中。
注意:如果您使用此库在 Firebase 测试实验室中运行测试,并且您有一种捕获屏幕截图的首选方式(而不是使用库),只要它们最终位于 /sdcard/screenshots 目录中,它们就会被拉取并在测试结束时上传到仪表板。
我遇到了同样的问题,因为我的测试涵盖了跨越多个活动的流程。诸如此类的辅助方法可用于获取对当前活动(顶部)活动的引用:
/**
* 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() ,你应该很高兴。