2

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

更新:

我正在尝试以下操作以单击自动完成弹出窗口:

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())));

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

4

1 回答 1

0

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

 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 键。它将焦点发送到“下一个”视图。

于 2016-02-10T18:12:33.333 回答