d.xpath('//*[@text="设置"]')d(resourceId="com.example:id/button")d(className="android.widget.Button")d(description="搜索")d.xpath('//android.widget.Button[@text="确定"]')element.click()element.long_click()element.double_click()element.set_text("Hello")element.clear_text()d.swipe(x1, y1, x2, y2)d.drag(x1, y1, x2, y2)d.pinch()d.rotate()d.app_start("com.example.app")d.app_stop("com.example.app")d.app_current()d.app_list()d.press('back'), d.press('home')d.press('volume_up')d.screen_on(), d.screen_off()element.wait(timeout=10)element.existselement.wait_gone()d.click(x, y)element.infod.window_size()d.info示例代码:
bash展开代码#!/usr/bin/env python3
"""
uiautomator2 完整能力演示
展示uiautomator2的所有主要功能
"""
import uiautomator2 as u2
import json
import os
import time
from datetime import datetime
from PIL import Image
def demo_all_capabilities():
"""
演示uiautomator2的所有能力
"""
print("🚀 uiautomator2 完整能力演示")
print("="*60)
try:
# 连接设备
d = u2.connect()
print(f"📱 已连接设备: {d.info.get('productName', 'Unknown')}")
print(f"📱 设备信息: {d.info}")
print()
# 1. 截图能力
print("📸 1. 截图功能")
print("-" * 30)
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
screenshot_path = f"demo_screenshot_{timestamp}.png"
d.screenshot(screenshot_path)
print(f"✅ 截图已保存: {screenshot_path}")
print()
# 2. 元素查找能力
print("🔍 2. 元素查找功能")
print("-" * 30)
# 2.1 按文字查找
print("按文字查找:")
text_elements = d.xpath('//*[@text]').all()
print(f" 找到 {len(text_elements)} 个有文字的元素")
# 2.2 按类型查找
print("按类型查找:")
buttons = d.xpath('//android.widget.Button').all()
textviews = d.xpath('//android.widget.TextView').all()
imageviews = d.xpath('//android.widget.ImageView').all()
print(f" Button: {len(buttons)} 个")
print(f" TextView: {len(textviews)} 个")
print(f" ImageView: {len(imageviews)} 个")
# 2.3 按ID查找
print("按ID查找:")
id_elements = d.xpath('//*[@resource-id]').all()
print(f" 找到 {len(id_elements)} 个有ID的元素")
# 2.4 按内容描述查找
print("按内容描述查找:")
desc_elements = d.xpath('//*[@content-desc]').all()
print(f" 找到 {len(desc_elements)} 个有内容描述的元素")
print()
# 3. 元素操作能力
print("🎯 3. 元素操作功能")
print("-" * 30)
# 3.1 点击操作
print("点击操作:")
clickable_elements = d.xpath('//*[@clickable="true"]').all()
print(f" 找到 {len(clickable_elements)} 个可点击元素")
# 3.2 输入操作
print("输入操作:")
editable_elements = d.xpath('//*[@class="android.widget.EditText"]').all()
print(f" 找到 {len(editable_elements)} 个可编辑元素")
# 3.3 滑动操作
print("滑动操作:")
print(" 支持上下左右滑动")
print(" 支持指定距离和时间的滑动")
print()
# 4. 等待和检测能力
print("⏰ 4. 等待和检测功能")
print("-" * 30)
# 4.1 等待元素出现
print("等待元素出现:")
try:
# 等待某个元素出现(这里用系统时间作为示例)
clock_element = d.xpath('//*[@resource-id="com.android.systemui:id/clock"]')
if clock_element.exists:
print(" ✅ 系统时钟元素存在")
else:
print(" ❌ 系统时钟元素不存在")
except:
print(" ⚠️ 无法检测系统时钟")
# 4.2 检测应用状态
print("检测应用状态:")
current_app = d.app_current()
print(f" 当前应用: {current_app.get('package', 'Unknown')}")
print(f" 应用名称: {current_app.get('name', 'Unknown')}")
print()
# 5. 手势操作能力
print("👆 5. 手势操作功能")
print("-" * 30)
print("支持的手势:")
print(" - 点击 (click)")
print(" - 长按 (long_click)")
print(" - 双击 (double_click)")
print(" - 滑动 (swipe)")
print(" - 拖拽 (drag)")
print(" - 缩放 (pinch)")
print(" - 旋转 (rotate)")
print()
# 6. 应用控制能力
print("📱 6. 应用控制功能")
print("-" * 30)
# 6.1 应用启动
print("应用启动:")
print(" - 启动应用: d.app_start(package_name)")
print(" - 停止应用: d.app_stop(package_name)")
print(" - 清除应用数据: d.app_clear(package_name)")
# 6.2 应用信息
print("应用信息:")
installed_apps = d.app_list()
print(f" 已安装应用数量: {len(installed_apps)}")
print(" 前5个应用:")
for i, app in enumerate(installed_apps[:5], 1):
print(f" {i}. {app}")
print()
# 7. 设备控制能力
print("🔧 7. 设备控制功能")
print("-" * 30)
# 7.1 设备信息
print("设备信息:")
device_info = d.info
print(f" 屏幕尺寸: {device_info.get('displayWidth')}x{device_info.get('displayHeight')}")
print(f" 设备型号: {device_info.get('productName', 'Unknown')}")
print(f" Android版本: {device_info.get('version', 'Unknown')}")
# 7.2 设备操作
print("设备操作:")
print(" - 返回键: d.press('back')")
print(" - 主页键: d.press('home')")
print(" - 菜单键: d.press('menu')")
print(" - 电源键: d.press('power')")
print(" - 音量键: d.press('volume_up/volume_down')")
print()
# 8. 高级功能
print("🚀 8. 高级功能")
print("-" * 30)
# 8.1 坐标操作
print("坐标操作:")
width, height = d.window_size()
print(f" 屏幕中心坐标: ({width//2}, {height//2})")
print(" - 点击坐标: d.click(x, y)")
print(" - 滑动坐标: d.swipe(x1, y1, x2, y2)")
# 8.2 元素属性获取
print("元素属性获取:")
if text_elements:
first_element = text_elements[0]
print(f" 第一个元素信息:")
print(f" 文字: {first_element.text}")
print(f" 类名: {first_element.info.get('className', 'Unknown')}")
print(f" 资源ID: {first_element.info.get('resourceId', 'Unknown')}")
print(f" 位置: {first_element.info.get('bounds', {})}")
print(f" 可点击: {first_element.info.get('clickable', False)}")
print()
# 9. 实际演示
print("🎬 9. 实际演示")
print("-" * 30)
# 9.1 获取所有交互元素
interactive_elements = []
for element in d.xpath('//*').all():
info = element.info
if (info.get('clickable', False) or
info.get('focusable', False) or
info.get('contentDescription', '') or
info.get('text', '')):
interactive_elements.append({
'text': element.text or '',
'content_desc': info.get('contentDescription', ''),
'class_name': info.get('className', ''),
'clickable': info.get('clickable', False),
'bounds': info.get('bounds', {})
})
print(f"找到 {len(interactive_elements)} 个交互元素")
print("前10个交互元素:")
for i, element in enumerate(interactive_elements[:10], 1):
display_text = element['text'] or element['content_desc'] or '无文字'
print(f" {i:2d}. {display_text}")
print(f" 类型: {element['class_name']}")
print(f" 可点击: {element['clickable']}")
print()
print("✅ 演示完成!")
print("="*60)
print("📚 uiautomator2 主要能力总结:")
print("1. 📸 截图 - 获取手机屏幕截图")
print("2. 🔍 元素查找 - 按各种条件查找UI元素")
print("3. 🎯 元素操作 - 点击、输入、滑动等操作")
print("4. ⏰ 等待检测 - 等待元素出现、检测应用状态")
print("5. 👆 手势操作 - 各种复杂手势操作")
print("6. 📱 应用控制 - 启动、停止、管理应用")
print("7. 🔧 设备控制 - 控制设备按键、获取设备信息")
print("8. 🚀 高级功能 - 坐标操作、属性获取等")
print("9. 🤖 自动化 - 完整的UI自动化测试能力")
except Exception as e:
print(f"❌ 演示失败: {e}")
print("请确保:")
print("1. 设备已连接 (adb devices)")
print("2. 已开启USB调试")
print("3. 已安装uiautomator2 (pip install uiautomator2)")
if __name__ == "__main__":
demo_all_capabilities()


本文作者:Dong
本文链接:
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC。本作品采用《知识共享署名-非商业性使用 4.0 国际许可协议》进行许可。您可以在非商业用途下自由转载和修改,但必须注明出处并提供原作者链接。 许可协议。转载请注明出处!