如何确定softkeyboard是否显示在屏幕上 - 同时使用monkeyrunner(How to

2019-08-01 12:22发布

我试图自动化几屏的点击和使用monkeyrunner条目(使用AndroidViewClient)

每当有在屏幕上的EditText,软键盘弹出,如果我想按虽然findViewById按钮,(假设这个特定的按钮是软键盘后面)失败。 相反,点击这个按钮,就点击软键盘中的一些按钮。 因此,作为一个变通我需要按回猴子通过关键亚军,隐藏软键盘。

我的问题是如何确定是否显示在屏幕软键盘或不monkeyrunner运行时。

当我看着logcat中,我看到这个以下,同时显示了软键盘

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

并显示此而softkeyboard被去除

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

如果有人可以提供如何解析从monkeyrunner脚本的logcat输出的ADB一个例子,我可以使用它作为最后的选择,如果有发现任何合适的替代解决方案。

Answer 1:

你在答复中提到,这可能是一个伟大的除了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 /库莱布拉版本支持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()


Answer 2:

有做你想要使用从monkeyrunner亚行外壳什么的方式,它不需要单独的第三方库。

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启动。 如果脚本逻辑取决于wehther软键盘显示与否,我用上面的测试脚本来检查软键盘显示与否。

下面的说明包括有关如何解决这类问题的一些思考。

adb shell dumpsys

返回一个非常大的详细转储设备上运行的所有服务。 该dumpsys转储可应要求提供单一的服务,在我们的情况下,输入服务。 这用法

adb shell dumpsys input_method

它会返回一个更小的转储这就是当前输入法管理状态。 这转储将包括所有CURENT INPUTMETHOD情况下,与输入法管理器客户端,输入法客户端状态,以及输入法服务器状态一般参数输入法管理的客户端。 对于输入法管理器的客户端一般参数的一组涉及一种输入方法是否被示出(例如软键盘)和约是否被要求输入法显示,明确请求或迫使一些参数和是否正在显示它。

是否显示输入法是感兴趣的之一,因为它在软键盘显示和假当软键盘没有显示是真的。 该参数的名称是

mInputShown

和看起来像

mInputShown =真

要么

mInputShown = FALSE

根据软键盘是否显示与否。

下一步是利用的一个monkeyrunner脚本此信息。 所述MonkeyDevice类包括用于从monkeyrunner的使用桥,并且其内运行的ADB外壳命令的方法返回一个对象,它是返回值来执行该ADB外壳命令的ADB壳。 在一个monkeyrunner脚本,看起来像

shell_cmd_return_stuff = device.shell('dumpsys input_method')

其中device是用于连接的设备的MonkeyDevice类的实例和shell_cmd_return_stuff是可变的保持所有的外壳命令的输出-在这种情况下,转储输出。 最后,返回,因为我们正在寻找在文本的特定参数/值对,并知道它是什么样子,我们可以使用标准的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>

根据wehther我们想知道,如果软键盘目前呈现出或不显示。

请享用!



Answer 3:

我找到了一种方法来解决这个问题。 当我在亚行外壳dumpsys input_method看,我可以看到“mInputShown =真”。 因此,基于我写了下面的函数。

def isKeyboardShown():                                                                                                                                                                                          
     return "mInputShown=true" in call_shell_cmd("adb shell dumpsys input_method")


Answer 4:

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 .


文章来源: How to determine whether softkeyboard is shown on the screen - while using monkeyrunner