基于adb操作安卓手机封装的python库

这篇具有很好参考价值的文章主要介绍了基于adb操作安卓手机封装的python库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

import re
import shlex
import subprocess


class ADBClient:
    def __init__(self, ip, port):
        """
        初始化ADBClient实例。
        :param ip: 远程设备的IP地址。
        :param port: 远程设备的端口号。
        """
        self.ip = ip
        self.port = port

    def is_app_running(self, package_name):
        """
        检查指定的应用是否正在设备上运行。
        :param package_name: 应用的包名。
        :return: 如果应用正在运行,返回True;否则返回False。
        """
        try:
            # 通过ADB命令获取当前运行中的应用列表,并检索目标应用包名
            result = subprocess.run(["adb", "-s", f"{self.ip}:{self.port}", "shell", "ps"], capture_output=True,
                                    text=True)
            output = result.stdout

            # 使用正则表达式搜索应用包名
            if re.search(package_name, output):
                return True
            else:
                return False
        except subprocess.CalledProcessError as e:
            # 打印错误信息并返回False,表示未能成功执行ADB命令
            print(f"发生错误:{e}")
            return False

    def open_app(self, package_name, activity_name):
        """
        在设备上启动指定的应用。
        :param package_name: 应用的包名。
        :param activity_name: 应用要启动的Activity名称。
        :return: 如果应用成功启动,返回True;否则返回False。
        """
        try:
            # 首先检查应用是否已经在运行
            if self.is_app_running(package_name):
                print("@@@应用已经在运行")
                return True

            # 如果应用未运行,则通过ADB命令启动应用
            subprocess.run(["adb", "-s", f"{self.ip}:{self.port}", "shell", "am", "start", "-n",
                            f"{package_name}/{activity_name}"])
        except subprocess.CalledProcessError as e:
            # 如果ADB命令执行出错,打印错误信息
            print(f"发生错误:{e}")
            return False

    def execute_adb_command(self, adb_command):
        """
        执行ADB命令,并返回命令的输出和错误信息。

        参数:
        - adb_command: 要执行的ADB命令字符串。

        返回值:
        - 一个元组,包括命令的输出(stdout)和错误信息(stderr)。如果命令执行失败,返回None和错误信息。
        """
        try:
            # 使用subprocess运行ADB命令,将命令字符串分割为列表,添加设备IP和端口信息
            result = subprocess.run(["adb", "-s", f"{self.ip}:{self.port}"] + adb_command.split(), capture_output=True,
                                    text=True)
            # 返回执行结果的输出和错误信息
            return result.stdout, result.stderr
        except subprocess.CalledProcessError as e:
            # 如果命令执行出错,返回错误信息
            return None, f"发生错误:{e}"

    def get_current_window_info(self):
        """
        获取当前窗口的信息,包括包名和应用名称。

        该方法通过运行ADB命令,提取当前焦点窗口的包名和应用名称。

        返回:
            tuple: 成功时返回一个包含包名和应用名称的元组 (pkg, path);如果无法提取到信息,则返回 (None, None)。
        """
        # 构造获取当前窗口信息的ADB命令
        cmd = 'shell dumpsys window | grep mCurrentFocus'
        # 运行ADB命令并获取输出
        result = subprocess.run(["adb", "-s", f"{self.ip}:{self.port}"] + cmd.split(), capture_output=True, text=True)
        output = result.stdout.strip()

        # 使用正则表达式提取包名和应用名称
        pattern = r"mCurrentFocus=Window\{.+?\s+(\S+)/(.+?)\}"
        match = re.search(pattern, output)

        if match:
            # 如果匹配成功,提取并返回包名和应用名称
            pkg = match.group(1)
            path = match.group(2)
            return pkg, path
        else:
            # 如果匹配失败,返回None
            return None, None

    # 坐标点击事件
    def tap_by_coordinates(self, x, y):
        try:
            # 构建 adb 命令
            cmd = ["adb", "-s", f"{self.ip}:{self.port}", "shell", "input", "tap", str(x), str(y)]

            # 执行点击事件
            subprocess.run(cmd, check=True)
            print(f"已点击坐标 ({x}, {y})")

        except subprocess.CalledProcessError as e:
            print(f"Error: {e}")

    # 跳转到path指定页面
    def toPath(self, action, param=None):
        """
           根据指定的操作动作和参数,向应用发送命令,实现页面跳转或其他操作。

           参数:
           action: 字符串,指定要执行的操作,例如"settings"表示设置页面。
           param: 可选参数,字符串类型,当需要传递额外的参数给操作时使用,比如用户ID或视频ID等。

           返回值: True表示操作成功,False表示操作失败。
           """
        commands = {
            # 某页面
            "settings": "am start -n ..."
            # 其他页面往这放
        }

        # 检查命令是否在映射中
        if action in commands:
            # 执行命令
            full_cmd = ["adb", "-s", f"{self.ip}:{self.port}", "shell"] + shlex.split(commands[action])
            subprocess.run(full_cmd, check=True)
            return True
        else:
            # 如果命令不在映射中,返回False
            return False

食用方法文章来源地址https://www.toymoban.com/news/detail-858380.html

# 创建ADBClient实例,并尝试打开指定的应用
adb_client = ADBClient('192.168.1.5', '5003')
adb_client.open_app("com.zhiliaoapp.musically", "com.ss.android.ugc.aweme.splash.SplashActivity")
res = adb_client.execute_adb_command("root")
print("执行adb命令返回的结果:" + str(res))

# 获取当前活动的应用程序包名称和页面ID
pkg, path = adb_client.get_current_window_info()
print("当前活动的应用程序包名称:", pkg)
print("当前活动的页面ID:", path)

# 模拟点击"com.zhiliaoapp.musically:id/c5w"元素
adb_client.tap_by_coordinates(667, 633)

# 跳转页面
adb_client.toPath('settings')

到了这里,关于基于adb操作安卓手机封装的python库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • python+Appium实现手机移动端自动化 - 模拟器 或 真机【有线】

    有线连接真机,实现真机自动化?实现模拟器自动化?在这里,都能满足你的需求! 什么都不说了,直接上干货吧,亲测可用哦👇 首先,先介绍下所需的环境,如下: JDK1.8 Appium Python3.x Android-sdk 夜深模拟器/mumu模拟器(PS: 自动化真机时可以选择不安装) 1)下载 方式1:官

    2024年02月16日
    浏览(39)
  • appium桌面版本以及一些自动化测试方方封装

    标签(空格分隔): appium_desktop 一 appium_desktop_v1.2.6 1.appium_desktop在github上最新下载地址:appium桌面版本地址 2.一路傻瓜式安装就好了: 3.然后点击搜索按钮(右上角) 三 inspector 1.元素定位探测器,在Desired Capabilitis下表格输入参数配置信息: 2.参数配置好之后可以保存下,连

    2023年04月13日
    浏览(67)
  • appium-app测试-环境搭建手机和adb设置

    1、手机设置(Android手机-readMI k50): 1.1开发者模式设置 入口:设置–我的设备–全部参数与信息; 连续点击MIUI版本7下,进入开发者模式 1.2、开发者选项设置 入口:设置–更多设置–开发者选项:打开USB调试和USB安装 2、安装Android Studio及Android SDK 2.1安装Android Studio:网上

    2024年02月09日
    浏览(33)
  • 安卓手机 Python 自动化( uiautomation、uiautomation2、weditor )

    其他自动化工具或者框架: Airtest:https://airtest.readthedocs.io/zh_CN/latest/ autojs:Auto.js快速入门实战教程:https://zhuanlan.zhihu.com/p/90065914 appium:https://blog.csdn.net/freeking101/article/details/107881979 AutomateIt、Automate、按键精灵、AutoJS 等 Android 自动化工具有什么特点?:https://www.zhihu.com/qu

    2024年02月09日
    浏览(34)
  • Appium微信小程序自动化之开启webview调试功能方法封装

    Appium在微信小程序自动化时,需要开启微信的webview调试功能,以方便对webview的元素进行定位。 运行代码之后,可以顺利打开微信,通过向自己发送消息并点击消息,开启webview调试功能: 看到这个页面后,表示启动微信webview调试功能启动生效。 欢迎技术交流:

    2024年04月13日
    浏览(32)
  • termux安卓手机 无线adb调试安卓手机

    调试机安转termux app  Apk下载 安装 https://f-droid.org/packages/com.termux   打开termux 挂载内部存储到~/storage 目录 $ temux-setup-storage   换源加快下载与更新速度 termux-change-repo 选 Main 然后 清华   下载基础软件  pkg install git vim perl nodejs-lts wget curl nano cronie moreutils -y   安装adb git clone ht

    2024年02月09日
    浏览(39)
  • appium+华为鸿蒙手机自动化(环境配置)

    安装python appium client,cmd中输入 pip install appium-python-client 等待安装完成即可。 JDK官方网址:Download 建议选择exe,可以选择路径,而且安装完成之后,java的环境变量都会保存在javapath的目录中。 如果你的JDK版本不是新的,那么你在安装完成之后,可能需要配置一下环境变量。

    2023年04月26日
    浏览(39)
  • Java + Selenium + Appium手机自动化测试

    一、启动测试机或者Android模拟器(Genymotion俗称世界上最快的模拟器,可自行百度安装) 二、启动Appium(Appium环境安装可自行百度)   三、安装应用到Genymotion上,如下图我安装一个计算机的小应用,包名为CalcTest.apk 安装步骤:(基于Android SDK已经配置好了环境变量,可自行

    2024年02月06日
    浏览(40)
  • APP自动化测试(2)-通过appium打开手机的应用

    目录 一、appium的Capabilities配置及Appium Inspector安装 1.1安装Appium Inspector 1.2Capabilities配置 二、获取手机以及app的信息 2.1获取连接设计的配置名称 2.1.1连接手机 2.1.2获取设备名称  2.2利用adb获取日志找到appPackage和appActivity   三、Start Session 3.1 安装appium-doctor 3.2解决appium-doctor查出

    2024年02月08日
    浏览(40)
  • adb连接安卓手机

    提示:这里主要记录电脑通过adb命令连接安卓手机操作 1、电脑本地上需要安装配置好Android SDK 安装网址:link 2、手机的USB连接线是完好无损坏的,可以进行传输数据 1、手机上开启开发者选项 首先需要开启Android设备的开发者选项和允许USB调试。 1) 打开手机找到【设置】--找

    2024年02月16日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包