Skip to main content

Crate uiautomator

Crate uiautomator 

Source
Expand description

§uiautomator

使用 Rust 实现的 Android UI 自动化测试库

这是一个复刻 Python uiautomator2 的 Rust 库,提供类型安全、高性能的 Android 自动化测试能力。 通过 ADB 与 Android 设备通信,使用 JSON-RPC 协议调用设备端的 UiAutomator 服务。

§特性

  • 🚀 高性能: 基于 Rust 和 Tokio 异步运行时
  • 🔒 类型安全: 利用 Rust 的类型系统避免运行时错误
  • 🔄 异步支持: 支持高并发场景下同时控制多个设备
  • 📱 完整功能: 支持元素定位、手势操作、应用管理、截图等
  • 🛡️ 错误恢复: 自动重试和服务恢复机制

§快速开始

§基础使用

use uiautomator::{Device, Selector, Key};
use std::time::Duration;

#[tokio::main]
async fn main() -> uiautomator::Result<()> {
    // 初始化日志系统
    uiautomator::init_logger();
     
    // 连接到设备(自动选择唯一设备)
    let device = Device::connect(None).await?;
     
    // 获取设备信息
    let info = device.info().await?;
    println!("设备: {}x{}", info.display_width, info.display_height);
     
    // 点击坐标
    device.click(100, 200).await?;
     
    // 按键操作
    device.press(Key::Home).await?;
     
    Ok(())
}

§元素定位和操作

// 通过文本定位元素并点击
device.find(Selector::new().text("设置"))
    .click(None, None).await?;

// 组合条件定位
device.find(Selector::new()
    .text("确定")
    .class_name("android.widget.Button")
    .clickable(true))
    .click(None, None).await?;

// 等待元素出现
device.find(Selector::new().text("加载完成"))
    .wait(Some(std::time::Duration::from_secs(10))).await?;

// 获取元素文本
let text = device.find(Selector::new().resource_id("com.example:id/title"))
    .get_text().await?;
println!("标题: {}", text);

§应用管理

// 启动应用
device.app_start("com.android.settings", None).await?;

// 等待应用启动
device.app_wait("com.android.settings",
    Some(std::time::Duration::from_secs(10))).await?;

// 获取当前应用
let app = device.app_current().await?;
println!("当前应用: {}", app.package);

// 停止应用
device.app_stop("com.android.settings").await?;

§截图

// 截图并保存
device.screenshot_to_file("screenshot.png").await?;

// 获取图像数据
let image = device.screenshot().await?;
println!("截图尺寸: {}x{}", image.width(), image.height());

§从 Python uiautomator2 迁移

本库的 API 设计尽可能与 Python 版本保持一致,主要差异:

  • 所有 I/O 操作都是异步的,需要 .await?
  • 使用 Rust 的类型系统(如 Duration 而不是浮点数秒)
  • 使用 Result<T>? 操作符处理错误
  • 可选参数使用 Option<T>

§服务模式

支持两种设备端服务模式:

  • Direct 模式(当前默认): 快速启动,适合开发测试
  • ATX-Agent 模式(未来默认): 生产级稳定性,推荐长期运行
// 使用默认模式
let device = Device::connect(None).await?;

// 快速模式(Direct)
let device = Device::connect_quick(None).await?;

// 显式指定模式
let device = Device::connect_with_mode(None, ServerMode::Direct).await?;

Re-exports§

pub use device::Device;
pub use device::ServerMode;
pub use error::Error;
pub use error::Result;
pub use key::Key;
pub use selector::Selector;
pub use settings::Settings;
pub use uiobject::UiObject;
pub use adb::AdbClient;
pub use atx_agent::AtxAgentClient;
pub use jsonrpc::JsonRpcClient;
pub use models::AppInfo;
pub use models::Coord;
pub use models::DeviceInfo;
pub use models::ElementInfo;
pub use models::Rect;

Modules§

adb
ADB 客户端封装 ADB 客户端封装
atx_agent
ATX-Agent REST API 客户端 ATX-Agent REST API 客户端
device
设备连接和操作的核心实现 Device 核心功能
error
错误类型和结果类型定义 错误类型定义
jsonrpc
JSON-RPC 客户端实现 JSON-RPC 客户端
key
按键枚举 Android 按键定义
models
数据模型定义 数据模型定义
selector
UI 元素选择器
settings
配置和设置 配置设置
uiobject
UI 对象操作 UiObject 模块

Functions§

init_logger
初始化日志系统
init_logger_with_level
使用自定义日志级别初始化日志系统