2016-06-08 80 views
4

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

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

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

回答

2

我的理解是ActivityTestRule被设计为只测试testcase中的一个Activity,因此getActivity()将只返回ActivityTestRule中指定的活动。

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

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

(其中活动用户通过我们的活动)

,是因为被给予相同的活动takescreenshot,我们当时只能捕获该活动的视图层次结构。你能分解你的测试来测试每个测试用例只有一个活动吗?

此外,我们正在探索其他方法来捕获屏幕,如果我们改变这种方法,将会添加到这个线程中。

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

1

自从我的测试涵盖跨越多个活动的流程以来,我遇到了同样的问题。的helper方法,如这一个可以用来获得参考当前活动(顶部)活动:

/** 
* 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(),你应该是好去。