pythonは自動化コンバージョンのステップを実現する。


1.はじめに
みんなでコントロールして、大部分の人がすべてよく知らないことはできないことを信じます!印象的には、コンピュータを制御して、複数の機器の一連の操作を完了するために、より多くの人がHui生産と一緒にバインドすることが好きです!
実際には、グループ制御も自動化テストで広く使われています。これからのいくつかの文章を紹介します。企業レベルの自動化の中で、グループコントロールの正しい使い方を紹介します。
本編ではまず基礎編から始めて、雑談して使います。 Python+adb 」命令はどうやって一連のコントロールスクリプトを作成しますか?
2.準備
本機に据え付ける Android開発環境、保証 adbを環境変数に追加します。
用意した複数の機器を、データ線(またはHub)を使ってコンピュータに接続します。
通過する adb devices コマンドは、接続されているすべてのデバイスを表示します。

#        3   
xag:Test xingag$ adb devices
List of devices attached
822QEDTL225T7    device
ca2b3455        device
DE45d9323SE96   device
3.実戦
自動化グループコントロールは閑魚アプリのキーワード検索を例にして、アプリケーションを開いて検索画面にクリックして内容を入力して検索ボタンをクリックすることを含みます。
以下は7ステップでこの操作を完了します。
1、ターゲットアプリケーションのパッケージ名と初期化Activityを取得する
取得方法には様々な種類があります。主要な方法は、adbコマンド、解析APK、第三者APK、バリアフリーサービスがあります。
ここではadbコマンドを使うことをおすすめします。

#               Activity
adb shell dumpsys activity | grep -i run
フリー魚アプリを開いて、命令端末に上のコマンドを入力すると、端末はパッケージ名とActivity名を表示します。

2、すべてのオンラインデバイスを取得する
通過する adb devicesコマンドは、コンテンツを出力することによって、一回のフィルタリングを行い、PC側に接続されている全ての設備を得る。

#     ID
devices = []

def get_online_devices(self):
    """
             
    :return:
    """
    global devices
    try:
        for device_serias_name in exec_cmd("adb devices"):
           #                
           if "device" in device_serias_name:
              devices.append(device_serias_name.split("\t")[0])
           devices = devices[1:]
    except Exception as e:
            print(e)

    #           
    return devices
3、グループコントロールが目的のアプリケーションを開く
デバイスリストを巡回して、使用 adb -sデバイスID shell am start -W コマンドは、それぞれターゲットアプリケーションを開きます。

def start_app(self):
    """
      App
    :return: 
    """
    for device in devices:
        os.popen("adb -s " + device + " shell am start -W {}/{}".format(self.packageName, self.home_activity))
    print('      ...')
    sleep(10)
4、パッケージ実行手順
デバイスを便利に管理するために、ステップ毎の操作をYAMLファイルに書き込みます。IDで要素を検索してクリック操作を実行します。入力ボックスに内容を入力して、ローカルメソッドを呼び出して、パラメータを入力してください。
ここでは、それぞれ対応しています。UIツリーコントロールの保存、入力ボックス要素の検索、クリック操作の実行、UIツリーコントロールの保存、テキストコンテンツの入力、検索ボタン要素の表示、クリック操作の実行などがあります。

# steps_adb.yaml

#    Activity
package_name:  com.taobao.idlefish
home_activity:  com.taobao.fleamarket.home.activity.InitActivity

#     
steps:
  - save_ui_tree_to_local:
      method:  save_ui_tree_to_local
      args:
  - find_element_and_click:
      id:  com.taobao.idlefish:id/tx_id
  - save_ui_tree_to_local:
      method:  save_ui_tree_to_local
  - input_content:
      content:  Python
  - find_element_and_click:
      id:  com.taobao.idlefish:id/search_button
グループ制御の適合性を高めるためには、コントロールの実際の座標は以下のステップで取得する必要があることを指摘してください。
  • は、インターフェースのコントロールツリー
  • を導出する。
  • は、コントロールツリーXMLファイルを解析し、正規表現を用いてターゲットコントロールの座標値
  • を得る。
  • は、コントロールの中心点座標
  • を計算します。

    コントロールIDを利用して要素の中心点座標を取得する実現コードは以下の通りです。
    
    def get_element_position(element_id, uidump_name):
        """
             id,  ElementTree,       ,          
        :param element_id:   id,  :
        :return:     
        """
    
        #   XML
        tree = ET.parse('./../%s.xml' % uidump_name)
        root = tree.getroot()
    
        #       
        result_element = None
    
        # print('    ', len(root.findall('.//node')))
    
        #     node  
        #     id
        for node_element in root.findall('.//node'):
            if node_element.attrib['resource-id'] == element_id:
                result_element = node_element
                break
    
        #        ,     
        if result_element is None:
            print('  !     !')
            return None
    
        #     
        coord = re.compile(r"\d+").findall(result_element.attrib['bounds'])
    
        #      
        position_center = int((int(coord[0]) + int(coord[2])) / 2), int((int(coord[1]) + int(coord[3])) / 2)
    
        return position_center
    5、設備を区分する
    コンステレーションスクリプトの実行に干渉が発生しないようにするために、各ステップの実行前に、デバイスIDをパラメータとして区別するべきである。
    例えば、コントロールのインターフェースコントロールツリーをデバイスによって異なる名前として保存し、インターフェースをクリックし、入力したコマンドをデバイスIDとして送信します。
    
    def save_ui_tree_to_local(dName):
        """
            Activity   ,     
              :uidump.xml
        :param dName:   id
        :return:
        """
    
        exec_cmd("adb  -s %s shell uiautomator dump /data/local/tmp/%s.xml" % (dName, dName))
    
        sleep(2)
    
        exec_cmd("adb -s %s pull /data/local/tmp/%s.xml ./../" % (dName, dName))
    6、実行ステップ
    YAMLファイルから実行ステップを読み込み、ステップのセットを巡回して、デバイスリストを巡回して、各ステップを保証します。それぞれのデバイスに実行します。
    
    #     
    for step in self.steps:
        #   
        for device in devices: 
            pass
    次に、ステップ名が異なる動作にマッチすることで、デバイスを操作することができます。
    
    #     
    step_name = list(step)[0]
    
    if step_name == 'save_ui_tree_to_local':
        #   UI    
        method = step.get(step_name).get('method')
        save_ui_tree_to_local(device)
    elif step_name == 'find_element_and_click':
        element_id = step.get(step_name).get('id')
        #        
        bound_search_input = get_element_position(element_id, device)
        #     
        exec_cmd('adb -s %s shell input tap %s %s' % (device, bound_search_input[0], bound_search_input[1]))
    elif step_name == 'input_content':
        input_content = step.get(step_name).get('content')
        #     
        exec_cmd('adb -s %s shell input text %s' % (device, input_content))
    else:
        print('      ')
    7、アプリケーションを閉じる
    すべての操作が完了したら、同様にデバイスを巡回して、adbコマンドを利用してアプリをクローズすればいいです。
    
    def stop_all(self):
       """
           
       :return:
       """
       for device in devices:
           os.popen("adb -s " + device + " shell am force-stop  %s" % self.packageName)
    4.最後に
    本編はPython自動化グループ制御の最も簡単な実現方式にすぎないです。後はもっと複雑な実現方法を検討します。
    プロジェクト住所:https://github.com/xingag/test_aut/tree/master/group_control
    以上がpythonの自動化グループ制御のステップの詳細です。python自動化グループ制御に関する資料は他の関連記事に注目してください。