3-1 u2自动化工具基本操作-操作设备
1. uiautomator2

import uiautomator2 as u2
import time
d = u2.connect_adb_wifi("192.168.0.100:5555")
# 查看状态
print(d.service("uiautomator").running())
# 启动服务
d.service("uiautomator").start()
time.sleep(2)
print(d.service("uiautomator").running())
#停止状态
d.service("uiautomator").stop()
time.sleep(2)
print(d.service("uiautomator").running())
#-------------------------------------------
already connected to 192.168.0.100:5555
True
True
False
2. ATX-agent
如果ATX-agent停止,可以通过connnect来唤醒ATX-agent


import uiautomator2 as u2
import time
d = u2.connect_adb_wifi("192.168.0.100:5555")
# 查看ATX-agent运行状态;如果停,可以通过connnect来唤醒ATX-agent
print(d.agent_alive)
# -------------------------------------------
True
# 查看设备信息
print(d.device_info)
# 查看设备的分辨率
print(d.window_size())
# 查看获取的wifi地址
print(d.wlan_ip) # 模拟器与真机不一致;
#-------------------------------------------------
{'udid': 'android-08:00:27:e9:1b:52-AOSP_on_Shama', 'version': '5.1.1', 'serial': 'android', 'brand': 'Android', 'model': 'AOSP on Shama', 'hwaddr': '08:00:27:e9:1b:52', 'port': 7912, 'sdk': 22, 'agentVersion': '0.9.5', 'display': {'width': 1080, 'height': 1920}, 'battery': {'acPowered': False, 'usbPowered': True, 'wirelessPowered': False, 'status': 2, 'health': 2, 'present': True, 'level': 87, 'scale': 100, 'voltage': 4, 'temperature': 26, 'technology': 'Li-ion'}, 'memory': {'total': 3110960, 'around': '3 GB'}, 'arch': '', 'owner': None, 'presenceChangedAt': '0001-01-01T00:00:00Z', 'usingBeganAt': '0001-01-01T00:00:00Z', 'product': None, 'provider': None}
(1080, 1920)
172.16.70.15
3-2 u2自动化工具基本操作-操作app
1. 安装apk与启动
# 1. url安装
import uiautomator2 as u2
d = u2.connect_wifi("192.168.0.100")
# 通过 app_install, urll= 'XXX.apk'
d.app_install(url="http://file.mukewang.com/apk/app/124/1606182011/imooc_7.4.4_10102001_android.apk")
# ------------------------------------
[D 201210 11:03:58 __init__:1291] pm install -rt /data/local/tmp/_tmp.apk
aapt dump badging imooc_7.4.4_10102001_android.apk
package: name='cn.com.open.mooc' versionCode='7440' versionName='7.4.4' platformBuildVersionName=''
# 启动app
d.app_start(package_name="cn.com.open.mooc")
print(d.app_current()) # 获取当前前台运行的app信息;
#--------------------------------
{'package': 'cn.com.open.mooc', 'activity': 'cn.com.open.mooc.component.user.activity.login.LoginActivity'}
# 停止 app ;
d.app_stop(package_name="cn.com.open.mooc")
# 获取app详细信息
print(d.app_info(package_name="cn.com.open.mooc"))
#--------------------------------
{'packageName': 'cn.com.open.mooc', 'mainActivity': 'com.imooc.component.imoocmain.splash.MCSplashActivity', 'label': '慕课网', 'versionName': '7.4.4', 'versionCode': 7440, 'size': 35948349}
# 清除app缓存
d.app_clear("cn.com.open.mooc")
# 卸载APP
d.app_uninstall("cn.com.open.mooc")
# 所有app_list
print(d.app_list())
# 在运行的app列表
print(d.app_list_running())
# 停止所有运行程序
d.app_stop_all()
# 卸载所有第三方的app;
d.app_uninstall_all()

3-3 APP activity和控件,weditor工具的安装
滑动、点击操作
1. activity和控件

控件
Android基础--------Android常用控件介绍及使用
https://blog.csdn.net/weixin_38423829/article/details/80566203

2. weditor工具的安装

3-4 weditor工具介绍和常见问题-1
启动
weditor
listening on http://192.168.0.103:17310


最重要的几步
1. 连接设备
有绿叶标志表示连接成功;

2. 开启 ATX启动
注意:1. 必须保证ATX-agent是启动的;
# 查看ATX启动状态1
import uiautomator2 as u2
d = u2.connect_wifi("192.168.0.100")
print(d.agent_alive) # True
查看ATX启动状态2

2. Linux下开启 ATX启动


3-5 weditor工具介绍和常见问题-2
不同的手机有不同的现象,
1. 关闭后台冻结和自动优化

2. 开启自启动
3-6 UiSelector和控件定位介绍
两种定位方法

1. UiSelector 介绍






控件


3-7 UiSelector文本定位方式
1. 文本定位四种方法

1. text全文匹配
import uiautomator2 as u2
d = u2.connect_wifi("192.168.0.100")
# aapt 与 weditor 获取包名
d.app_start(package_name='com.android.settings')
d(text="蓝牙").click()
2. 文本包含
d.app_start(package_name='com.android.settings')
d(textContains="通知").click()
3. 正则表达式
d.app_start(package_name='com.android.settings')
# d(textContains="通知").click()
d(textMatches=".{4}通知").click()
4. 起始文本
d.app_start(package_name='com.android.settings')
# d(textContains="通知").click()
# d(textMatches=".{4}通知").click()
d(textStartsWith="日期").click()
2. 描述信息定位

3-8 UiSelector className定位方式
1. 两种定位方式



className
需要注意层级关系
import uiautomator2 as u2
d = u2.connect_wifi("192.168.0.100")
# aapt 与 weditor 获取包名
d.app_start(package_name='com.android.settings')
d(className="android.widget.LinearLayout")[2].click()
classNameMatches
d.app_start(package_name='com.android.settings')
d(classNameMatches="android\.widget\.\w{12}", text="蓝牙")[2].click()
3-10 UiSelector resourceId定位方式
混合定位的方式
1. 通过资源ID来定位控件


resourceId(推荐使用)
通过资源ID来定位控件,通过索引来进行限定
import uiautomator2 as u2
d = u2.connect_wifi("192.168.0.100")
# aapt 与 weditor 获取包名
d.app_start(package_name='com.android.settings')
d(resourceId="com.android.settings:id/icon")[1].click()
# 通过实例来查找, 值 和 索引 是一样的
d.app_start(package_name='com.android.settings')
d(resourceId="com.android.settings:id/icon", instance=2).click()
# 通过其他条件进行限定;
d.app_start(package_name='com.android.settings')
d(resourceId="com.android.settings:id/icon", text="蓝牙").click()
resourceIdMatches
d.app_start(package_name='com.android.settings')
d(resourceIdMatches="com.android.settings:id\/\w{4}")[1].click()
3-11 UiSelector混合定位方式-1

1. 链式资源定位方式
先定位上级标签,
import uiautomator2 as u2
d = u2.connect_wifi("192.168.0.100")
# aapt 与 weditor 获取包名
d.app_start(package_name="com.android.settings")
d(className="android.view.View").child(text="蓝牙").click()
3-12 UiSelector混合定位方式-2
链式定位层级关系:几种定位方式可以混合;
d(className="android.widget.ListView").child(resourceId="oppo:id/oppo_preference")[2].click()
3-13 UiSelector 坐标定位方式
坐标点的展示方式 有两种:
- 原始坐标;
- 百分比坐标点

百分比坐标点定位
d.app_start(package_name="com.android.settings")
d.click(0.164, 0.248)
3-14 控件操作和操作超时
控件不存在时的异常处理机制
在5s内没有点击控件 抛出异常
# 在5s内没有点击控件 抛出异常
d.app_start(package_name="com.android.settings")
d(text="蓝牙").click(timeout=5)
# 在5s内没有点击控件 不抛出异常
d(text="蓝牙1").click_exists(timeout=5)
# 是否存在 属性
d.app_start(package_name="com.android.settings")
print(d(text="蓝牙1").exists)
print(d(text="蓝牙1").exists(timeout=5))
# 显示有多少个子节点;
d(resourceId="android:id/llist").count
3-15 通过U2实现移动设备九宫格解锁
1. 滑动解锁九宫格
手机基本操作
# 滑动解锁九宫格
d.screen_off() # 熄灭
d.screen_on() # 点亮屏幕
d.unlock() # 点亮
print(d.info.get("screenOn")) # 查看屏幕状态
返回
# 点home
d.press("home")
# 返回
d.press("back")
左右滑
import uiautomator2 as u2
d = u2.connect_wifi("192.168.0.100")
d.swipe_ext("left")


3-16 Xpath 和 Xpath定位方式

1. Xpath常用语法



import uiautomator2 as u2
d = u2.connect_wifi("192.168.0.100")
# with open("./phone.file", 'w', encoding="utf-8") as f:
# f.write(d.dump_hierarchy()) # 写资源
d.xpath('//*[@text="蓝牙"]').click()
2. 总结

3-17 实现自动化登录考研帮app并滑动资讯信息-1


实现代码
import uiautomator2 as u2
class HandleKaoyanbang(object):
def __init__(self, serial="192.168.0.100"):
self.d = u2.connect(serial)
self.size = self.get_windowsize()
self.handle_watcher()
def handle_watcher(self):
# 用户协议
self.d.watcher.when('//*[@resource-id="com.tal.kaoyan:id/tip_commit"]').click()
# 跳过广告
self.d.watcher.when('//*[@resource-id="com.tal.kaoyan:id/tv_skip"]').click()
# 监控器要 start启动
self.d.watcher.start()
def get_windowsize(self):
return self.d.window_size()
def close_app(self):
# 监控关闭
self.d.watcher.stop()
# 停止考研帮app
self.d.app_stop("com.tal.kaoyan")
# 清理缓存
self.d.app_clear("com.tal.kaoyan")
def handle_kaoyanbang_app(self):
self.d.app_start(package_name="com.tal.kaoyan")
self.d(text='密码登录').click_exists(timeout=10)
self.d(text="手机号/用户名/通行证").set_text('18326602330')
self.d.xpath('//*[@resource-id="com.tal.kaoyan:id/kylogin_unamelogin_operate_layout"]/android.widget.RelativeLayout[1]').set_text('*********')
self.d(resourceId="com.tal.kaoyan:id/login_login_btn").click_exists()
if self.d.wait_activity("com.tal.kaoyan.ui.activity.HomeTabActivity",timeout=10):
self.d(text="研讯").click_exists(timeout=10)
# 获取屏幕的中心点 x轴
# 获取到y轴远方点, 获取到y轴近点;
x1 = int(self.size[0]*0.5)
y1 = int(self.size[1]*0.9)
y2 = int(self.size[1]*0.15)
while True:
# get toast 信息提示操作;
if self.d.toast.get_message(0) == "内容已经全部加载完了":
self.close_app()
return
# 开始滑动研讯
self.d.swipe(x1, y1, x1, y2)
if __name__ == '__main__':
k = HandleKaoyanbang()
k.handle_kaoyanbang_app()
网友评论