使用Android uiautomator设置文本后抑制键盘

wgx48brx  于 2023-05-21  发布在  Android
关注(0)|答案(6)|浏览(239)

使用uiautomator for Android,我可以在文本字段中设置文本,但无法关闭键盘。对于一些手机,当处于景观模式时,键盘占据了整个屏幕,必须点击“完成”才能退出该视图。如果我可以抑制键盘,那么我可以在横向和纵向都运行uiautomator没有问题。

new UiObject(new UiSelector().text("Enter Text")).click();
new UiObject(new UiSelector().className("android.widget.EditText").instance(0)).setText("sample text");

// This is where I need to suppress the keyboard to view the app instead of just the keyboard itself.

new UiObject(new UiSelector().text("Submit")).click();

先谢谢你了。

gt0wga4j

gt0wga4j1#

这是一个相当古老的问题,但使用UiAutomator 2.0可以正确和完整地回答这个问题,因此它在这里。
最优方案为:

if (isKeyboardOpened()) {
    UiDevice.getInstance(InstrumentationRegistry.getInstrumentation()).pressBack();
}

但到目前为止,问题是如何实现isKeyboardOpened()。
由于UiAutomator 2.0基于仪器,因此我们可以访问UiAutomation,我们可以验证屏幕上是否存在任何输入窗口:

boolean isKeyboardOpened() {
    UiAutomation automation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
    for (AccessibilityWindowInfo window : automation.getWindows()) {
        if (window.getType() == AccessibilityWindowInfo.TYPE_INPUT_METHOD) {
            return true;
        }
    }
    return false;
}

在初始化代码的某个地方,请确保执行以下代码,否则.getWindow()将始终返回空列表:

UiAutomation automation = InstrumentationRegistry.getInstrumentation().getUiAutomation();
    AccessibilityServiceInfo info = automation.getServiceInfo();
    info.flags |=  AccessibilityServiceInfo.FLAG_RETRIEVE_INTERACTIVE_WINDOWS;
    automation.setServiceInfo(info);
z2acfund

z2acfund2#

这似乎是错误的,但它完成了工作。

public static final int KEYBOARD_WAIT_TIME = 111;

Espresso.closeSoftKeyboard();
sleep(AutomatedTestConfig.KEYBOARD_WAIT_TIME);
lokaqttq

lokaqttq3#

通常单击后退键将关闭键盘。

getUiDevice().pressBack();
rmbxnbpk

rmbxnbpk4#

我用了你的代码,只是在插入文本的末尾添加了\n。这模拟'回车',但键盘仍然出现,所以你需要按Back()键关闭键。

new UiObject(new UiSelector()
   .className("android.widget.EditText")
   .instance(0))
   .setText("sample text\n");
getUiDevice().pressBack();

还有更优雅的解决方案:

new UiObject(new UiSelector()
   .className("android.widget.EditText")
   .instance(0))
   .setText("sample text");
getUiDevice().pressEnter();
wn9m85ua

wn9m85ua5#

最后经过大量的工作,我找到了遵循的方式来做到这一点。问题是如果没有显示软键盘,调用getUIDevice().pressBack()可能会中断测试。

InputMethodManager imm = (InputMethodManager) getContext().getSystemService(Context.INPUT_METHOD_SERVICE);
if (imm.isAcceptingText()) {
    getUIDevice().pressBack();
}

如果显示键盘,则只会按回。

xa9qqrwz

xa9qqrwz6#

尝试DummyIME并运行带有-e disable_ime true选项的uiautomator工具。DummyIME驻留在Android git repository中。

  1. DummyIME的克隆源代码:
git clone https://android.googlesource.com/platform/frameworks/testing

1.构建并安装DummyIME(您可以更改android-18):

cd testing/uiautomator/utils/DummyIME
android update project -p . -t android-18
ant clean debug install

1.使用带有-e disable_ime true选项的uiautomator框架运行测试。

adb shell uiautomator runtest <JARS> -e disable_ime true -c <CLASSES>

请注意,您必须在测试设备中恢复默认IME的设置,因为在运行测试后,它会自动更改为DummyIME

相关问题