2017-01-12 2 views
1

J'écris un TestCase automatisé en utilisant UiAutomator à travers les applications de mon application. Mon but est de trouver l'activité actuelle de toutes les applications sur lesquelles je clique.Obtenir l'instance d'activité d'une autre application à l'aide de UiAutomator?

J'ai appelé projet MyApp avec le paquet appelé com.example avec une activité, MainActivity

J'ai essayé le (tout à l'intérieur de mon application sous androidTest)

public class ActivityTester extends InstrumentationTestCase { 

private UiDevice device; 

@Test 
public void testAdd() throws Exception { 

} 

@Override 
protected void setUp() throws Exception { 
    super.setUp(); 

    Instrumentation instrumentation = getInstrumentation(); 

    Instrumentation.ActivityMonitor monitor = instrumentation.addMonitor("com.example.MainActivity", null, false); 


    device = UiDevice.getInstance(instrumentation); 

    device.pressHome(); 

    device.wait(Until.hasObject(By.desc("Apps")), 3000); 

    UiObject2 appsButton = device.findObject(By.desc("Apps")); 
    appsButton.click(); 

    device.wait(Until.hasObject(By.text("MyApp")), 3000); 

    UiObject2 calculatorApp = device.findObject(By.text("MyApp")); 
    calculatorApp.click(); 

    Activity currentActivity = instrumentation.waitForMonitorWithTimeout(monitor, 3000); 

} 

suivante ici Je suis en cliquant sur HomeMenu et lancer Myapp et attacher à l'écran avec com.example.MyActivity, je suis en mesure d'obtenir l'instance d'activité dans cette ligne de code

Activité CurrentActivity = instrumentation.waitForMonitorWithTimeout (moniteur, 3000);

Maintenant, si je change le flux. HomeMenu ->SomeOtherApp et de joindre au moniteur avec le launcherActivity pleinement qualifié de SomeOtherApp dire com.someotherapp.MainActivity. Je ne parviens pas à obtenir l'instance d'activité. currentActivity is null

Y a-t-il un moyen de trouver l'instance d'activité en cours de n'importe quelle application que je lance via UiAutomator?

Répondre

0

semble que seules les activités dans le même package peuvent être surveillées, pour les activités d'une autre application waitForActivityWithTimeout renvoie simplement null.

Si u get instance d'activité que pour le contexte nécessaire-api, peut le faire suivre comme je le fais

  1. activité de départ dans le même paquet de ui-Automator test classe
  2. moniteur utilisé pour obtenir cette activité

    public class ExampleInstrumentedTest { 

     private UiDevice mDevice; 
     private Activity mActivity; 

     @Before 
     public void before() { 
     // Initialize UiDevice instance 
     mDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()); 

     mActivity = getActivity(); 

     // Start from the home screen 
     mDevice.pressHome(); 
     } 

     private Activity getActivity() { 
     Activity activity = null; 
     Instrumentation inst = InstrumentationRegistry.getInstrumentation(); 
     Context context = inst.getContext(); 
     Instrumentation.ActivityMonitor monitor = 
       inst.addMonitor("com.wispeedio.uiautomator2hello.MainActivity", null, false); 

     Intent intent = context.getPackageManager() 
       .getLaunchIntentForPackage("com.wispeedio.uiautomator2hello"); 
     intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK); 
     context.startActivity(intent); 
     try { 
      Thread.sleep(2000); 
     } catch (InterruptedException e) { 
      e.printStackTrace(); 
     } 
     activity = monitor.waitForActivityWithTimeout(2000); 

     return activity; 
     } 

     private void takeScreenshot(String name) { 
     File file = Utils.CreateFileToExternal(mActivity, name, "test-screenshots"); 
     mDevice.takeScreenshot(file); 
     } 
    }