【UI自动化框架第五张】AndroidUiAutomation 类功能简介

一、AndroidUiAutomation 类 功能简介

  • 功能: 为 Android 设备提供 UI 自动化操作的工具类,支持连接设备、获取截图、点击、滑动、获取屏幕分辨率和清理资源等功能。

  • 参数:

    • device_id(可选):设备 ID(如 "emulator-5554"),如果未指定则自动检测。
  • 异常:

    • ConnectionError:如果无法连接设备。
  • 说明:

    AndroidUiAutomation 类基于 uiautomator2 库与 Android 设备交互,提供了一系列方法来执行常见的 UI 操作,适用于 UI 测试和自动化任务。


二、代码功能解析

1. __init__ 方法

  • **功能:**初始化 AndroidUiAutomation 类并连接设备。

  • 参数:

    • device_id(可选):设备 ID(字符串类型)。
  • 代码片段:

    python 复制代码
    def __init__(self, device_id=None):
        try:
            self.device = u2.connect(device_id) if device_id else u2.connect()
            print(f"成功连接设备: {self.device.device_info}")
        except Exception as e:
            raise ConnectionError(f"无法连接设备: {e}")
  • 说明:

    • 如果提供了 device_id,则连接指定设备;否则,自动检测并连接设备。

    • 连接失败时抛出 ConnectionError 异常


2. get_screenshot 方法

  • **功能:**获取设备屏幕的实时截图,并可选择保存到文件。

  • 参数:

    • save_path(可选):保存截图的路径(字符串类型),如果为 None 则不保存。
  • 返回值:

    • numpy.ndarray:OpenCV 格式的截图(BGR 格式)。
  • 异常:

    • Exception:如果截图失败。
  • 代码片段:

    python 复制代码
    def get_screenshot(self, save_path=None):
        try:
            screenshot = self.device.screenshot(format='opencv')
            if save_path:
                cv2.imwrite(save_path, screenshot)
                print(f"截图已保存到: {save_path}")
            return screenshot
        except Exception as e:
            raise Exception(f"获取截图失败: {e}")
  • 说明:

    • 返回设备的实时截图(OpenCV 格式)。

    • 如果指定了 save_path,则保存截图到该路径。


3. click 方法

  • **功能:**点击设备屏幕上的指定坐标。

  • 参数:

    • x:X 坐标(整数类型)。

    • y:Y 坐标(整数类型)。

  • 返回值:

    • bool:操作是否成功。
  • 异常:

    • ValueError:如果坐标无效或超出屏幕范围。
  • 代码片段:

    python 复制代码
    def click(self, x, y):
        try:
            width, height = self.device.window_size()
            if not (0 <= x < width and 0 <= y < height):
                raise ValueError(f"坐标 ({x}, {y}) 超出屏幕范围 {width}x{height}")
            self.device.click(x, y)
            print(f"成功点击坐标 ({x}, {y})")
            return True
        except Exception as e:
            print(f"点击失败: {e}")
            return False
  • 说明:

    • 检查坐标是否在屏幕范围内,若有效则执行点击操作并返回 True,否则返回 False。

4. swipe_coordinates 方法

  • **功能:**在设备屏幕上从起始坐标滑动到结束坐标。

  • 参数:

    • start_x:起始点 X 坐标(整数类型)。

    • start_y:起始点 Y 坐标(整数类型)。

    • end_x:结束点 X 坐标(整数类型)。

    • end_y:结束点 Y 坐标(整数类型)。

    • duration(可选):滑动时长(毫秒,默认为 500ms)。

  • 返回值:

    • bool:操作是否成功。
  • 异常:

    • ValueError:如果坐标无效或超出屏幕范围。
  • 代码片段:

    python 复制代码
    def swipe_coordinates(self, start_x, start_y, end_x, end_y, duration=500):
        try:
            width, height = self.device.window_size()
            if not (0 <= start_x < width and 0 <= start_y < height and 
                    0 <= end_x < width and 0 <= end_y < height):
                raise ValueError(f"坐标超出屏幕范围 {width}x{height}")
            self.device.swipe(start_x, start_y, end_x, end_y, duration)
            print(f"成功从 ({start_x}, {start_y}) 滑动到 ({end_x}, {end_y}),时长 {duration}ms")
            return True
        except Exception as e:
            print(f"滑动失败: {e}")
            return False
  • 说明:

    • 检查坐标有效性后执行滑动操作,返回操作结果。

5. get_screen_resolution 方法

  • **功能:**获取设备屏幕的分辨率。

  • 返回值:

    • tuple:屏幕分辨率(width, height)。
  • 代码片段:

    python 复制代码
    def get_screen_resolution(self):
        try:
            width, height = self.device.window_size()
            print(f"屏幕分辨率: {width}x{height}")
            return width, height
        except Exception as e:
            print(f"获取分辨率失败: {e}")
            return None, None
  • 说明:

    • 返回屏幕的宽度和高度,失败时返回 (None, None)。

6. cleanup 方法

  • **功能:**清理资源,断开设备连接。

  • 返回值:

    • bool:操作是否成功。
  • 代码片段:

    python 复制代码
    def cleanup(self):
        try:
            self.device.disconnect()
            print("设备连接已断开")
            return True
        except Exception as e:
            print(f"清理失败: {e}")
            return False
  • 清理资源,断开设备连接

    • 断开设备连接并释放资源,返回操作结果。

UiAutomation

  • **功能:**根据系统和语言初始化 UI 自动化操作,并提供模拟操作步骤的方法。

  • 参数:

    • **system:**操作系统类型(字符串类型,如 "android")。

    • **language:**语言类型(字符串类型,如 "en")。

  • 说明:
    UiAutomation 类设计为根据系统和语言配置初始化 UI 操作环境,并通过 simulation_operation_step 方法执行具体操作步骤。


1. __init__ 方法

  • **功能:**初始化 UiAutomation 类。

  • 参数:

    • system:操作系统类型(字符串类型)。

    • language:语言类型(字符串类型)。

  • 代码片段:

    python 复制代码
    def __init__(self, system, language):
        if system == "android":
            # self.drive = AndroidUiAutomation()
            print(f"system: {system}, language: {language}")
        # self.action = UITools(self.drive, language)
  • 说明:

    • 根据 system 判断操作系统类型,当前仅支持 "android"。

    • self.driveself.action 被注释掉,仅打印系统和语言信息。

    • 注意:初始化逻辑不完整,建议启用并完善相关代码。


2. simulation_operation_step 方法

  • **功能:**根据步骤执行 UI 操作。

  • 参数:

    • step:操作步骤(字典类型,包含 "type"、"action" 和 "value" 键)。

    • keywords(可选):操作关键词列表(默认为 "type", "action", "value")。

  • 代码片段:

    python 复制代码
    def simulation_operation_step(self, step, keywords=None):
        if keywords is None:
            keywords = ["type", "action", "value"]
        type = step[keywords[0]]        # 识别方法:文字识别/图片识别
        action = step[keywords[1]]      # 操作方法:点击/输入/滑动
        value = step[keywords[2]]       # 数据
        if type in ["text", "ocr", "文本"]:
            if action in ["click", "点击"]:
                # self.action.click_text(value)
                print(f"text: {value}")
        elif type in ["image", "图片"]:
            if action in ["click", "点击"]:
                # self.action.click_image(value)
                print(f"image: {value}")
        else:
            raise ValueError("不支持的操作类型")
  • 说明:

    • 根据 step 中的 type 和 action 执行操作,支持文本识别("text"、"ocr"、"文本")和图片识别("image"、"图片")。

    • 当前仅支持点击操作,实际操作被注释掉,仅打印信息。

    • 注意:需实现 self.action 的相关方法以完成功能。


三、思路总结

核心思路:

  1. 模块化设计:

    • AndroidUiAutomation 类封装了设备交互的基本操作(如连接、截图、点击、滑动),基于 uiautomator2 实现。

    • UiAutomation 类负责根据系统和语言初始化环境,并提供操作步骤的执行接口。

  2. 灵活的操作支持:

    • 支持通过文本识别和图片识别定位 UI 元素,并执行点击等操作。

    • simulation_operation_step 方法设计为可扩展,支持更多操作类型(如输入、滑动)。

  3. 异常处理和资源管理:

    • AndroidUiAutomation 类中包含了连接错误处理和资源清理功能,确保操作的稳定性和资源释放。
  4. 当前实现状态:

    • UiAutomation 类的核心功能(self.drive 和 self.action)被注释掉,仅打印信息,未实现实际操作。

    • 代码注释表明作者计划集成 AndroidUiAutomation 和 UITools 来完成完整功能,但尚未实现。

  5. 改进建议:

    • 完善 UiAutomation 类的初始化逻辑,启用 self.drive 和 self.action。

    • 实现 UITools 中的 click_text 和 click_image 方法,以支持文本和图片识别的点击操作。

    • 💢 扩展 simulation_operation_step 方法,支持更多操作类型(如输入、滑动)

相关推荐
大树888 小时前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠8 小时前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质8 小时前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工9 小时前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
laowangpython9 小时前
Photoshop 2025 下载安装全攻略
其他·ui·photoshop
酣大智9 小时前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_10 小时前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉10 小时前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
dayuOK630711 小时前
写作卡壳怎么办?我的“5分钟启动法”
人工智能·职场和发展·自动化·新媒体运营·媒体
AC赳赳老秦11 小时前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw