使用Espresso测试AutoCompleteTextView

时间:2016-02-08 22:53:10

标签: android autocompletetextview android-espresso testing-support-library

我正在使用Espresso来测试具有多个AutoCompleteTextViews的应用。对于一个特定的测试,会出现自动完成弹出窗口,但我想忽略它并移动到下一个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())));

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

1 个答案:

答案 0 :(得分:0)

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

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

然后我致电UiDevice.pressEnter()前进到下一个TextView

device.pressEnter();

遇到的问题是,这并没有开箱即用的预期效果。我还为每个View.OnKeyListener添加了AutoCompleteTextView来处理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"图。