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

uiautomator2 编写测试流程-登陆后的酷狗01

如果卡在connect()
kill掉python进程
拔掉USB且关闭开发者,再接上USB,再重新打开开发者
adb devices
adb shell
/data/local/tmp/atx-agent server -d
启动一下atx
然后重新运行脚本就不会卡connect()了

# 一.UIAutomator2安装和基本API'''判断是原生app还是混合app1.直接问开发2.开发者选项->绘图(显示布局边界勾起来)如果app里面每个界面的每个控件都是独立的小小的框框就是原生只要有一个大框里面有很多控件就是混合H5的#获取当前界面信息python -m uiautomator2 current因为xpath有一些问题,容易卡住,因此换为Id或者text desc定位使用device(resourceId='',text='')单个或者组合定位元素'''# 默认收藏元素界面
# app.splash.SplashActivity bbf5382# 播放列表界面
# app.splash.SplashActivity# 1.导入uiautomator2库
# 因为导入的外部的库,没有的话要pip install uiautomator2安装一下
import uiautomator2 as u2
import timedef test_play_music():# 2.连接android设备# connect需要使用到adb,如果没有adb环境的话要下载,并配置环境变量# device = u2.connect('192.168.50.66')print('---')try:# 默认用usb连接device = u2.connect()# device = u2.connect('192.168.1.7:40443', timeout=30)  # 默认10秒延长至30秒print(device.info)current = device.app_current()print(current['package'])  # 输出当前包名print(current['activity']) # 输出当前Activity# # d.wait_timeout = 5device.implicitly_wait(10)print(0)device.screenshot("screen0.png")  # 保存为当前目录下的screen.png# 清空app数据,包括登录数据,变为未登录状态# device.app_clear('com.kugou.android')# # 酷狗# device.xpath('//*[@text="酷狗音乐"]').click()device.app_start('com.kugou.android',wait=True)print(1)time.sleep(5)# device.screenshot("screen1.png")  # 保存为当前目录下的screen.png# 我的# mine = device.xpath('//*[@content-desc="我的"]')device(resourceId='com.kugou.android:id/bg3',text='我的').click()print(1.5)print('点击我的')time.sleep(2)# device.screenshot("screen2.png")  # 保存为当前目录下的screen.png# time.sleep(10)# 默认收藏# 计算中点并点击x_center = (228 + 948) // 2y_center = (1710 + 1908) // 2print(x_center,y_center)# print(x_center,y_center)device.click(x_center, y_center)time.sleep(2)print('点击默认收藏')print(3)print('这里很奇怪,先睡3s解决')time.sleep(3)# 这里直接到播放的界面,温泉是文字,无法clickprint(99)device(resourceId='com.kugou.android:id/f6m1',text='温泉').click()time.sleep(2)print(4)# 未播放时点击播放if device(resourceId='com.kugou.android:id/db51',description='暂停').exists():print(4.5)device(resourceId='com.kugou.android:id/db51',description='暂停').click()print('点击暂停')print(4.6)else:print('点击播放,睡5s')device(resourceId='com.kugou.android:id/db51',description='播放').click()time.sleep(5)print(4.9)# device.xpath('//*[@content-desc="暂停"]').click()print('点击暂停')print(5)time.sleep(2)# 未播放时点击播放if device(resourceId='com.kugou.android:id/db51',description='暂停').exists():print(5.5)device(resourceId='com.kugou.android:id/db51',description='暂停').click()print('点击暂停')print(5.6)else:print('点击播放,睡5s')device(resourceId='com.kugou.android:id/db51',description='播放').click()time.sleep(5)print(5.9)print(6)time.sleep(2)except Exception as e:print('异常:')print(e)print()finally:import subprocesssubprocess.run(["adb", "shell", "am", "force-stop", "com.github.uiautomator"])  # 强制停止服务进程:ml-citation{ref="1" data="citationList"}device.app_stop('com.kugou.android')time.sleep(1)  # 等待服务停止print("连接已关闭")for i in range(1,101):print(f'第{i}次,播放:')test_play_music()# com.kugou.android
# app.splash.SplashActivity# 3.通过点击打开被测软件‘探探’
# 如果没有的话,先安装一个探探app
# device(text='QQ').click()# # 3.2通过包名直接打开app
# device.app_start('com.xxx')# # 4.通过包名直接关闭app
# device.app_stop('com.xxx')# # 5.通过包名清除app数据
# device.app_clear('com.xxx')# # 6.获取当前app包名
# app_current = device.app_current()# # 7.删除app通过包名
# devcies.app_uninstall(app_current)# # 获取活动名和包名的adb指令
# adb1 = 'adb shell dumpsys activity | find "mFocusedActivity" '
# adb1 = 'adb shell dumpsys activity top | findstr ACTIVITY'# # 手上有apk,直接判断apk的包名是什么。 
# # aapt dump badging file.apk# # 8.连接上打印一下信息
# device.info# device.device_info# # 9.截屏
# device.screenshot(r'd:\test.png')# # 10.推送文件
# devcie.push(r'd:\test.png','/data/')# #11.拉取文件 (后面一定要带上名称)
# device.pull('/data/test.png',r'd:\test.png')# # 12.按键,用的时候去查找就行了,记得几个,上下左右,home,back,OK就可以了# # 二。元素定位工具 WEditor# # 最后一行有直接可以使用的代码直接拷贝 类似 d(resourceId="")# # 13.可以通过组合的方式,也可以通过实际上是唯一的方式找到控件
# device(resourceId='com.lemon.xxx',text='我的柠檬')# # 14.输入操作
# mobile_elem = device(resourceId='')
# mobile_elem.send_keys('1643')# d(text='登录').click()# time.sleep(3)# # 清空数据
# mobile_elem.clear_text()# mobile_elem.send_keys('18246346124')# # 15.等待方式# time.sleep(5)# # 这两种方式效果一样,一种通过属性修改,另一种直接是函数的方式
# d.wait_timeout = 5
# d.implicitly_wait(5)# # 默认20s
# d.app_start('com.aaa.xxx', wait =True)# # 16.等待元素出现,消失,是否存在
# d(text='demo').wait()# d().wait_gone()
# d().exist()# # 然后再click 或者 clear_text()# # 如果比全局还要长
# # 50s内点击成功就可以
# d().click(timeout=50)# d().set_text(timeout=50)
# d().clear_text(timeout=50)

完全xpath,好像有bug

# 一.UIAutomator2安装和基本API'''判断是原生app还是混合app1.直接问开发2.开发者选项->绘图(显示布局边界勾起来)如果app里面每个界面的每个控件都是独立的小小的框框就是原生只要有一个大框里面有很多控件就是混合H5的python -m uiautomator2 current'''# 默认收藏元素界面
# app.splash.SplashActivity bbf5382# 播放列表界面
# app.splash.SplashActivity# 1.导入uiautomator2库
# 因为导入的外部的库,没有的话要pip install uiautomator2安装一下
import uiautomator2 as u2
import timedef test_play_music():# 2.连接android设备# connect需要使用到adb,如果没有adb环境的话要下载,并配置环境变量# device = u2.connect('192.168.50.66')print('---')try:device = u2.connect()print(device.info)current = device.app_current()print(current['package'])  # 输出当前包名print(current['activity']) # 输出当前Activity# # d.wait_timeout = 5device.implicitly_wait(10)print(0)device.screenshot("screen0.png")  # 保存为当前目录下的screen.png# 清空app数据,包括登录数据,变为未登录状态# device.app_clear('com.kugou.android')# # 酷狗# device.xpath('//*[@text="酷狗音乐"]').click()device.app_start('com.kugou.android',wait=True)print(1)time.sleep(5)# device.screenshot("screen1.png")  # 保存为当前目录下的screen.png# 我的# mine = device.xpath('//*[@content-desc="我的"]')mine = device.xpath('//*[contains(@text,"我的")]')print(1.5)mine.click()print('点击我的')time.sleep(2)# device.screenshot("screen2.png")  # 保存为当前目录下的screen.png# time.sleep(10)# 默认收藏collect = device.xpath('(//android.widget.LinearLayout)[63]')# if collect.wait(timeout=10.0):collect.click()print('点击默认收藏')time.sleep(2)# device.screenshot("screen2.png")  # 保存为当前目录下的screen.pngprint(3)print('这里很奇怪,先睡3s解决')time.sleep(3)# 这里直接到播放的界面,温泉是文字,无法clickprint(99)two_p = device.xpath('//android.widget.TextView[@text="许嵩、刘美麟"]')print(99)# 播放音乐if two_p.exists:print(4.5)two_p.click()print('点击播放')print(5)else:# device.screenshot("error.png")  # 保存为当前目录下的screen.pngraise Exception('no 点击播放歌曲')time.sleep(3)# device.screenshot("screen10.png")  # 保存为当前目录下的screen.pngprint(4)# 未播放时点击播放if device.xpath('//*[contains(@text,"播放")]').exists:print(4.5)device.xpath('//*[contains(@text,"播放")]').click()print('点击播放')print(5)else:print('睡5s 然后点击暂停')time.sleep(5)device.xpath('//*[@content-desc="暂停"]').click()print('点击暂停')time.sleep(3)# 未播放时点击播放if device.xpath('//*[@resource-id="com.kugou.android:id/db51"]').exists and device.xpath('//*[@content-desc="播放"]').exists:print(5.1)device.xpath('//*[@content-desc="播放"]').click()print('点击播放')print(5.1)elif device.xpath('//*[@resource-id="com.kugou.android:id/db51"]').exists and device.xpath('//*[@content-desc="暂停"]').exists:print('睡5s 然后点击暂停')time.sleep(5)device.xpath('//*[@content-desc="暂停"]').click()print('点击暂停')time.sleep(3)# 未播放时点击播放if device.xpath('//*[@resource-id="com.kugou.android:id/db51"]').exists and device.xpath('//*[@content-desc="播放"]').exists:print(5.2)device.xpath('//*[@content-desc="播放"]').click()print('点击播放')print(5.2)elif device.xpath('//*[@resource-id="com.kugou.android:id/db51"]').exists and device.xpath('//*[@content-desc="暂停"]').exists:print('睡5s 然后点击暂停')time.sleep(5)device.xpath('//*[@content-desc="暂停"]').click()print('点击暂停')# device.app_stop('com.kugou.android')except Exception as e:print('异常:')print(e)print()finally:# device.uiautomator.stop()  # 替代旧的 device.service("uiautomator").stop()# device.atx_agent.stop()  # 关闭设备端服务:ml-citation{ref="3,6" data="citationList"}time.sleep(1)  # 等待服务停止device.app_stop('com.kugou.android')time.sleep(1)  # 等待服务停止print("连接已关闭")for i in range(1,101):print(f'第{i}次,播放:')test_play_music()
http://www.lryc.cn/news/610307.html

相关文章:

  • Django集成图片验证码功能:基于django-simple-captcha实现
  • MySQL Router
  • Elasticsearch Ingest Pipeline 实现示例
  • C 语言枚举、typedef 与预处理详解
  • C语言的数组与字符串
  • AI产品经理面试宝典第61天:AI产品体验、数据安全与架构实战解析
  • 倒排索引:Elasticsearch 搜索背后的底层原理
  • 无公网环境下在centos7.9上使用kk工具部署k8s平台(amd64架构)
  • 数字信号处理_编程实例1
  • 【前端】JavaScript基础知识及基本应用
  • C++ STL list容器详解:从基础使用到高级特性
  • AI绘图-Stable Diffusion-WebUI的基本用法
  • SwiftUI ios开发中的 MVVM 架构深度解析与最佳实践
  • 深度学习零基础入门(4)-卷积神经网络架构
  • (JAVA)自建应用调用企业微信API接口,设置企业可信IP
  • 流量见顶时代,知识付费 IP 的破局逻辑
  • 汇川PLC通过ModbusTCP转Profinet网关连接西门子PLC配置案例
  • 飞算 JavaAI 实战:从代码生成到架构优化的全场景应用指南
  • 机试备考笔记 4/31
  • springboot博客实战笔记01
  • 登Nature子刊,基于基因测序和机器学习的废水流行病学评估,病毒检出时间最高提前4周
  • 机器学习(11):岭回归Ridge
  • 服务器的Mysql 集群技术
  • 经典设计模式
  • YOLO11涨点优化:原创自研DSAM注意力!基于BiLevelRoutingAttention的颠覆性升级
  • 06 基于sklearn的机械学习-欠拟合、过拟合、正则化、逻辑回归
  • Ethereum: 深度解析Web3世界的合规之门, ERC-1400证券型代币标准
  • ISCC认证:可持续生产的新标杆。ISCC如何更快认证
  • 线程互斥锁:守护临界区的关键
  • 服务器数据安全:利用阿里云OSS/腾讯云COS实现网站数据自动备份