2016-06-08 89 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(),你應該是好去。