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

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.xdnf.cn/news/17108.html

相关文章:

  • 进程生命周期管理:从创建到终止的完整逻辑
  • 探索医学领域多模态人工智能的发展图景:技术挑战与临床应用的范围综述|文献速递-医学影像算法文献分享
  • iOS 内测上架流程详解:跨平台团队如何快速部署 TestFlight
  • 注解知识学习
  • 凹槽类零部件尺寸的检测方法有哪些 - 激光频率梳 3D 轮廓检测
  • [硬件电路-156]:什么是电信号? 电信号的本质:电信号是随时间变化的电压或电流。本质是电子运动表征信息,兼具能量传输与信息编码传递功能。
  • Mac电脑基本功能快捷键
  • EdgeView for macOS:解决图像管理痛点的利器
  • 设计模式 -> 策略模式(Strategy Pattern)
  • 经典设计模式
  • 验证码等待时间技术在酒店自助入住、美容自助与社区场景中的应用必要性研究—仙盟创梦IDE
  • Calcite自定义扩展SQL案例详细流程篇
  • 六、Linux核心服务与包管理
  • 前端 拼多多4399笔试题目
  • [自动化Adapt] 录制引擎 | iframe 穿透 | NTP | AIOSQLite | 数据分片
  • Connection refused: no further information: localhost/127.0.0.1:2375
  • 第四章:OSPF 协议
  • ssh服务器端口和本地端口映射
  • [spring-cloud: 服务发现]-源码解析
  • 旧笔记本电脑如何安装飞牛OS
  • 电商系统定制开发流程:ZKmall开源商城需求分析到上线全程可控
  • MySQL深度理解-MySQL锁机制
  • 【Mysql】日志--错误日志、二进制日志、查询日志、慢查询日志
  • Shell脚本-变量的定义规则
  • LLM调研
  • 【QT】概述
  • Azure DevOps — Kubernetes 上的自托管代理 — 第 4 部分
  • 微分方程模型:用“变化率”的语言,描绘世间万物的动态演化
  • 前端面试手撕题目全解析
  • 2、docker容器命令 | 信息查看