如何确定软键盘是否显示在屏幕上 - 使用monkeyrunner时

时间:2012-10-15 21:00:25

标签: android monkeyrunner androidviewclient

我正在尝试使用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输出的示例,如果找到任何合适的替代解决方案,我可以将其用作最后一个选项。

4 个答案:

答案 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

11-FEB-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()

答案 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()

LinkRefer

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