Получить экземпляр 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, можете сделать то же самое, что и я
- начать деятельность в том же пакете ui-automator-test-class
- использовать монитор, чтобы получить эту активность
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);
}
}