Appium学习笔记

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 中的 属性名

相关推荐
Mr_Macallon1 小时前
C++回顾(基础)(01)
c语言·开发语言·c++·学习
ITHAOGE151 小时前
下载 | Win11 26H2 正式版发布!(ISO映像、2026年度版本、26300.9457、Windows 11)
windows·科技·微软·电脑
五彩小白2 小时前
自回归和上下文
android
打工仔折腾 AI2 小时前
LLaMA 1 到 LLaMA 3 架构演进拆解:从 RoPE、GQA 到词表扩张
人工智能·后端·python·深度学习·langchain·llama
可乐鸡翅yeah_2 小时前
HLS 分片过期清理,直播旧 TS 分片磁盘爆满问题处理
java·后端·spring·m3u8·m3u8在线·音视频在线播放
sunoo-2292 小时前
【ARM嵌入式学习笔记第十天】i.MX6ULL eLCDIF控制器驱动RGB LCD全解析(硬件原理+寄存器配置+裸机代码)
arm开发·笔记·学习
张彦峰ZYF2 小时前
加了锁不等于扛得住争用:synchronized、显式锁与 CAS 的语义分层、争用代价账本与选型判据
后端·同步设施·内置锁的四种状态与单向升级·可重入的由来与四条硬边界·显式锁的状态字段与等待队列·读写锁与邮戳锁·一次同步的开销账本
YCOSA20252 小时前
雨晨 Windows 11 IoT 企业版 Edge 轻装 VCDX 29680.1000
windows·物联网
专业程序开发源2 小时前
SSM校园拍摄交流服务平台36936-计算机课程设计、毕业设计
java·spring boot·后端·python·elasticsearch·php·课程设计
Gopher_HBo2 小时前
zap采样器与性能优化内幕
后端