3

私はmonkeyrunnerを使用して(AndroidViewClientを使用して)いくつかの画面クリックとエントリを自動化しようとしています

画面にエディットテキストがあるときはいつでも、ソフトキーボードがポップアップし、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スクリプトからのadblogcat出力を解析する方法の例を提供できる場合、適切な代替ソリューションが見つかった場合は、それを最後のオプションとして使用できます。

4

4 に答える 4

4

モンキーランナーのadbシェルを使用してやりたいことを行う方法があり、別のサードパーティライブラリは必要ありません。

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インスタンス、入力メソッドマネージャークライアントの一般的なパラメーターを持つ入力メソッドマネージャークライアント、入力メソッドクライアントの状態、および入力メソッドサーバーの状態が含まれます。入力方式マネージャークライアントの一般的なパラメーターの1つのセットは、入力方式が表示されるかどうか(ソフトキーボードなど)と、入力方式の表示が要求されたか、明示的に要求されたか、強制されたか、および表示されているかどうかに関するいくつかのパラメーターに関連します。

入力方法が表示されているかどうかは、ソフトキーボードが表示されている場合はtrue、ソフトキーボードが表示されていない場合はfalseであるため、重要です。そのパラメータの名前は

mInputShown

のようになります

mInputShown = true

また

mInputShown = false

ソフトキーボードが表示されているかどうかによって異なります。

次のステップは、monkeyrunnerスクリプトでこの情報を利用することです。MonkeyDeviceクラスには、monkeyrunnerによるブリッジの使用内からADBシェルコマンドを実行するためのメソッドが含まれており、ADBシェルコマンドの実行からADBシェルへの戻り値であるオブジェクトを返します。モンキーランナースクリプト内では、次のようになります

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>

ソフトキーボードが現在表示されているかどうかを知りたいかどうかによって異なります。

楽しみ!

于 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()

LinkRefer

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 に答える