2013-06-20 2 views
1

Использование uiautomator для Android Я могу установить текст в текстовом поле, но не смог закрыть клавиатуру. С некоторыми телефонами, когда в режиме lanscape клавиатура занимает весь экран, и «Готово» должно быть задействовано, чтобы выйти из этого представления. Если я могу подавить клавиатуру, тогда я могу запускать uiautomator как в пейзаже, так и в портрет без проблем.Подавить клавиатуру после установки текста с помощью 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(); 

Заранее благодарен.

+0

Что ваш вопрос, хотя? – verybadalloc

ответ

2

Обычно нажатие на кнопку «Назад» отменяет клавиатуру.

getUiDevice().pressBack(); 
+0

Это работает, за исключением случаев, когда приложение в портретном режиме и клавиатуре не нужно «делать» для прослушивания. Поэтому я сделал особый случай только для пейзажа. – Daniel

+1

есть ли разумное решение? то есть. один, который включает проверку, отображается ли клавиатура, препятствует ли она нажатию кнопки и т. д. – user1050755

0

Попробуйте DummyIME и запустить инструмент uiautomator с -e disable_ime true опцией. DummyIME проживает в Android git repository.

  1. Clone исходный код DummyIME:

    git clone https://android.googlesource.com/platform/frameworks/testing 
    
  2. сборки и установки DummyIME (Вы можете изменить android-18):

    cd testing/uiautomator/utils/DummyIME 
    android update project -p . -t android-18 
    ant clean debug install 
    
  3. Запустите тесты с использованием рамки uiautomator с -e disable_ime true вариант ,

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

Обратите внимание, что необходимо восстановить настройки IME по умолчанию в вашем тестируемом устройстве , поскольку он автоматически изменяется в DummyIME после выполнения теста.

0

Я использовал ваш код, просто добавленный \ n в конец вставленного текста. Это симулирует «войти», но клавиатура все еще появляется, поэтому вам нужно нажать кнопку «Назад»(), чтобы закрыть keyb.

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

Привет, это довольно старый вопрос, и не совсем ясно, что вы отвечаете на вопрос напрямую или добавляете больше к существующим ответам. Если вы считаете, что это метод общего интереса, здесь все в порядке, чтобы задать новый вопрос и ответить на него самостоятельно. –

3

Кажется очень неправильно, но он получает работу.

0

Заключительный после много работы, я нашел следующий способ сделать это. Проблема заключается в том, что вызов getUIDevice().pressBack() может нарушить тест, если не была отображена мягкая клавиатура.

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

Это будет только нажимать, если была отображена клавиатура.

+0

Я пробовал это, и результат всегда ложный, как при открытии и закрытии клавиатуры. У вас есть какое-то представление о том, почему это так? –

1

Это довольно старый вопрос, но с 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; 
} 
+0

Я пытаюсь выполнить эту работу, но она не может разрешить символ 'Constants'. Быстрые исправления через Alt + Enter import 'SyncStateContract.Constants', который не содержит поля' uiAuto'. Есть идеи по этому поводу? –

+0

Хорошо, я нашел это. Мне нужно было получить объект UiAutomation с помощью инструментария: 'UiAutomation uiautomation = getInstrumentation(). GetUiAutomation();' –

+1

Константы были моими плохими (я скопировал из проекта и забыл изменить эту часть, извините). Я отредактирую ответ. –