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

相关推荐
ts码农20 分钟前
blazor 学习笔记--vscode debug
笔记·vscode·学习
_无_妄_36 分钟前
Android 使用 WebView 直接加载 PDF 文件,通过 JS 实现
android
VomPom40 分钟前
手写一个精简版Koin:深入理解依赖注入核心原理
android
陈随易41 分钟前
10年老前端,分享20+严选技术栈
前端·后端·程序员
牛奶yu茶41 分钟前
Python学习笔记之(二)变量和简单的数据类型
笔记·python·学习
汪子熙1 小时前
计算机世界里的 blob:从数据库 BLOB 到 Git、Web API 与云存储的二进制宇宙
后端
IT乐手1 小时前
Java 编写查看调用栈信息
android
十八旬1 小时前
苍穹外卖项目实战(日记十)-记录实战教程及问题的解决方法-(day3-2)新增菜品功能完整版
java·开发语言·spring boot·mysql·idea·苍穹外卖
鞋尖的灰尘1 小时前
springboot-事务
java·后端
元元的飞1 小时前
6、Spring AI Alibaba MCP结合Nacos自动注册与发现
后端·ai编程