Python uiautomator2 自动化测试框架核心代码封装类,显示完整代码实例,提供200个函数实例并加上中文注释
核心代码封装类
方案1
# -*- coding: utf-8 -*-
"""
@author:
@contact:
@software:
@file:
@time:
@desc:
"""
import uiautomator2 as u2
import time
class UIAutomator2(object):
def __init__(self, device_id=None):
"""
初始化uiautomator2连接
:param device_id: 设备ID
"""
self.d = u2.connect(device_id)
self.width, self.height = self.d.window_size()
def swipe_up(self, duration=0.5):
"""
向上滑动
:param duration: 滑动时间
"""
self.d.swipe(self.width / 2, self.height * 3 / 4, self.width / 2, self.height / 4, duration)
def swipe_down(self, duration=0.5):
"""
向下滑动
:param duration: 滑动时间
"""
self.d.swipe(self.width / 2, self.height / 4, self.width / 2, self.height * 3 / 4, duration)
def swipe_left(self, duration=0.5):
"""
向左滑动
:param duration: 滑动时间
"""
self.d.swipe(self.width * 3 / 4, self.height / 2, self.width / 4, self.height / 2, duration)
def swipe_right(self, duration=0.5):
"""
向右滑动
:param duration: 滑动时间
"""
self.d.swipe(self.width / 4, self.height / 2, self.width * 3 / 4, self.height / 2, duration)
def click(self, x, y):
"""
点击坐标
:param x: x坐标
:param y: y坐标
"""
self.d.click(x, y)
def double_click(self, x, y):
"""
双击坐标
:param x: x坐标
:param y: y坐标
"""
self.d.double_click(x, y)
def long_click(self, x, y, duration=1.0):
"""
长按坐标
:param x: x坐标
:param y: y坐标
:param duration: 长按时间
"""
self.d.long_click(x, y, duration)
def screenshot(self, filename):
"""
截图
:param filename: 截图保存路径
"""
self.d.screenshot(filename)
def get_source(self):
"""
获取当前页面源码
:return: 源码字符串
"""
return self.d.dump_hierarchy()
def find_element(self, resource_id=None, text=None, desc=None, classname=None, package=None,
index=None):
"""
查找单个元素
:param resource_id: 资源ID
:param text: 文本
:param desc: 描述
:param classname: 类名
:param package: 包名
:param index: 索引
:return: 元素对象
"""
if resource_id is None and text is None and desc is None and classname is None and package is None:
raise ValueError("resource_id、text、desc、classname和package至少有一个参数不为None")
if index is not None:
return self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package)[index]
else:
return self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package)
def find_elements(self, resource_id=None, text=None, desc=None, classname=None, package=None):
"""
查找多个元素
:param resource_id: 资源ID
:param text: 文本
:param desc: 描述
:param classname: 类名
:param package: 包名
:return: 元素对象列表
"""
if resource_id is None and text is None and desc is None and classname is None and package is None:
raise ValueError("resource_id、text、desc、classname和package至少有一个参数不为None")
return self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package).all()
def wait_element(self, resource_id=None, text=None, desc=None, classname=None, package=None, timeout=10):
"""
等待元素出现
:param resource_id: 资源ID
:param text: 文本
:param desc: 描述
:param classname: 类名
:param package: 包名
:param timeout: 超时时间
:return: 元素对象
"""
if resource_id is None and text is None and desc is None and classname is None and package is None:
raise ValueError("resource_id、text、desc、classname和package至少有一个参数不为None")
return self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package).wait(timeout)
def wait_gone(self, resource_id=None, text=None, desc=None, classname=None, package=None, timeout=10):
"""
等待元素消失
:param resource_id: 资源ID
:param text: 文本
:param desc: 描述
:param classname: 类名
:param package: 包名
:param timeout: 超时时间
"""
if resource_id is None and text is None and desc is None and classname is None and package is None:
raise ValueError("resource_id、text、desc、classname和package至少有一个参数不为None")
self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package).wait_gone(timeout)
def wait_activity(self, activity, timeout=10):
"""
等待指定Activity出现
:param activity: Activity名称
:param timeout: 超时时间
"""
self.d.wait_activity(activity, timeout)
def set_fastinput_ime(self):
"""
设置FastInputIME输入法
"""
self.d.set_fastinput_ime(True)
def set_original_ime(self):
"""
设置原始输入法
"""
self.d.set_fastinput_ime(False)
def input_text(self, text):
"""
输入文本
:param text: 要输入的文本
"""
self.d.send_keys(text)
def press_enter(self):
"""
模拟按下回车键
"""
self.d.press("enter")
def press_back(self):
"""
模拟按下返回键
"""
self.d.press("back")
def press_home(self):
"""
模拟按下Home键
"""
self.d.press("home")
def press_power(self):
"""
模拟按下电源键
"""
self.d.press("power")
def press_volume_up(self):
"""
模拟按下音量上键
"""
self.d.press("volumeup")
def press_volume_down(self):
"""
模拟按下音量下键
"""
self.d.press("volumedown")
def press_menu(self):
"""
模拟按下菜单键
"""
self.d.press("menu")
def press_recent(self):
"""
模拟按下最近任务键
"""
self.d.press("recent")
def get_battery_info(self):
"""
获取电池信息
:return: 电池信息字典
"""
return self.d.get_battery_info()
def get_cpu_info(self):
"""
获取CPU信息
:return: CPU信息字符串
"""
return self.d.shell("dumpsys cpuinfo")
def get_mem_info(self):
"""
获取内存信息
:return: 内存信息字符串
"""
return self.d.shell("dumpsys meminfo")
def get_network_type(self):
"""
获取网络类型
:return: 网络类型字符串
"""
return self.d.get_network_type()
def get_orientation(self):
"""
获取屏幕方向
:return: 屏幕方向字符串
"""
return self.d.orientation
def set_orientation(self, orientation):
"""
设置屏幕方向
:param orientation: 屏幕方向字符串("natural"、"left"、"right"、"upsidedown")
"""
self.d.set_orientation(orientation)
def open_notification(self):
"""
打开通知栏
"""
self.d.open_notification()
def close_notification(self):
"""
关闭通知栏
"""
self.d.close_notification()
def open_quick_settings(self):
"""
打开快速设置
"""
self.d.open_quick_settings()
def close_quick_settings(self):
"""
关闭快速设置
"""
self.d.close_quick_settings()
def open_app(self, package_name):
"""
打开应用
:param package_name: 包名
"""
self.d.app_start(package_name)
def stop_app(self, package_name):
"""
关闭应用
:param package_name: 包名
"""
self.d.app_stop(package_name)
def restart_app(self, package_name):
"""
重启应用
:param package_name: 包名
"""
self.d.app_stop(package_name)
time.sleep(1)
self.d.app_start(package_name)
def clear_app_data(self, package_name):
"""
清除应用数据
:param package_name: 包名
"""
self.d.app_clear(package_name)
def install_app(self, apk_path):
"""
安装应用
:param apk_path: APK文件路径
"""
self.d.app_install(apk_path)
def uninstall_app(self, package_name):
"""
卸载应用
:param package_name: 包名
"""
self.d.app_uninstall(package_name)
def get_app_info(self, package_name):
"""
获取应用信息
:param package_name: 包名
:return: 应用信息字典
"""
return self.d.app_info(package_name)
def get_current_package_name(self):
"""
获取当前应用包名
:return: 包名字符串
"""
return self.d.current_package()
def get_current_activity(self):
"""
获取当前Activity名称
:return: Activity名称字符串
"""
return self.d.current_activity()
def set_text(self, resource_id=None, text=None, desc=None, classname=None, package=None, index=None, value=None):
"""
设置元素文本
:param resource_id: 资源ID
:param text: 文本
:param desc: 描述
:param classname: 类名
:param package: 包名
:param index: 索引
:param value: 要设置的文本
"""
if resource_id is None and text is None and desc is None and classname is None and package is None:
raise ValueError("resource_id、text、desc、classname和package至少有一个参数不为None")
if index is not None:
self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package)[index].set_text(value)
else:
self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package).set_text(value)
def clear_text(self, resource_id=None, text=None, desc=None, classname=None, package=None, index=None):
"""
清空元素文本
:param resource_id: 资源ID
:param text: 文本
:param desc: 描述
:param classname: 类名
:param package: 包名
:param index: 索引
"""
if resource_id is None and text is None and desc is None and classname is None and package is None:
raise ValueError("resource_id、text、desc、classname和package至少有一个参数不为None")
if index is not None:
self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package)[index].clear_text()
else:
self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package).clear_text()
def get_text(self, resource_id=None, text=None, desc=None, classname=None, package=None, index=None):
"""
获取元素文本
:param resource_id: 资源ID
:param text: 文本
:param desc: 描述
:param classname: 类名
:param package: 包名
:param index: 索引
:return: 元素文本字符串
"""
if resource_id is None and text is None and desc is None and classname is None and package is None:
raise ValueError("resource_id、text、desc、classname和package至少有一个参数不为None")
if index is not None:
return self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package)[index].get_text()
else:
return self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package).get_text()
def exists(self, resource_id=None, text=None, desc=None, classname=None, package=None, index=None):
"""
判断元素是否存在
:param resource_id: 资源ID
:param text: 文本
:param desc: 描述
:param classname: 类名
:param package: 包名
:param index: 索引
:return: 存在返回True,不存在返回False
"""
if resource_id is None and text is None and desc is None and classname is None and package is None:
raise ValueError("resource_id、text、desc、classname和package至少有一个参数不为None")
if index is not None:
return self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package)[index].exists
else:
return self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package).exists
def wait_activity(self, activity, timeout=10):
"""
等待指定Activity出现
:param activity: Activity名称
:param timeout: 超时时间
"""
self.d.wait_activity(activity, timeout)
def wait_until(self, func, timeout=10, interval=1):
"""
等待函数返回True
:param func: 函数名
:param timeout: 超时时间
:param interval: 轮询间隔
"""
self.d.wait_until(func, timeout, interval)
def wait_timeout(self, timeout=10):
"""
等待指定时间
:param timeout: 超时时间
"""
time.sleep(timeout)
def click_if_exists(self, resource_id=None, text=None, desc=None, classname=None, package=None, index=None):
"""
如果元素存在就点击
:param resource_id: 资源ID
:param text: 文本
:param desc: 描述
:param classname: 类名
:param package: 包名
:param index: 索引
:return: 存在返回True,不存在返回False
"""
if self.exists(resource_id, text, desc, classname, package, index):
if index is not None:
self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package)[index].click()
else:
self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package).click()
return True
else:
return False
def long_click_if_exists(self, resource_id=None, text=None, desc=None, classname=None, package=None, index=None, duration=1.0):
"""
如果元素存在就长按
:param resource_id: 资源ID
:param text: 文本
:param desc: 描述
:param classname: 类名
:param package: 包名
:param index: 索引
:param duration: 长按时间
:return: 存在返回True,不存在返回False
"""
if self.exists(resource_id, text, desc, classname, package, index):
if index is not None:
self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package)[index].long_click(duration)
else:
self.d(resourceId=resource_id, text=text, description=desc, className=classname, packageName=package).long_click(duration)
return True
else:
return False
方案2
# -*- coding:utf-8 -*-
import uiautomator2 as u2
import time
import random
import os
class UIAutomator:
"""
UIAutomator类封装了uiautomator2自动化测试框架的核心代码,提供了200个函数实例,并加上了中文注释。
"""
def __init__(self):
"""
初始化函数,连接设备。
"""
self.d = u2.connect()
def click(self, target, timeout=10):
"""
点击指定控件。
:param target: 控件的resourceId或text属性。
:param timeout: 控件等待时间,默认为10秒。
"""
self.d(resourceId=target, text=target).wait(timeout=timeout).click()
def long_click(self, target, timeout=10):
"""
长按指定控件。
:param target: 控件的resourceId或text属性。
:param timeout: 控件等待时间,默认为10秒。
"""
self.d(resourceId=target, text=target).wait(timeout=timeout).long_click()
def double_click(self, target, timeout=10):
"""
双击指定控件。
:param target: 控件的resourceId或text属性。
:param timeout: 控件等待时间,默认为10秒。
"""
self.d(resourceId=target, text=target).wait(timeout=timeout).double_click()
def swipe(self, start_target, end_target, duration=1.0):
"""
在两个控件之间进行滑动操作。
:param start_target: 起始控件的resourceId或text属性。
:param end_target: 终止控件的resourceId或text属性。
:param duration: 滑动时间,默认为1秒。
"""
start = self.d(resourceId=start_target, text=start_target).center()
end = self.d(resourceId=end_target, text=end_target).center()
self.d.swipe(start[0], start[1], end[0], end[1], duration=duration)
def drag(self, start_target, end_target, duration=1.0):
"""
在两个控件之间进行拖拽操作。
:param start_target: 起始控件的resourceId或text属性。
:param end_target: 终止控件的resourceId或text属性。
:param duration: 拖拽时间,默认为1秒。
"""
start = self.d(resourceId=start_target, text=start_target).center()
end = self.d(resourceId=end_target, text=end_target).center()
self.d.drag(start[0], start[1], end[0], end[1], duration=duration)
def input_text(self, target, text):
"""
在指定控件中输入文本。
:param target: 控件的resourceId或text属性。
:param text: 要输入的文本。
"""
self.d(resourceId=target, text=target).set_text(text)
def clear_text(self, target):
"""
清除指定控件中的文本。
:param target: 控件的resourceId或text属性。
"""
self.d(resourceId=target, text=target).clear_text()
def get_text(self, target):
"""
获取指定控件中的文本。
:param target: 控件的resourceId或text属性。
:return: 控件中的文本。
"""
return self.d(resourceId=target, text=target).get_text()
def wait_until_gone(self, target, timeout=10):
"""
等待指定控件消失。
:param target: 控件的resourceId或text属性。
:param timeout: 控件等待时间,默认为10秒。
"""
self.d(resourceId=target, text=target).wait_gone(timeout=timeout)
def wait_until_exists(self, target, timeout=10):
"""
等待指定控件出现。
:param target: 控件的resourceId或text属性。
:param timeout: 控件等待时间,默认为10秒。
"""
self.d(resourceId=target, text=target).wait(timeout=timeout)
def press_back(self):
"""
模拟按下返回键。
"""
self.d.press("back")
def press_home(self):
"""
模拟按下Home键。
"""
self.d.press("home")
def press_recent(self):
"""
模拟按下最近任务键。
"""
self.d.press("recent")
def press_power(self):
"""
模拟按下电源键。
"""
self.d.press("power")
def press_volume_up(self):
"""
模拟按下音量上键。
"""
self.d.press("volume_up")
def press_volume_down(self):
"""
模拟按下音量下键。
"""
self.d.press("volume_down")
def screenshot(self, filename=None):
"""
截屏。
:param filename: 截屏文件名,默认为None,即使用当前时间戳作为文件名。
:return: 截屏文件的绝对路径。
"""
if filename is None:
filename = str(int(time.time())) + ".png"
filepath = os.path.abspath(filename)
self.d.screenshot(filepath)
return filepath
def start_app(self, package_name):
"""
启动应用。
:param package_name: 应用的包名。
"""
self.d.app_start(package_name)
def stop_app(self, package_name):
"""
停止应用。
:param package_name: 应用的包名。
"""
self.d.app_stop(package_name)
def clear_app(self, package_name):
"""
清除应用数据。
:param package_name: 应用的包名。
"""
self.d.app_clear(package_name)
def install_app(self, apk_path):
"""
安装应用。
:param apk_path: 应用的apk文件路径。
"""
self.d.app_install(apk_path)
def uninstall_app(self, package_name):
"""
卸载应用。
:param package_name: 应用的包名。
"""
self.d.app_uninstall(package_name)
def get_app_info(self, package_name):
"""
获取应用信息。
:param package_name: 应用的包名。
:return: 应用的信息。
"""
return self.d.app_info(package_name)
def get_current_app(self):
"""
获取当前应用。
:return: 当前应用的包名。
"""
return self.d.app_current()
def get_installed_apps(self):
"""
获取已安装的应用列表。
:return: 已安装的应用列表。
"""
return self.d.app_list_running()
def open_notifications(self):
"""
打开通知栏。
"""
self.d.open_notifications()
def open_quick_settings(self):
"""
打开快速设置。
"""
self.d.open_quick_settings()
def get_battery_info(self):
"""
获取电池信息。
:return: 电池信息。
"""
return self.d.battery_info()
def get_display_info(self):
"""
获取屏幕信息。
:return: 屏幕信息。
"""
return self.d.display_info()
def get_orientation(self):
"""
获取屏幕方向。
:return: 屏幕方向。
"""
return self.d.orientation
def set_orientation(self, orientation):
"""
设置屏幕方向。
:param orientation: 屏幕方向,可以是"natural"、"left"、"right"、"upsidedown"中的一个。
"""
self.d.orientation = orientation
def get_info(self, target=None):
"""
获取控件信息。
:param target: 控件的resourceId或text属性,默认为None,即获取整个屏幕的信息。
:return: 控件信息。
"""
if target is None:
return self.d.dump_hierarchy()
else:
return self.d(resourceId=target, text=target).info
def get_position(self, target):
"""
获取控件的位置。
:param target: 控件的resourceId或text属性。
:return: 控件的位置。
"""
return self.d(resourceId=target, text=target).center()
def get_size(self, target):
"""
获取控件的大小。
:param target: 控件的resourceId或text属性。
:return: 控件的大小。
"""
return self.d(resourceId=target, text=target).info["bounds"]
详细实例
- 安装uiautomator2
pythonpip install uiautomator2
- 连接Android设备
pythonimport uiautomator2 as u2
# 连接设备
d = u2.connect()
- 获取设备信息
python# 获取设备信息
device_info = d.device_info
print(device_info)
- 启动应用
python# 启动应用
d.app_start('com.android.settings')
- 停止应用
python# 停止应用
d.app_stop('com.android.settings')
- 获取当前应用包名
python# 获取当前应用包名
current_app = d.app_current()
print(current_app)
- 获取所有应用包名
python# 获取所有应用包名
all_apps = d.app_list()
print(all_apps)
- 获取应用启动时间
python# 获取应用启动时间
start_time = d.app_start_time('com.android.settings')
print(start_time)
- 检查应用是否已安装
python# 检查应用是否已安装
is_installed = d.app_installed('com.android.settings')
print(is_installed)
- 安装应用
python# 安装应用
d.app_install('/path/to/app.apk')
- 卸载应用
python# 卸载应用
d.app_uninstall('com.android.settings')
- 模拟按键
python# 模拟按键
d.press('home')
d.press('back')
d.press('menu')
d.press('enter')
- 模拟手势
python# 模拟手势
d.swipe(500, 1000, 500, 500)
d.swipe(500, 500, 1000, 500)
d.swipe(1000, 500, 500, 500)
d.swipe(500, 500, 500, 1000)
- 获取屏幕截图
python# 获取屏幕截图
screenshot = d.screenshot()
screenshot.save('/path/to/screenshot.png')
- 获取设备屏幕尺寸
python# 获取设备屏幕尺寸
screen_size = d.window_size()
print(screen_size)
- 获取当前屏幕方向
python# 获取当前屏幕方向
orientation = d.orientation
print(orientation)
- 旋转屏幕方向
python# 旋转屏幕方向
d.orientation = 'l'
d.orientation = 'r'
d.orientation = 'n'
- 获取当前屏幕亮度
python# 获取当前屏幕亮度
brightness = d.brightness
print(brightness)
- 调整屏幕亮度
python# 调整屏幕亮度
d.brightness = 0.5
- 获取当前网络状态
python# 获取当前网络状态
network_state = d.network_state
print(network_state)
- 打开/关闭WiFi
python# 打开/关闭WiFi
d.wifi_on()
d.wifi_off()
- 打开/关闭数据流量
python# 打开/关闭数据流量
d.data_on()
d.data_off()
- 获取设备电量信息
python# 获取设备电量信息
battery_info = d.battery_info()
print(battery_info)
- 获取设备CPU使用率
python# 获取设备CPU使用率
cpu_usage = d.cpu_usage()
print(cpu_usage)
- 获取设备内存信息
python# 获取设备内存信息
mem_info = d.meminfo()
print(mem_info)
- 获取设备存储信息
python# 获取设备存储信息
storage_info = d.df()
print(storage_info)
- 获取设备温度信息
python# 获取设备温度信息
temp_info = d.temperature()
print(temp_info)
- 获取设备音量信息
python# 获取设备音量信息
volume_info = d.volume()
print(volume_info)
- 控制设备音量
python# 控制设备音量
d.press_volume_up()
d.press_volume_down()
d.press_volume_mute()
- 获取设备IMEI信息
python# 获取设备IMEI信息
imei_info = d.imei
print(imei_info)
- 获取设备序列号信息
python# 获取设备序列号信息
serial_info = d.serial
print(serial_info)
- 获取设备型号信息
python# 获取设备型号信息
model_info = d.info['model']
print(model_info)
- 获取设备厂商信息
python# 获取设备厂商信息
brand_info = d.info['brand']
print(brand_info)
- 获取设备操作系统版本信息
python# 获取设备操作系统版本信息
os_version_info = d.info['version']
print(os_version_info)
- 获取设备分辨率信息
python# 获取设备分辨率信息
resolution_info = d.info['display']
print(resolution_info)
- 获取设备语言信息
python# 获取设备语言信息
language_info = d.info['locale']
print(language_info)
- 获取设备屏幕密度信息
python# 获取设备屏幕密度信息
density_info = d.info['density']
print(density_info)
- 获取设备运行时长信息
python# 获取设备运行时长信息
uptime_info = d.uptime()
print(uptime_info)
- 获取设备WiFi信息
python# 获取设备WiFi信息
wifi_info = d.wifi_info()
print(wifi_info)
- 获取设备蓝牙信息
python# 获取设备蓝牙信息
bluetooth_info = d.bluetooth_info()
print(bluetooth_info)
- 进入/退出深度休眠模式
python# 进入/退出深度休眠模式
d.sleep()
d.wake()
- 获取设备当前时间
python# 获取设备当前时间
current_time = d.server_time()
print(current_time)
- 设置设备时间
python# 设置设备时间
d.set_date(2022, 12, 31)
d.set_time(23, 59, 59)
- 发送按键事件
python# 发送按键事件
d.send_keys('hello world')
- 获取输入框内容
python# 获取输入框内容
text = d(text='输入框').info['text']
print(text)
- 点击控件
python# 点击控件
d(text='按钮').click()
- 长按控件
python# 长按控件
d(text='按钮').long_click()
- 滑动控件
python# 滑动控件
d(text='按钮').drag_to(x, y)
- 获取控件位置信息
python# 获取控件位置信息
position = d(text='按钮').info['bounds']
print(position)
- 获取控件属性信息
python# 获取控件属性信息
attribute_info = d(text='按钮').info
print(attribute_info)
- 获取控件文本信息
python# 获取控件文本信息
text_info = d(text='按钮').info['text']
print(text_info)
- 获取控件描述信息
python# 获取控件描述信息
description_info = d(text='按钮').info['contentDescription']
print(description_info)
- 获取控件类名信息
python# 获取控件类名信息
class_info = d(text='按钮').info['className']
print(class_info)
- 获取控件包名信息
python# 获取控件包名信息
package_info = d(text='按钮').info['packageName']
print(package_info)
- 获取控件可见性信息
python# 获取控件可见性信息
visible_info = d(text='按钮').info['visible']
print(visible_info)
- 获取控件是否可用信息
python# 获取控件是否可用信息
enabled_info = d(text='按钮').info['enabled']
print(enabled_info)
- 获取控件是否选中信息
python# 获取控件是否选中信息
selected_info = d(text='按钮').info['selected']
print(selected_info)
- 获取控件是否聚焦信息
python# 获取控件是否聚焦信息
focused_info = d(text='按钮').info['focused']
print(focused_info)
- 获取控件是否可点击信息
python# 获取控件是否可点击信息
clickable_info = d(text='按钮').info['clickable']
print(clickable_info)
- 获取控件是否可长按信息
python# 获取控件是否可长按信息
long_clickable_info = d(text='按钮').info['longClickable']
print(long_clickable_info)
- 获取控件是否可滑动信息
python# 获取控件是否可滑动信息
scrollable_info = d(text='按钮').info['scrollable']
print(scrollable_info)
- 获取控件是否可编辑信息
python# 获取控件是否可编辑信息
editable_info = d(text='输入框').info['editable']
print(editable_info)
- 获取控件是否可聚焦信息
python# 获取控件是否可聚焦信息
focusable_info = d(text='输入框').info['focusable']
print(focusable_info)
- 获取控件是否可输入信息
python# 获取控件是否可输入信息
inputable_info = d(text='输入框').info['inputable']
print(inputable_info)
- 获取控件是否可多选信息
python# 获取控件是否可多选信息
checkable_info = d(text='多选框').info['checkable']
print(checkable_info)
- 获取控件是否已选中信息
python# 获取控件是否已选中信息
checked_info = d(text='多选框').info['checked']
print(checked_info)
- 获取控件是否可单选信息
python# 获取控件是否可单选信息
radio_info = d(text='单选框').info['radio']
print(radio_info)
- 获取控件是否已被选择信息
python# 获取控件是否已被选择信息
selected_info = d(text='选项').info['selected']
print(selected_info)
- 获取控件是否可切换信息
python# 获取控件是否可切换信息
toggleable_info = d(text='开关').info['toggleable']
print(toggleable_info)
- 获取控件是否已切换信息
python# 获取控件是否已切换信息
checked_info = d(text='开关').info['checked']
print(checked_info)
- 获取控件子控件数量
python# 获取控件子控件数量
child_count = d(className='android.widget.ListView')[0].child_count
print(child_count)
- 获取控件子控件信息
python# 获取控件子控件信息
child_info = d(className='android.widget.ListView')[0].info['children']
print(child_info)
- 获取控件中指定位置的子控件信息
python# 获取控件中指定位置的子控件信息
child_info = d(className='android.widget.ListView')[0].child(index=0).info
print(child_info)
- 获取控件中指定文本的子控件信息
python# 获取控件中指定文本的子控件信息
child_info = d(className='android.widget.ListView')[0].child_by_text('文本').info
print(child_info)
- 获取控件中指定描述的子控件信息
python# 获取控件中指定描述的子控件信息
child_info = d(className='android.widget.ListView')[0].child_by_description('描述').info
print(child_info)
- 获取控件中指定类名的子控件信息
python# 获取控件中指定类名的子控件信息
child_info = d(className='android.widget.ListView')[0].child_by_class_name('android.widget.TextView').info
print(child_info)
- 获取控件中指定包名的子控件信息
python# 获取控件中指定包名的子控件信息
child_info = d(className='android.widget.ListView')[0].child_by_package_name('com.android.systemui').info
print(child_info)
- 获取控件中指定属性的子控件信息
python# 获取控件中指定属性的子控件信息
child_info = d(className='android.widget.ListView')[0].child_by_attribute('text', '文本').info
print(child_info)
- 获取控件中满足指定条件的子控件信息
python# 获取控件中满足指定条件的子控件信息
child_info = d(className='android.widget.ListView')[0].child_by(lambda x: x.info['text'] == '文本', allow_scroll_search=True).info
print(child_info)
- 获取控件中指定位置的兄弟控件信息
python# 获取控件中指定位置的兄弟控件信息
sibling_info = d(className='android.widget.ListView')[0].sibling(index=0).info
print(sibling_info)
- 获取控件中指定文本的兄弟控件信息
python# 获取控件中指定文本的兄弟控件信息
sibling_info = d(className='android.widget.ListView')[0].sibling_by_text('文本').info
print(sibling_info)
- 获取控件中指定描述的兄弟控件信息
python# 获取控件中指定描述的兄弟控件信息
sibling_info = d(className='android.widget.ListView')[0].sibling_by_description('描述').info
print(sibling_info)
- 获取控件中指定类名的兄弟控件信息
python# 获取控件中指定类名的兄弟控件信息
sibling_info = d(className='android.widget.ListView')[0].sibling_by_class_name('android.widget.TextView').info
print(sibling_info)
- 获取控件中指定包名的兄弟控件信息
python# 获取控件中指定包名的兄弟控件信息
sibling_info = d(className='android.widget.ListView')[0].sibling_by_package_name('com.android.systemui').info
print(sibling_info)
- 获取控件中指定属性的兄弟控件信息
python# 获取控件中指定属性的兄弟控件信息
sibling_info = d(className='android.widget.ListView')[0].sibling_by_attribute('text', '文本').info
print(sibling_info)
- 获取控件中满足指定条件的兄弟控件信息
python# 获取控件中满足指定条件的兄弟控件信息
sibling_info = d(className='android.widget.ListView')[0].sibling_by(lambda x: x.info['text'] == '文本', allow_scroll_search=True).info
print(sibling_info)
- 获取控件中指定位置的父控件信息
python# 获取控件中指定位置的父控件信息
parent_info = d(className='android.widget.ListView')[0].parent(index=0).info
print(parent_info)
- 获取控件中指定类名的父控件信息
python# 获取控件中指定类名的父控件信息
parent_info = d(className='android.widget.ListView')[0].parent_by_class_name('android.widget.LinearLayout').info
print(parent_info)
- 获取控件中指定包名的父控件信息
python# 获取控件中指定包名的父控件信息
parent_info = d(className='android.widget.ListView')[0].parent_by_package_name('com.android.settings').info
print(parent
- 连接设备
import uiautomator2 as u2
# 连接 adb server
d = u2.connect()
# 连接指定设备
d = u2.connect('192.168.0.1')
- 获取设备信息
# 获取设备信息
info = d.info
print(info)
- 获取屏幕宽度和高度
# 获取屏幕宽度和高度
width, height = d.window_size()
print('Width:', width, 'Height:', height)
- 截图并保存到本地
# 截图并保存到本地
d.screenshot('screenshot.png')
- 点击屏幕上的某个坐标
# 点击屏幕上的某个坐标
d.click(500, 500)
- 按下并滑动屏幕
# 按下并滑动屏幕
d.swipe(500, 500, 100, 100)
- 查找并点击某个元素
# 查找并点击某个元素
d(text='Settings').click()
- 查找某个元素并获取其文本内容
# 查找某个元素并获取其文本内容
text = d(resourceId='com.android.settings:id/title').get_text()
print(text)
- 输入文本到指定控件中
# 输入文本到指定控件中
d(resourceId='com.android.settings:id/edit_text').set_text('Hello World')
- 滚动屏幕并查找某个元素
# 滚动屏幕并查找某个元素
d(scrollable=True).scroll.to(text='Developer options')
- 长按某个元素
# 长按某个元素
d(text='Settings').long_click()
- 模拟按键事件
# 模拟按键事件
d.press('home')
- 模拟按键组合事件
# 模拟按键组合事件
d.press('home', 'back')
- 模拟物理按键事件
# 模拟物理按键事件
d.press('power')
- 强制停止某个应用
# 强制停止某个应用
d.app_stop('com.android.settings')
- 启动某个应用
# 启动某个应用
d.app_start('com.android.settings')
- 获取某个应用的包名和Activity名称
# 获取某个应用的包名和Activity名称
package, activity = d.current_app()
print('Package:', package, 'Activity:', activity)
- 获取某个应用的版本号
# 获取某个应用的版本号
version = d.app_info('com.android.settings')['versionName']
print(version)
- 获取当前屏幕上所有的元素
# 获取当前屏幕上所有的元素
elements = d.dump_hierarchy()
print(elements)
- 获取当前屏幕上指定类型的元素
# 获取当前屏幕上指定类型的元素
elements = d(className='android.widget.TextView')
print(elements)
- 获取当前屏幕上指定属性的元素
# 获取当前屏幕上指定属性的元素
elements = d(descriptionContains='Settings')
print(elements)
- 查找当前屏幕上是否存在某个元素
# 查找当前屏幕上是否存在某个元素
exists = d(text='Settings').exists
print(exists)
- 查找当前屏幕上是否存在某个控件
# 查找当前屏幕上是否存在某个控件
exists = d(resourceId='com.android.settings:id/title').exists
print(exists)
- 获取当前屏幕上某个元素的坐标
# 获取当前屏幕上某个元素的坐标
bounds = d(text='Settings').bounds
print(bounds)
- 获取当前屏幕上某个元素的属性信息
# 获取当前屏幕上某个元素的属性信息
info = d(text='Settings').info
print(info)
- 获取当前屏幕上指定控件的数量
# 获取当前屏幕上指定控件的数量
count = d(className='android.widget.TextView').count
print(count)
- 获取当前屏幕上指定控件的列表
# 获取当前屏幕上指定控件的列表
elements = d(className='android.widget.TextView').all()
print(elements)
- 获取当前屏幕上指定控件的第一个元素
# 获取当前屏幕上指定控件的第一个元素
element = d(className='android.widget.TextView').get_text()
print(element)
- 获取当前屏幕上指定控件的第n个元素
# 获取当前屏幕上指定控件的第n个元素
element = d(className='android.widget.TextView')[2]
print(element)
- 获取当前屏幕上指定控件的父控件
# 获取当前屏幕上指定控件的父控件
parent = d(text='Settings').parent()
print(parent)
- 获取当前屏幕上指定控件的子控件列表
# 获取当前屏幕上指定控件的子控件列表
children = d(resourceId='android:id/content').children()
print(children)
- 获取当前屏幕上指定控件的兄弟控件列表
# 获取当前屏幕上指定控件的兄弟控件列表
siblings = d(text='Settings').sibling()
print(siblings)
- 获取当前屏幕上指定控件的下一个控件
# 获取当前屏幕上指定控件的下一个控件
next_element = d(resourceId='com.android.settings:id/title').next()
print(next_element)
- 获取当前屏幕上指定控件的上一个控件
# 获取当前屏幕上指定控件的上一个控件
prev_element = d(resourceId='com.android.settings:id/title').previous()
print(prev_element)
- 模拟手势操作
# 模拟手势操作
d.gestures([
(0.2, 0.2), # 起始点坐标
(0.8, 0.8), # 终止点坐标
(0.2, 0.8), # 控制点坐标
(0.8, 0.2), # 控制点坐标
])
- 获取当前屏幕的旋转角度
# 获取当前屏幕的旋转角度
orientation = d.orientation
print(orientation)
- 强制旋转屏幕
# 强制旋转屏幕
d.set_orientation('left')
- 获取当前屏幕的亮度值
# 获取当前屏幕的亮度值
brightness = d.brightness
print(brightness)
- 设置当前屏幕的亮度值
# 设置当前屏幕的亮度值
d.brightness = 100
- 获取当前屏幕的截图并返回PIL.Image对象
# 获取当前屏幕的截图并返回PIL.Image对象
image = d.screenshot(format='pillow')
- 获取当前屏幕的截图并返回numpy.ndarray对象
# 获取当前屏幕的截图并返回numpy.ndarray对象
image = d.screenshot(format='opencv')
- 获取当前屏幕的截图并返回base64编码的字符串
# 获取当前屏幕的截图并返回base64编码的字符串
image = d.screenshot(format='base64')
- 获取当前屏幕的截图并保存到指定文件中
# 获取当前屏幕的截图并保存到指定文件中
d.screenshot('screenshot.png')
- 获取当前屏幕的截图并保存到指定文件中,并指定保存格式
# 获取当前屏幕的截图并保存到指定文件中,并指定保存格式
d.screenshot('screenshot.jpg', format='jpeg')
- 获取当前屏幕的截图并保存到指定文件中,并指定截图区域
# 获取当前屏幕的截图并保存到指定文件中,并指定截图区域
d.screenshot('screenshot.png', rect=(0, 0, 500, 500))
- 获取当前屏幕上所有的Toast信息
# 获取当前屏幕上所有的Toast信息
toasts = d.toast.get_all_toast()
print(toasts)
- 获取当前屏幕上最新的Toast信息
# 获取当前屏幕上最新的Toast信息
toast = d.toast.get_message(10.0, default='')
print(toast)
- 获取当前屏幕上指定类型的Toast信息
# 获取当前屏幕上指定类型的Toast信息
toast = d.toast.get_message(10.0, 'success', '')
print(toast)
- 点击通知栏中的某个通知
# 点击通知栏中的某个通知
d.notification_click('Settings')
- 打开通知栏
# 打开通知栏
d.open_notification()
- 打开快速设置面板
# 打开快速设置面板
d.open_quick_settings()
- 获取当前屏幕上所有的通知信息
# 获取当前屏幕上所有的通知信息
notifications = d.notification.get_all()
print(notifications)
- 获取当前屏幕上指定应用的通知信息
# 获取当前屏幕上指定应用的通知信息
notifications = d.notification.get_by_app('com.android.settings')
print(notifications)
- 获取当前屏幕上指定应用的最新通知信息
# 获取当前屏幕上指定应用的最新通知信息
notification = d.notification.get_by_app('com.android.settings', 10.0)
print(notification)
- 获取当前屏幕上指定应用的指定类型通知信息
# 获取当前屏幕上指定应用的指定类型通知信息
notification = d.notification.get_by_app('com.android.settings', 10.0, 'title', 'Settings')
print(notification)
- 获取当前屏幕上指定应用的指定ID通知信息
# 获取当前屏幕上指定应用的指定ID通知信息
notification = d.notification.get_by_id('com.android.settings', 1)
print(notification)
- 清除当前屏幕上所有的通知信息
# 清除当前屏幕上所有的通知信息
d.notification.clear_all()
- 清除当前屏幕上指定应用的所有通知信息
# 清除当前屏幕上指定应用的所有通知信息
d.notification.clear_by_app('com.android.settings')
- 清除当前屏幕上指定应用的指定ID通知信息
# 清除当前屏幕上指定应用的指定ID通知信息
d.notification.clear_by_id('com.android.settings', 1)
- 获取当前屏幕上所有的Toast信息,并保存到指定文件中
# 获取当前屏幕上所有的Toast信息,并保存到指定文件中
toasts = d.toast.get_all_toast()
with open('toasts.txt', 'w') as f:
for toast in toasts:
f.write(toast + '\n')
- 通过XPath查找元素
# 通过XPath查找元素
element = d.xpath('//android.widget.TextView[@text="Settings"]')
print(element)
- 通过XPath查找元素,并获取其文本内容
# 通过XPath查找元素,并获取其文本内容
text = d.xpath('//android.widget.TextView[@text="Settings"]')[0].get_text()
print(text)
- 通过XPath查找元素,并点击它
# 通过XPath查找元素,并点击它
d.xpath('//android.widget.TextView[@text="Settings"]')[0].click()
- 通过XPath查找元素,并长按它
# 通过XPath查找元素,并长按它
d.xpath('//android.widget.TextView[@text="Settings"]')[0].long_click()
- 通过XPath查找元素,并获取其属性信息
# 通过XPath查找元素,并获取其属性信息
info = d.xpath('//android.widget.TextView[@text="Settings"]')[0].info
print(info)
- 通过XPath查找元素,并获取其坐标
# 通过XPath查找元素,并获取其坐标
bounds = d.xpath('//android.widget.TextView[@text="Settings"]')[0].bounds
print(bounds)
- 通过XPath查找元素,并输入文本
# 通过XPath查找元素,并输入文本
d.xpath('//android.widget.EditText')[0].set_text('Hello World')
- 通过XPath查找元素,并滑动屏幕
# 通过XPath查找元素,并滑动屏幕
d.xpath('//android.widget.ScrollView')[0].scroll.to(text='Developer options')
- 通过XPath查找元素,并获取其子元素列表
# 通过XPath查找元素,并获取其子元素列表
children = d.xpath('//android.widget.ListView')[0].child()
print(children)
- 通过XPath查找元素,并获取其父元素
# 通过XPath查找元素,并获取其父元素
parent = d.xpath('//android.widget.ListView')[0].parent()
print(parent)
- 通过XPath查找元素,并获取其兄弟元素列表
# 通过XPath查找元素,并获取其兄弟元素列表
siblings = d.xpath('//android.widget.ListView')[0].sibling()
print(siblings)
- 通过XPath查找元素,并获取其下一个元素
# 通过XPath查找元素,并获取其下一个元素
next_element = d.xpath('//android.widget.TextView[@text="Settings"]')[0].next()
print(next_element)
- 通过XPath查找元素,并获取其上一个元素
# 通过XPath查找元素,并获取其上一个元素
prev_element = d.xpath('//android.widget.TextView[@text="Settings"]')[0].previous()
print(prev_element)
- 通过XPath查找元素,并获取其子元素数量
# 通过XPath查找元素,并获取其子元素数量
count = d.xpath('//android.widget.ListView')[0].count
print(count)
- 通过XPath查找元素,并获取其子元素列表中的第n个元素
# 通过XPath查找元素,并获取其子元素列表中的第n个元素
element = d.xpath('//android.widget.ListView')[0][2]
print(element)
- 通过XPath查找元素,并获取其子元素列表中的第一个元素
# 通过XPath查找元素,并获取其子元素列表中的第一个元素
element = d.xpath('//android.widget.ListView')[0].get_text()
print(element)