Как определить, отображается ли программная клавиатура на экране при использовании monkeyrunner

Я пытаюсь автоматизировать несколько щелчков экрана и записей с помощью monkeyrunner (используя AndroidViewClient )

Всякий раз, когда на экране появляется текст редактирования, появляется программная клавиатура, и если я хочу нажать кнопку, хотя findViewById (при условии, что эта конкретная кнопка находится за программной клавиатурой) терпит неудачу. Вместо того, чтобы нажимать эту кнопку, он нажимает на какую-то кнопку на программной клавиатуре. Поэтому в качестве обходного пути мне нужно нажать клавишу «Назад» через «бегун обезьян», чтобы скрыть мягкую клавиатуру.

Мой вопрос заключается в том, как определить, отображается ли программная клавиатура на экране или нет во время работы с monkeyrunner.

Когда я посмотрел на логарифм, я вижу следующее при отображении программной клавиатуры

I/SurfaceFlinger( 2045): id=143(28) createSurf 0x4326743c (720x593),1 flag=0, InputMethod

и отображает это, когда программная клавиатура удалена

I/SurfaceFlinger( 2045): id=142 Removed InputMethod idx=4 MapSz=3
I/SurfaceFlinger( 2045): id=142 Removed InputMethod idx=-2 MapSz=3

Если кто-то может предоставить пример того, как анализировать вывод adb logcat из скрипта monkeyrunner, я могу использовать его в качестве последнего варианта, если будет найдено какое-либо подходящее альтернативное решение.


person Durairaj Packirisamy    schedule 15.10.2012    source источник


Ответы (4)


То, что вы упомянули в своем ответе, может стать отличным дополнением к AndroidViewClient, и я постараюсь включить его в ближайшее время.

В любом случае, есть способ получить ту же информацию, но более запутанным способом:

...
from com.dtmilano.android.viewclient import ViewClient

vc = ViewClient(*ViewClient.connectToDeviceOrExit())
view = vc.findViewByIdOrRaise('id/no_id/1')
view.getXY() # getXY() calls __dumpsWindowsInformation()
for w in view.windows:
    if view.windows[w].activity == 'InputMethod':
        print view.windows[w].visibility

Обновление от 11 февраля 2015 г.

Последние версии AndroidViewClient/culebra поддерживают метод isKeyboardShown(). Используйте так:

#! /usr/bin/env python
# -*- coding: utf-8 -*-
'''
Copyright (C) 2013-2014  Diego Torres Milano
Created on 2015-02-11 by Culebra v10.0.8
                      __    __    __    __
                     /  \  /  \  /  \  /  \ 
____________________/  __\/  __\/  __\/  __\_____________________________
___________________/  /__/  /__/  /__/  /________________________________
                   | / \   / \   / \   / \   \___
                   |/   \_/   \_/   \_/   \    o \ 
                                           \_____/--<
@author: Diego Torres Milano
@author: Jennifer E. Swofford (ascii art snake)
'''


import re
import sys
import os


try:
    sys.path.insert(0, os.path.join(os.environ['ANDROID_VIEW_CLIENT_HOME'], 'src'))
except:
    pass

from com.dtmilano.android.viewclient import ViewClient

TAG = 'CULEBRA'

_s = 5
_v = '--verbose' in sys.argv


kwargs1 = {'ignoreversioncheck': False, 'verbose': False, 'ignoresecuredevice': False}
device, serialno = ViewClient.connectToDeviceOrExit(**kwargs1)
print "Is keyboard shown:", device.isKeyboardShown()
person Diego Torres Milano    schedule 30.10.2012
comment
Спасибо за альтернативный ответ - person Durairaj Packirisamy; 02.11.2012
comment
Я не вижу ничего похожего на «id/no_id/1» с DDMS. Ни один AndroidViewClient не находит его. Я использовал 4.4 Nexus5, вы используете определенную версию Android? - person Benoit; 11.02.2015

Есть способ сделать то, что вы хотите, используя оболочку adb от monkeyrunner, и для этого не требуется отдельная сторонняя библиотека.

if ('mInputShown=true' in device.shell('dumpsys input_method')):
    <conditional code for when soft keyboard is showing goes here>

or

if ('mInputShown=false' in device.shell('dumpsys input_method')):
    <conditional code for when soft keyboard is not showning goes here>

где device — экземпляр MonkeyDevice для подключенного устройства.

Я обнаружил, что приложения, которые обычно отображают программную клавиатуру для ввода при ручном запуске, не всегда надежно отображают ее при запуске с помощью monkeyrunner. Если логика сценария зависит от того, отображается ли программная клавиатура или нет, я использую приведенные выше тесты в сценарии, чтобы проверить, отображается ли программная клавиатура или нет.

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

adb shell dumpsys

возвращает очень большой и подробный дамп всех служб, работающих на устройстве. Дамп dumpsys может быть запрошен для одной службы, в нашем случае для службы ввода. Это использование

adb shell dumpsys input_method

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

Представляет интерес то, показан ли метод ввода, поскольку он истинен, когда отображается программная клавиатура, и ложен, когда программная клавиатура не отображается. Имя этого параметра

mInputShow

и будет выглядеть

мИнпутШоун=истина

or

мИнпутШоун=ложь

в зависимости от того, отображается программная клавиатура или нет.

Следующим шагом будет использование этой информации в скрипте monkeyrunner. Класс MonkeyDevice включает в себя метод для запуска команды оболочки ADB из-под моста, используемого monkeyrunner, и который возвращает объект, который является возвращаемым значением для оболочки ADB при выполнении команды оболочки ADB. В скрипте monkeyrunner это выглядит так:

shell_cmd_return_stuff = device.shell('dumpsys input_method')

где device — экземпляр класса MonkeyDevice для подключенного устройства, а shell_cmd_return_stuff — переменная, содержащая весь вывод команды оболочки — в данном случае вывод дампа. Наконец, поскольку мы ищем определенную пару параметр/значение в тексте и знаем, как она выглядит, мы можем использовать стандартный Jython для поиска этой строки в возвращаемом выводе, не сохраняя ее в переменной и используя строку Jython in boolean. оператор

if ('mInputShown=true' in device.shell('dumpsys input_method')):
    <conditional code for when soft keyboard is showing goes here>

or

if ('mInputShown=false' in device.shell('dumpsys input_method')):
    <conditional code for when soft keyboard is not showning goes here>

в зависимости от того, хотим ли мы знать, отображается ли в данный момент программная клавиатура или нет.

Наслаждаться!

person Jim    schedule 30.10.2013

Я нашел способ побороть эту проблему. Когда я заглянул в оболочку adb dumpsys input_method, я увидел «mInputShown=true». Поэтому, основываясь на этом, я написал следующую функцию.

def isKeyboardShown():                                                                                                                                                                                          
     return "mInputShown=true" in call_shell_cmd("adb shell dumpsys input_method")
person Durairaj Packirisamy    schedule 22.10.2012

def isKeyboardShown(self):
#Whether the keyboard is displayed.
   return self.device.isKeyboardShown()

LinkRefer

We can use isKeyboardShown() function by importing view-client to
validate whether the soft Keyboard is displayed or not .
person Sanyal    schedule 05.05.2016