使用UiAutomator获取其他应用的Activity实例?

时间:2017-01-12 08:29:34

标签: android uiautomator android-espresso android-junit

我正在使用UiAutomator在我的应用程序的应用程序中编写一些Automated TestCase。我的目标是找到我点击的所有应用程序的当前活动。

我的项目名为 MyApp ,其中包含名为 com.example 的程序包,其中包含一个活动 MainActivity

我尝试了以下内容(我的应用程序在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);

}

我点击 HomeMenu 并启动 Myapp 并使用 com.example.MyActivity 附加到显示器,我可以获得此代码行中的活动实例

  

活动currentActivity = instrumentation.waitForMonitorWithTimeout(monitor,3000);

现在如果我改变了流程。 HomeMenu - > SomeOtherApp 并使用SomeOtherApp的完全限定的launcherActivity附加到监视器上,说明 com.someotherapp.MainActivity 。 我无法获得活动实例。 currentActivity为null

有没有办法可以获取我通过UiAutomator启动的任何应用的当前Activity实例?

1 个答案:

答案 0 :(得分:0)

似乎只能监视同一个包中的活动, 对于另一个应用程序的活动,waitForActivityWithTimeout只返回null。

如果您只获取context-needed-api的活动实例,可以按照我的方式进行操作

  1. 在ui-automator-test-class
  2. 的同一个包中启动活动
  3. 使用监视器来获取该活动
  4. 
        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);
          }
        }