Android uiautomatorでテキストを設定した後でキーボードを非表示にする

Android用uiautomatorの使用テキストフィールドにテキストを設定できますが、キーボードを閉じることはできません。いくつかの携帯電話では、lanscapeモードでは、キーボードが画面全体を占め、 'Done'をタップしてそのビューから抜け出す必要があります。私がキーボードを押さえることができれば、問題なく、風景と肖像の両方で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();

前もって感謝します。

1
あなたの質問は何ですか?
追加された 著者 verybadalloc,

7 答え

非常に間違っているようですが、それは仕事を完了します。

public static final int KEYBOARD_WAIT_TIME = 111;

Espresso.closeSoftKeyboard();
sleep(AutomatedTestConfig.KEYBOARD_WAIT_TIME);
3
追加された

通常は、Backキーをクリックするとキーボードが消えます。

getUiDevice().pressBack();
2
追加された
インテリジェントなソリューションはありますか?すなわち、キーボードが表示されているかどうかをチェックすること、クリックされるべきボタンを妨げるかどうかなどです。
追加された 著者 user1050755,
これは、アプリがポートレートモードでキーボードがタップされるために「完了」する必要がない場合を除いて機能します。だから私はランドスケープ専用の特別なケースを作った。
追加された 著者 Daniel,

通常は、Backキーをクリックするとキーボードが消えます。

getUiDevice().pressBack();
2
追加された
インテリジェントなソリューションはありますか?すなわち、キーボードが表示されているかどうかをチェックすること、クリックされるべきボタンを妨げるかどうかなどです。
追加された 著者 user1050755,
これは、アプリがポートレートモードでキーボードがタップされるために「完了」する必要がない場合を除いて機能します。だから私はランドスケープ専用の特別なケースを作った。
追加された 著者 Daniel,

これはかなり古い質問ですが、UiAutomator 2.0を使用すると、質問に正しく完全に答えることができます。

最適は次のようになります。

if(isKeyboardOpened()){
    UiDevice.pressBack();
}

しかし、これまでのところ、問題はisKeyboardOpened()を実装する方法でした。

UiAutomator 2.0は計測に基づいており、UiAutomationにアクセスできるため、画面に入力ウィンドウがあるかどうかを確認できます。

boolean isKeyboardOpened(){
    for(AccessibilityWindowInfo window: InstrumentationRegistry.getInstrumentation().getUiAutomation().getWindows()){
        if(window.getType()==AccessibilityWindowInfo.TYPE_INPUT_METHOD){
            return true;
        }
    }
    return false;
}
1
追加された
これは必ずしも機能しません。この関数がfalseを返す間、キーボードは存在します。
追加された 著者 wojciii,
私はこの作業をしようとしていますが、定数のシンボルを解決できません。 Alt + Enterによるクイックフィックスでは、 uiAuto フィールドを含まない SyncStateContract.Constants をインポートします。これに関するアイデア?
追加された 著者 Thanasis Petsas,
私はそれを見つけた。私は計測器を通してUiAutomationオブジェクトを取得する必要がありました: UiAutomation uiautomation = getInstrumentation()。getUiAutomation();
追加された 著者 Thanasis Petsas,
定数は私の悪いものでした(私はプロジェクトからコピーして貼り付け、その部分を変更するのを忘れました、残念です)。私は返信を編集します。
追加された 著者 Inês,
どのような状況で?
追加された 著者 Inês,

最終的に多くの仕事を終えて、私はこれを行う方法を見つけました。 問題は、ソフトキーボードが表示されていなければ、 getUIDevice()。pressBack()という呼び出しがテストを中断できることです。

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

それは、キーボードが表示された場合にのみ戻ることになります。

0
追加された
私はこれを試して、キーボードが開いて閉じているときの両方の結果は常にfalseです。なぜこれがあるのか​​分かりませんか?
追加された 著者 Inês,

-e disable_ime true オプションを指定して DummyIME を試し、 uiautomator ツールを実行してください。 DummyIME は、 Android gitリポジトリにあります。

  1. Clone source code of DummyIME:

    git clone https://android.googlesource.com/platform/frameworks/testing
    
  2. Build and install DummyIME (You may change android-18):

    cd testing/uiautomator/utils/DummyIME
    android update project -p . -t android-18
    ant clean debug install
    
  3. Run your tests using the uiautomator framework with -e disable_ime true option.

    adb shell uiautomator runtest  -e disable_ime true -c  
    

テスト済みのデバイスで既定のIMEの設定を復元する必要があることに注意してください テストを実行した後に自動的に DummyIME に変更されるためです。

0
追加された

あなたのコードを使って、挿入されたテキストの最後に\ nを追加しました。これは '入力'をシミュレートしますが、キーボードはまだ表示されているので、keybを閉じるにはpressBack()が必要です。

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();
0
追加された
こんにちは、これはかなり古い質問です。あなたが質問に直接答えているか、存在する答えにもっと追加していることは本当にはっきりしていません。これが一般的な関心事のテクニックだと思うなら、ここで新しい質問をして自分自身で答えることが大丈夫です。
追加された 著者 J Richard Snape,