UiAutomator - UiDevice 无法通过选择器(包名称和资源 ID)找到对象

UiAutomator - UiDevice can't findObject by selector (package name and resource ID)

我无法在我的 androidTest 中使用 UiAutomator 找到元素 (UiObject2)。我获得了 UiDevice 实例并尝试用这个找到对象:

MY_UI_DEVICE.findObject(By.res(CURRENT_PACKAGE, id));

CURRENT_PACKAGE 是我的应用 MY_UI_DEVICE.getCurrentPackageName() 的包。我也试过这个:

MY_UI_DEVICE.wait(Until.findObject(By.res(CURRENT_PACKAGE, id)), 10000);

我可以看到应用程序在右侧屏幕上等待了 10 秒(所需对象一直存在),但超时后找不到它并且测试失败。它在模拟器上总是失败 (API 23),但在真实设备上很少能正常工作 (API 25)。

当我调试代码时,我可以看到我可以通过在 AccessibilityNodeInfo 上调用 getChild(index) 方法序列手动获取正确的元素,但在运行时它仍然失败,即使应用程序正在等待我期望特定元素的正确屏幕。

我正在使用不同的 UiDevice 功能,但是 none 的帮助和我的想法,所以任何帮助将不胜感激。

确保您的测试方法抛出 UiObjectNotFoundException。在我开始强制错误 throw

之前,我也遇到了 UiObject2 的问题
@Test
public void clockTest() throws UiObjectNotFoundException, InterruptedException {
    mDevice.click(1146,37); //click on clock top right corner
    Thread.sleep(1500);//wait 1.5 seconds for screen to load
    mDevice.click(1138,135);//clicks in shell
    Thread.sleep(1500);//wait 1.5s for screen to load

    UiObject2 dTSettingsButton = mDevice.findObject(By.text("Date & Time Settings"));
    //assertNotNull(dTSettingsButton);//find and assert the settings button
    dTSettingsButton.clickAndWait(Until.newWindow(), LAUNCH_TIMEOUT);//clicks the settings button

    UiObject2 timeFormatButton = mDevice.findObject(By.text("Select Time Format"));
    assertNotNull(timeFormatButton);//find and assert timeformat button
    timeFormatButton.clickAndWait(Until.newWindow(), LAUNCH_TIMEOUT);//click timeformat button

    UiObject2 twelveHourButton = mDevice.findObject(By.res("com.REDACTED.settings:id/first_btn"));
    assertNotNull(twelveHourButton);//find and assert twelvehour button
    twelveHourButton.clickAndWait(Until.newWindow(), LAUNCH_TIMEOUT);//click twelvehour button
}

我的测试有 2 个问题:

  1. 第一个问题是在静态块中获取/初始化 UiDevice 实例(作为 util class 中的静态字段)。我将其移至 @Before 并帮助部分解决了该问题。
  2. 使用从 UiDevice 获得的包名称搜索元素时出现另一个问题。我用 InstrumentationRegistry.getTargetContext().getPackageName(); 替换了获取包,就像在 google samples 中所做的那样。

尝试使用 UiSelector 方法。这对我来说比选择器

好得多