3

I am trying to automate few screen clicks and entries using monkeyrunner(using AndroidViewClient )

Whenever there is a edittext in the screen, the soft keyboard is popping up, and if I want to press a button though findViewById, (assuming that this particular button is behind the soft keyboard) fails. Instead of clicking this button, it clicks on some button in the soft keyboard. So as a work around I need to press back key through monkey runner, to hide the soft keyboard.

My question is how to determine whether soft keyboard is shown in the screen or not while running from monkeyrunner.

When I looked at the logcat, I see this following while showing up the soft keyboard

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

and displays this while softkeyboard is removed

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

If someone can provide an example of how to parse the adb logcat output from the monkeyrunner script, I can use that as a last option, if there is any suitable alternative solution found.

4

4 回答 4

4

有一种方法可以使用来自 monkeyrunner 的 adb shell 来做你想做的事情,它不需要单独的第三方库。

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

或者

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 实例、具有输入法管理器客户端通用参数的输入法管理器客户端、输入法客户端状态和输入法服务器状态。输入法管理器客户端的一组通用参数与是否显示输入法(例如软键盘)有关,以及有关输入法显示是否被请求、显式请求或强制以及是否正在显示的一些参数。

是否显示输入法是一个有趣的问题,因为它在软键盘显示时为真,在软键盘不显示时为假。该参数的名称是

mInputShown

看起来像

mInputShown=真

或者

mInputShown=假

取决于是否显示软键盘。

下一步是在 monkeyrunner 脚本中使用这些信息。MonkeyDevice 类包括一个在monkeyrunner 对桥的使用中运行ADB shell 命令的方法,该方法返回一个对象,该对象是ADB shell 执行ADB shell 命令的返回值。在 monkeyrunner 脚本中,看起来像

shell_cmd_return_stuff = device.shell('dumpsys input_method')

其中device是附加设备的 MonkeyDevice 类的实例,并且shell_cmd_return_stuff是保存所有 shell 命令输出的变量——在本例中为转储输出。最后,由于我们正在文本中查找特定的参数/值对并且知道它的外观,因此我们可以使用标准 Jython 在返回的输出中查找该字符串,而无需将其保存在变量中并使用 Jython 字符串in布尔运算符

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

或者

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

取决于我们是否想知道软键盘当前是否显示。

享受!

于 2013-10-30T15:08:33.060 回答
3

您在回答中提到的内容可能是对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

2015 年 2 月 11 日更新

最新的 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()
于 2012-10-30T22:16:20.567 回答
2

我找到了解决这个问题的方法。当我查看 adb shell dumpsys input_method 时,我可以看到“mInputShown=true”。因此,基于此,我编写了以下函数。

def isKeyboardShown():                                                                                                                                                                                          
     return "mInputShown=true" in call_shell_cmd("adb shell dumpsys input_method")
于 2012-10-22T22:05:41.200 回答
0
def isKeyboardShown(self):
#Whether the keyboard is displayed.
   return self.device.isKeyboardShown()

链接参考

We can use isKeyboardShown() function by importing view-client to
validate whether the soft Keyboard is displayed or not .
于 2016-05-05T07:21:26.787 回答