Получить экземпляр Activity другого приложения, используя UiAutomator?

Я пишу некоторые автоматизированные TestCase с использованием UiAutomator для всех приложений из моего приложения. Моя цель - найти текущую активность всех приложений, на которые я нажимаю.

У меня есть проект под названием MyApp с пакетом под названием com.example с одним Activity, 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, я могу получить экземпляр активности в этой строке кода

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

Теперь, если я изменю поток. HomeMenu -> SomeOtherApp и подключите его к монитору с помощью полностью определенного средства запуска SomeOtherApp, например com.someotherapp.MainActivity. Я не могу получить экземпляр активности. currentActivity равно нулю

Есть ли способ получить текущий экземпляр Activity любого приложения, которое я запускаю через UiAutomator?

1 ответ

Кажется, что можно отслеживать только действия в одном и том же пакете, поскольку активность другого приложения waitForActivityWithTimeout просто возвращает ноль.

Если вы получаете только экземпляр активности для context-required-api, можете сделать то же самое, что и я

  1. начать деятельность в том же пакете ui-automator-test-class
  2. использовать монитор, чтобы получить эту активность

    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);
      }
    }
Другие вопросы по тегам