adb
-
构成
-
client端,在电脑上,负责发送adb命令
-
daemon守护进程,在手机上,负责接收和执行adb命令
-
server端,在电脑上,负责管理client和daemon之间的通信
-
![[Pasted image 20250825201322.png]]
-
包名,对应着应用程序; 界面名,对应着应用程序的某个界面
-
如何获取包名和界面名
bash
adb shell dumpsys window windows | findstr mFocusedApp
- 从电脑发送文件到手机
bash
adb push 电脑的文件路径 手机的文件夹的路径
- 从手机拉取文件到电脑
bash
adb pull 手机的文件路径 电脑的文件夹的路径
- 获取app启动时间
bash
adb shell am start -W 包名/界面名
- 获取手机的日志
bash
adb logcat
其他命令
- 安装app到手机
bash
adb install apk路径
- 卸载手机上的app
bash
adb uninstall 包名
- 查看连接设备的数量及设备号
bash
adb devices
- 进入到android手机系统内部的命令行中
bash
adb shell
- 关闭adb服务
bash
adb kill-server
- 开启adb服务
bash
adb start-server
- 查看adb帮助
bash
adb --help
打开模拟器的设置应用
python
# 导入 Appium 的 webdriver 模块,用于控制移动设备或模拟器
import time
from appium import webdriver
# 创建一个字典,存放期望能力(Desired Capabilities)
desired_caps = dict()
# 指定平台为 Androiddesired_caps['platformName'] = 'Android'
# 指定 Android 系统版本(要和设备实际版本匹配)
desired_caps['platformVersion'] = '10'
# 指定设备名称或设备 ID(可以通过 adb devices 查看)
desired_caps['deviceName'] = '192.168.189.102:5555'
# 指定要启动的应用包名(唯一标识应用)
desired_caps['appPackage'] = 'com.android.settings'
# 指定要启动的 Activity(启动应用后的界面)
desired_caps['appActivity'] = '.Settings'
# 连接 Appium Server 并创建 WebDriver 对象
# Appium Server 会根据 desired_caps 启动指定设备上的应用
driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
time.sleep(5)
# 测试结束后关闭 WebDriver 会话,释放资源
driver.quit()
操作 Android 常用方法总结
python
# 启动其他 App
# 参数:
# appPackage:要打开的应用的包名
# appActivity:要打开的界面名(Activity)
driver.start_activity(appPackage, appActivity)
# 获取当前操作的 App 包名
current_pkg = driver.current_package
# 获取当前操作的 App 界面名(Activity)
current_act = driver.current_activity
# 关闭当前操作的 App(仅关闭应用,不关闭驱动对象)
driver.close_app()
# 关闭驱动对象,同时关闭所有关联的 App
driver.quit()
# 小结:
# close_app() → 只关闭应用,驱动对象仍在
# quit() → 关闭驱动对象,同时关闭所有 App
# ================================
# 安装/卸载应用
# ================================
# 安装 App
# 参数:
# app_path:apk 文件的路径
driver.install_app(app_path)
# 卸载 App
# 参数:
# app_id:应用程序包名
driver.remove_app(app_id)
# 判断 App 是否已安装
# 参数:
# app_id:应用程序包名
# 返回值:
# 布尔类型,True 表示已安装,False 表示未安装
is_installed = driver.is_app_installed(app_id)
定位元素的注意点
如果 find_element_by_xxx
方法,传入了一个没有的条件,会报错,NoSuchElementException
如果 find_elements_by_xxx
方法,传入了一个没有的条件,不会报错,返回一个空列表
元素等待
隐式等待:
全局生效,对所有元素定位代码都有效
若超时未找到,抛出 NoSuchElementException
python
driver.implicitly_wait(10)
显式等待
python
WebDriverWait(driver, 10).until(
EC.visibility_of_element_located(
(AppiumBy.ID, "com.android.settings:id/title") # 定位方式+定位值(元组格式)
)
).click() # 找到元素后直接点击
隐式等待和显式等待的选择
-
从使用的角度上:
-
隐式等待更简单
-
显式等待相对负责
-
-
从灵活性的角度上:
-
显示等待更加灵活,因为可以针对每一个元素进行单独的设置
-
隐式等待是针对全局的定位元素
-
元素操作API
获取元素的位置:
-
关键属性
-
location
-
是一个字典,字典中有 x 和 y 两个 key
-
取到的数据类型是 int 的
-
获取元素的大小:
-
关键属性
-
size
-
是一个字典,字典中有 width 和 height 两个 key
-
取到的数据类型是 int 的
-
如何根据元素的属性名获取属性值:
-
关键的方法
- get_attribute("属性名")
-
注意点
-
想要获取 resource-id 使用 resourceId 属性名 API>=18
-
想要获取 class 使用 className 属性名 API>=18
-
想要获取 content-desc 使用 name 属性名
-
其他的,都可以参考 uiautomator viewer 中的 属性名
-