我正在尝试使用monkeyrunner(使用AndroidViewClient)自动化少量屏幕点击和条目
每当屏幕上出现edittext时,软键盘就会弹出,如果我想通过findViewById按一个按钮,(假设这个特定按钮在软键盘后面)就会失败。它不是单击此按钮,而是单击软键盘中的某个按钮。因此,作为一种解决方法,我需要通过猴子跑步者按回键,以隐藏软键盘。
我的问题是如何确定从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输出的示例,如果找到任何合适的替代解决方案,我可以将其用作最后一个选项。
答案 0 :(得分: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
最新的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()
答案 1 :(得分:3)
有一种方法可以使用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字符串{{ 1}}布尔运算符
in
或
if ('mInputShown=true' in device.shell('dumpsys input_method')):
<conditional code for when soft keyboard is showing goes here>
取决于我们是否想知道软键盘当前是否正在显示。
享受!
答案 2 :(得分:2)
我找到了克服这个问题的方法。当我查看adb shell dumpsys input_method时,我可以看到“mInputShown = true”。基于此,我编写了以下函数。
def isKeyboardShown():
return "mInputShown=true" in call_shell_cmd("adb shell dumpsys input_method")
答案 3 :(得分: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 .