使用 Espresso 测试 AutoCompleteTextView

Testing AutoCompleteTextView with Espresso

我正在使用 Espresso 测试具有多个 AutoCompleteTextView 的应用程序。对于一个特定的测试,会出现自动完成弹出窗口,但我只想忽略它并移至下一个 TextView。我怎样才能做到这一点?我的想法是模拟 "Back" 按下或在弹出窗口中模拟点击。

更新:

我正在尝试通过以下方式点击自动完成弹出窗口:

onView(withId(R.id.brand_text))
        .perform(scrollTo(), typeText(card.getBrand()));
onData(allOf(is(instanceOf(String.class)), is(card.getBrand())))
        .inRoot(isPlatformPopup())
        .perform(click());
onView(withId(R.id.brand_text))
        .check(matches(withText(card.getBrand())));

现在的问题是,在某些情况下,输入的文本没有任何自动完成匹配项,因此不会出现弹出窗口。如何根据视图是否匹配有条件地执行点击?

我的解决方案是从 UI Automator 添加一个 UiDevice 对象到我的测试中:

 UiDevice device = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());

然后我调用UiDevice.pressEnter()前进到下一个TextView

device.pressEnter();

遇到的问题是开箱后无法按预期工作。我还为每个 AutoCompleteTextView 添加了一个 View.OnKeyListener 来处理 Enter 键事件。现在,我向每个视图添加一个侦听器,并明确说明哪个视图请求关注 Enter 键事件。

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    // ...

    brandText.setOnKeyListener(new View.OnKeyListener() { 
        @Override 
        public boolean onKey(View v, int keyCode, KeyEvent event) { 
            if (event.getAction() == KeyEvent.ACTION_UP && keyCode == KeyEvent.KEYCODE_ENTER) { 
                yearText.requestFocus(); 
                return true; 
            } 

            return false; 
        } 
    });

    //...
}

这并不理想。最终我计划概括这一点,可能使用一个继承自 AutoCompleteTextView 的自定义组件,它按我的预期处理 Enter 键。它会将焦点发送到 "next" 视图。