使用 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" 视图。
我正在使用 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" 视图。