当前位置: 首页 > news >正文

Appium学习笔记

adb
  • 构成

    • client端,在电脑上,负责发送adb命令

    • daemon守护进程,在手机上,负责接收和执行adb命令

    • server端,在电脑上,负责管理client和daemon之间的通信

![[Pasted image 20250825201322.png]]

  • 包名,对应着应用程序; 界面名,对应着应用程序的某个界面

  • 如何获取包名和界面名

adb shell dumpsys window windows | findstr mFocusedApp
  • 从电脑发送文件到手机
adb push 电脑的文件路径 手机的文件夹的路径
  • 从手机拉取文件到电脑
adb pull 手机的文件路径 电脑的文件夹的路径
  • 获取app启动时间
adb shell am start -W 包名/界面名
  • 获取手机的日志
adb logcat
其他命令
  • 安装app到手机
   adb install apk路径
  • 卸载手机上的app
adb uninstall 包名
  • 查看连接设备的数量及设备号
adb devices
  • 进入到android手机系统内部的命令行中
adb shell
  • 关闭adb服务
adb kill-server
  • 开启adb服务
adb start-server
  • 查看adb帮助
adb --help
打开模拟器的设置应用
# 导入 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 常用方法总结
# 启动其他 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

driver.implicitly_wait(10)  

显式等待

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

http://www.dtcms.com/a/349575.html

相关文章:

  • 如何判断投手甲的认知比投手乙高?
  • “华生科技杯”2025年全国青少年龙舟锦标赛在海宁举行
  • 暴雨蓝色预警发布:我国多地将迎强降雨,局地伴有强对流天气 疾风气象大模型
  • 《李沐读论文》系列笔记:论文读写与研究方法【更新中】
  • 【机器学习】(11) --回归树算法
  • 【机器学习基础】朴素贝叶斯算法详解:从原理到实战
  • 机器学习-朴素贝叶斯
  • 机器学习采样方法深度详解:过采样、下采样与混合采样(附完整代码、可视化与多场景实战)
  • 机器学习:贝叶斯派
  • 【Linux | 网络】多路转接IO之poll
  • 编写Linux下usb设备驱动方法:usb设备驱动实现流程
  • AI-调查研究-60-机器人 机械臂技术发展趋势详解:工业、服务与DIY三大阵营全解析
  • rabbitmq集群
  • 基于RFM模型的客户群体大数据分析及用户聚类系统的设计与实现
  • AI+数据库:国内DBA职业发展与国产化转型实践
  • Torch入门小知识点--总结性语言
  • CSS基础学习第一天
  • The Google File System 详解
  • 【Docker基础】Docker-compose进阶配置:健康检查与服务就绪
  • 一、添加Viewport3DX,并设置相机、灯光
  • Java-包装类
  • 深度学习-----《PyTorch神经网络高效训练与测试:优化器对比、激活函数优化及实战技巧》
  • 【数据结构】栈和队列——队列
  • 向量库Qdrant vs Milvus 系统详细对比
  • 线性回归入门:从原理到实战的完整指南
  • 数据结构——线性表(链表,力扣中等篇,技巧型)
  • Postman 模拟mcp tool调用过程
  • 【数据结构】顺序表详解
  • Flink hop window(滑动窗口)详解
  • leetcode 498. 对角线遍历 中等