python+adb

python 复制代码
#!/usr/bin/python env
# -*- coding: utf-8 -*-
import os
import sys
import subprocess
from time import sleep

import logging
logging.basicConfig(level=logging.DEBUG)
class ScreenCapture():

    def get_screen_size(self):
        """获取手机分辨率"""

        action = subprocess.Popen(['adb', 'shell', 'wm', 'size'], stdout=subprocess.PIPE)
        result = action.stdout.read()
        _, size = result.decode().split(':')
        self.width,self.height = size.strip().split('x')
        print(f'获取到手机分辨率为:{self.width},{self.height}')  # 1080,2436

        # return int(width), int(height)
        # print(f"result是{result}")
        # print(result.decode())
        # ss=result.decode().split(':')
        # aaa=ss[1].strip()

        self.x1=int(self.width)/2

        self.x2=int(self.width)/2
        self.y1=int(self.height)/4
        self.y2=int(self.height)/1.5
        print(f"x1是{self.x1},x2是{self.x2},y1是{self.y1},y2是{self.y2}")

    @staticmethod
    def show_menu():

        print("========================================================== ")
        print("||      <1>远程连接设备       <2>向左滑动       <3>向右滑动    ||\n")
        print("||      <4>向上滑动           <5>向下滑动       <6>跑Monkey    ||\n")
        print("||      <7>单场景chrome测试   <8>               <9>          ||\n")
        print(" ========================================================= \n")
        # subprocess.Popen(
        #     ['adb', 'shell', 'input', 'swipe', str(self.x1), str(self.y1), str(self.x1), str(self.y2), '500'],
        #     stdout=subprocess.PIPE)
        # return int(width), int(height)
        # self.ScreenCapture(y1, y2, height)
        # subprocess.Popen(['adb', 'shell', 'input', 'swipe', str(self.x1), str(self.y1), str(self.x1), str(self.y2), '500'],stdout=subprocess.PIPE)

    def up_swipe(self):
        up_num = int(input("向上滑动多少次,用数字替代:"))
        interval_time = int(input("输入间隔的时间:"))
        for i in range(up_num):
            subprocess.Popen(
                ['adb', 'shell', 'input', 'swipe', str(self.x1), str(self.y1), str(self.x1), str(self.y2), '500'],
                stdout=subprocess.PIPE)
            print("第{}次滑动".format(i + 1))
            sleep(interval_time)
        print("滑动结束,退出。。")
        sys.exit()

    def down_swipe(self):
        up_num = int(input("向下滑动多少次,用数字替代:"))
        interval_time=int(input("输入间隔的时间:"))
        for i in range(up_num):
            subprocess.Popen(
                ['adb', '-s',{self.ip_input},'shell', 'input', 'swipe', str(self.x1), str(self.y2), str(self.x1), str(self.y1), '500'],
                stdout=subprocess.PIPE)
            sleep(interval_time)
        print("滑动结束,退出。。")
        sys.exit()

    def left_swipe(self):
        x1=str(int(self.width)*0.8)
        x2=str(int(self.width)*0.2)
        y1=str(int(self.height)*0.5)
        print(x1)
        print("滑动开始前")
        up_num = int(input("向左滑动多少次,用数字替代:"))
        for i in range(up_num):

            subprocess.Popen(
                ['adb', 'shell', 'input', 'swipe', x2, y1, x1, y1, '500'],
                stdout=subprocess.PIPE)
            print("第{}次滑动".format(i+1))
            sleep(3)
        print("滑动结束,退出。。")
        sys.exit()

    def right_swipe(self):
        x1 = str(int(self.width) * 0.8)
        x2 = str(int(self.width) * 0.2)
        y1 = str(int(self.height) * 0.5)
        print(x1)
        print("滑动开始前")
        up_num = int(input("向左滑动多少次,用数字替代:"))
        for i in range(up_num):
            subprocess.Popen(
                ['adb', 'shell', 'input', 'swipe', x1, y1, x2, y1, '300'],
                stdout=subprocess.PIPE)
            print("第{}次滑动".format(i + 1))
            sleep(3)
        print("滑动结束,退出。。")
        sys.exit()

    def get_device_id(self):
        self.adb_devices=os.popen("adb devices").read()
        self.adb_output = self.adb_devices.split("List of devices attached\n", 1)[1]
        lines = self.adb_output.strip().split('\n')
        # 遍历每一行,提取设备号
        self.device_ids = []
        for line in lines:
            # 如果行不是空的,并且包含"device",则提取设备号
            if line and "device" in line:
                device_id, _ = line.split(maxsplit=1)  # maxsplit=1确保只分割一次
                self.device_ids.append(device_id.strip())
                self.device_ids=self.device_ids[0]
        logging.info(f'device_ids号是: {self.device_ids}')
        return self.device_ids

    def adb_connect(self, device_ip):
        adb_command = ['adb', 'connect', f'{device_ip}:5555']
        try:
            subprocess.Popen("adb tcpip 5555", stdout=subprocess.PIPE)
            # subprocess.check_call("adb -s {} tcp ip 5555", stdout=subprocess.PIPE)  #
            output = subprocess.check_output(adb_command, shell=True, stderr=subprocess.STDOUT)
            print(f"Connected to device at {device_ip}:5555")
            print(output.decode())
        except:
            print(f"Failed to connect to device at {device_ip}:5555", "请检查错误")
            sys.exit()

    def get_and_connect_ip(self):
        # 将原本在if num == 1下的代码移到这个方法中adb de
        ip_command = f'adb -s {self.get_device_id()} shell ip route'
        result = subprocess.check_output(ip_command, shell=True, text=True)
        # 提取 IP 地址(这里假设IP地址是route命令输出的最后一行最后一个元素)
        ip_address = result.strip('\n').strip(' ').split(' ')[-1]
        print(f"Detected IP address: {ip_address},远程连接需拔掉USB设备")

        self.ip_input = input("输入你的IP地址(或者按回车使用检测到的IP):")
        if not self.ip_input:
            self.ip_input = ip_address  # 如果用户没有输入,则使用检测到的IP
        self.adb_connect(self.ip_input)

        self.run() # 连接后重新显示菜单

    def chrome_switch(self):
        os.system("adb devices")
        while True:
            os.system(f'adb -s {self.ip_input} shell am start -a android.intent.action.VIEW -d "http://baidu.com"')
            sleep(5)
            for i in range(20):
                subprocess.Popen(
                    ['adb', '-s',self.ip_input,'shell', 'input', 'swipe', str(self.x1), str(self.y2),
                     str(self.x1), str(self.y1), '500'],
                    stdout=subprocess.PIPE)
                sleep(3)
            os.system(f'adb -s {self.ip_input} shell am start -a android.intent.action.VIEW -d "http://163.com"')
            sleep(5)
            for i in range(20):
                subprocess.Popen(
                    ['adb', '-s', self.ip_input, 'shell', 'input', 'swipe', str(self.x1), str(self.y2),
                     str(self.x1),
                     str(self.y1), '500'],
                    stdout=subprocess.PIPE)
                sleep(3)

    #def adb_connect(self, ip_input):
        # 假设此方法用于连接ADB
        #print(f"Connecting to ADB with IP: {ip_input}")
        # ... 省略实际连接ADB的代码

    def run(self):
        ScreenCapture.show_menu()  # 假设ScreenCapture是另一个模块或类,并且有show_menu方法
        num = int(input("输入你要选择的功能,用数字替代:"))

        # 定义动作字典
        action_mapping = {
            1: self.get_and_connect_ip,
            2: self.left_swipe,
            3: self.right_swipe,
            4: self.up_swipe,
            5: self.down_swipe,
            7: self.chrome_switch,
        }

        # 检查输入是否在映射中
        if num in action_mapping:
            action_mapping[num]()
        elif num == 6:
            # 对于特定的num值,可以直接处理
            pass
        else:
            print("\n\t输入有误!!!\t\n")
            self.run()  # 递归调用,重新显示菜单和接收输入


if __name__ == '__main__':
    ScreenCapture().run()
相关推荐
skywalk8163几秒前
当前有什么流行的lisp的web框架吗?
开发语言·前端·lisp
2301_773553621 分钟前
mysql如何优化mysql在多核CPU下的性能_调整线程并发数
jvm·数据库·python
天若有情6733 分钟前
C++进阶:普通重载运算符 vs 隐式类型转换重载运算符,一篇讲透区别
开发语言·c++·算法
源码之家5 分钟前
计算机毕业设计:Python股票智能分析预测平台 Flask框架 数据分析 可视化 机器学习 随机森林 大数据(建议收藏)✅
python·机器学习·数据分析·django·flask·课程设计
a9511416425 分钟前
PHP如何批量处理AI请求_队列系统搭建【技巧】
jvm·数据库·python
sinat_383437366 分钟前
如何实现SQL简单数据的映射查询_使用CASE表达式替换
jvm·数据库·python
ZWZhangYu6 分钟前
MCP 实战:从协议原理到 Java 自定义工具服务落地
java·开发语言·人工智能
2401_835956816 分钟前
JavaScript 中实现基于分组的前端产品筛选功能
jvm·数据库·python
知识分享小能手7 分钟前
R语言入门学习教程,从入门到精通,R语言基础 - 完整知识点与案例代码(1)
开发语言·学习·r语言
m0_746752308 分钟前
SQL中窗口函数的LIMIT限制逻辑_如何分页显示
jvm·数据库·python