我正在尝试使用monkeyrunner(使用AndroidViewClient )自动化一些屏幕点击和输入
每当屏幕上有编辑文本时,软键盘就会弹出来,如果我想通过findViewById按下一个按钮,(假设这个特定的按钮在软键盘后面)就会失败。它不是点击这个按钮,而是点击软键盘上的某个按钮。所以作为一个变通办法,我需要通过猴子跑步者按back键来隐藏软键盘。
我的问题是,在从monkeyrunner运行时,如何确定软键盘是否显示在屏幕上。
当我查看logcat时,我在显示软键盘时看到了以下内容
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
如果有人能提供一个如何从monkeyrunner脚本解析adb logcat输出的示例,我可以将其作为最后一个选项,如果找到任何合适的替代解决方案的话。
发布于 2012-10-31 06:16:21
你在回答中提到的内容可能是对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-2月15日
最新的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()
发布于 2013-10-30 23:08:33
有一种方法可以使用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=true
或
mInputShown=false
取决于软键盘是否显示。
下一步是在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
是保存所有外壳命令输出的变量--在本例中是转储输出。最后,由于我们要在文本中查找特定的参数/值对,并且知道它的样子,因此可以使用标准Jython在返回的输出中查找该字符串,而无需将其保存在变量中并使用Jython string 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>
取决于我们是否想知道软键盘当前是否显示。
享受吧!
发布于 2012-10-23 06:05:41
我找到了一个克服这个问题的方法。因此,基于此,我编写了以下函数。
def isKeyboardShown():
return "mInputShown=true" in call_shell_cmd("adb shell dumpsys input_method")
https://stackoverflow.com/questions/12903907
复制相似问题